From 83e344ba5ae28a63cf146822d1b42c59aca6dd47 Mon Sep 17 00:00:00 2001 From: koutyuke Date: Mon, 27 Oct 2025 09:31:40 +0900 Subject: [PATCH 01/21] =?UTF-8?q?=F0=9F=93=A6=EF=B8=8F=20build(biome):=20u?= =?UTF-8?q?pdate=20to=20biome=20v2=20and=20migrate=20configuration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 +- biome.jsonc | 128 ++++++++++++++++++++++++++++++++++++++++++ bun.lock | 20 +++---- package.json | 2 +- 4 files changed, 141 insertions(+), 12 deletions(-) create mode 100644 biome.jsonc diff --git a/.vscode/settings.json b/.vscode/settings.json index f7d1a0f5..5b2426ed 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -20,6 +20,7 @@ "[yaml]": { "editor.defaultFormatter": "redhat.vscode-yaml" }, + "biome.requireConfiguration": true, "commit-message-editor.dynamicTemplate": [ "{type}{scope}{breaking_change_exclamation}: {description}", "", @@ -157,7 +158,7 @@ ], "commit-message-editor.view.defaultView": "form", "editor.codeActionsOnSave": { - "quickfix.biome": "explicit", + "source.fixAll.biome": "explicit", "source.organizeImports.biome": "explicit" }, "editor.defaultFormatter": "biomejs.biome", diff --git a/biome.jsonc b/biome.jsonc new file mode 100644 index 00000000..723492b4 --- /dev/null +++ b/biome.jsonc @@ -0,0 +1,128 @@ +{ + "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", + "files": { + "includes": [ + "**/*.ts*", + "**/*.*js*", + "**/*.json*", + "!apps/api/src/core/infra/crypto/argon2id/bin", + "!apps/api/types" + ], + "ignoreUnknown": true + }, + "vcs": { + "clientKind": "git", + "enabled": true, + "useIgnoreFile": true + }, + "formatter": { + "formatWithErrors": false, + "lineWidth": 120 + }, + "assist": { + "actions": { + "source": { + "useSortedAttributes": "on", + "organizeImports": { + "level": "on", + "options": { + "groups": [ + { "type": false, "source": "cloudflare*" }, + { "type": false, "source": ":BUN:" }, + { "type": false, "source": ":NODE:" }, + { "type": false, "source": ["@mona-ca/**"] }, + { "type": false, "source": ":PACKAGE:" }, + { "type": false, "source": ":PATH:" }, + ":BLANK_LINE:", + { "type": true, "source": "cloudflare*" }, + { "type": true, "source": ":BUN:" }, + { "type": true, "source": ":NODE:" }, + { "type": true, "source": ["@mona-ca/**"] }, + { "type": true, "source": ":PACKAGE:" }, + { "type": true, "source": ":PATH:" } + ] + } + } + } + } + }, + "javascript": { + "formatter": { + "arrowParentheses": "asNeeded" + }, + "parser": { + "unsafeParameterDecoratorsEnabled": true + } + }, + "json": { + "formatter": { + "enabled": true, + "indentStyle": "space" + }, + "parser": { + "allowComments": true + } + }, + "linter": { + "rules": { + "complexity": { + "noForEach": "error", + "noUselessFragments": "error", + "useArrowFunction": "error" + }, + "nursery": { + "useSortedClasses": { + "level": "warn", + "options": { + "functions": ["tv", "twMerge", "cn", "clsx"] + } + }, + "noFloatingPromises": "error", + "noMisusedPromises": "error" + }, + "recommended": true, + "style": { + "noDefaultExport": "error", + "noNonNullAssertion": "off", + "useFilenamingConvention": { + "level": "error", + "options": { + "filenameCases": ["kebab-case"], + "requireAscii": true, + "strictCase": false + } + }, + "useImportType": { + "level": "on", + "options": { + "style": "separatedType" + } + } + }, + "suspicious": { + "noConsole": "warn" + } + } + }, + // It is not separated because biome cannot resolve it. ref: https://github.com/biomejs/biome/issues/7343 + "overrides": [ + { + "includes": [ + "**/*.story.*", + "**/*.config.*", + "**/.storybook/**", + "**/src/app/**/*.*", + + // api + "apps/api/src/routes/index.ts" + ], + "linter": { + "rules": { + "style": { + "noDefaultExport": "off" + } + } + } + } + ] +} diff --git a/bun.lock b/bun.lock index c9ee981e..846f1ebe 100644 --- a/bun.lock +++ b/bun.lock @@ -8,7 +8,7 @@ "@types/bun": "^1.2.1", }, "devDependencies": { - "@biomejs/biome": "1.9.4", + "@biomejs/biome": "2.2.7", "cross-env": "^7.0.3", "dotenv": "^16.4.7", "lefthook": "^1.10.10", @@ -612,23 +612,23 @@ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="], - "@biomejs/biome": ["@biomejs/biome@1.9.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "1.9.4", "@biomejs/cli-darwin-x64": "1.9.4", "@biomejs/cli-linux-arm64": "1.9.4", "@biomejs/cli-linux-arm64-musl": "1.9.4", "@biomejs/cli-linux-x64": "1.9.4", "@biomejs/cli-linux-x64-musl": "1.9.4", "@biomejs/cli-win32-arm64": "1.9.4", "@biomejs/cli-win32-x64": "1.9.4" }, "bin": { "biome": "bin/biome" } }, "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog=="], + "@biomejs/biome": ["@biomejs/biome@2.2.7", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.2.7", "@biomejs/cli-darwin-x64": "2.2.7", "@biomejs/cli-linux-arm64": "2.2.7", "@biomejs/cli-linux-arm64-musl": "2.2.7", "@biomejs/cli-linux-x64": "2.2.7", "@biomejs/cli-linux-x64-musl": "2.2.7", "@biomejs/cli-win32-arm64": "2.2.7", "@biomejs/cli-win32-x64": "2.2.7" }, "bin": { "biome": "bin/biome" } }, "sha512-1a8j0UP1vXVUf3UzMZEJ/zS2VgAG6wU6Cuh/I764sUGI+MCnJs/9WaojHYBDCxCMLTgU60/WqnYof85emXmSBA=="], - "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@1.9.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw=="], + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.2.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xBUUsebnO2/Qj1v7eZmKUy2ZcFkZ4/jLUkxN02Qup1RPoRaiW9AKXHrqS3L7iX6PzofHY2xuZ+Pb9kAcpoe0qA=="], - "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@1.9.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg=="], + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.2.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-vsY4NhmxqgfLJufr9XUnC+yGUPJiXAc1mz6FcjaAmuIuLwfghN4uQO7hnW2AneGyoi2mNe9Jbvf6Qtq4AjzrFg=="], - "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g=="], + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.2.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-nUdco104rjV9dULi1VssQ5R/kX2jE/Z2sDjyqS+siV9sTQda0DwmEUixFNRCWvZJRRiZUWhgiDFJ4n7RowO8Mg=="], - "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA=="], + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.2.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-FrTwvKO/7t5HbVTvhlMOTOVQLAcR7r4O4iFQhEpZXUtBfosHqrX/JJlX7daPawoe14MDcCu9CDg0zLVpTuDvuQ=="], - "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg=="], + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.2.7", "", { "os": "linux", "cpu": "x64" }, "sha512-tPTcGAIEOOZrj2tQ7fdraWlaxNKApBw6l4In8wQQV1IyxnAexqi0hykHzKEX8hKKctf5gxGBfNCzyIvqpj4CFQ=="], - "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg=="], + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.2.7", "", { "os": "linux", "cpu": "x64" }, "sha512-MnsysF5s/iLC5wnYvuMseOy+m8Pd4bWG1uwlVyy2AUbfjAVUgtbYbboc5wMXljFrDY7e6rLjLTR4S2xqDpGlQg=="], - "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@1.9.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg=="], + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.2.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-h5D1jhwA2b7cFXerYiJfXHSzzAMFFoEDL5Mc2BgiaEw0iaSgSso/3Nc6FbOR55aTQISql+IpB4PS7JoV26Gdbw=="], - "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@1.9.4", "", { "os": "win32", "cpu": "x64" }, "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA=="], + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.2.7", "", { "os": "win32", "cpu": "x64" }, "sha512-URqAJi0kONyBKG4V9NVafHLDtm6IHmF4qPYi/b6x7MD6jxpWeJiTCO6R5+xDlWckX2T/OGv6Yq3nkz6s0M8Ykw=="], "@borewit/text-codec": ["@borewit/text-codec@0.1.1", "", {}, "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA=="], diff --git a/package.json b/package.json index fc574c62..aec203ab 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@types/bun": "^1.2.1" }, "devDependencies": { - "@biomejs/biome": "1.9.4", + "@biomejs/biome": "2.2.7", "cross-env": "^7.0.3", "dotenv": "^16.4.7", "lefthook": "^1.10.10", From d72f115f7ae8d3829a227fe84082fa53f6542a45 Mon Sep 17 00:00:00 2001 From: koutyuke Date: Wed, 31 Dec 2025 23:38:57 +0900 Subject: [PATCH 02/21] =?UTF-8?q?=F0=9F=97=91=EF=B8=8F=20chore(biome):=20r?= =?UTF-8?q?emove=20obsolete=20biome.json=20and=20update=20configurations?= =?UTF-8?q?=20across=20projects=20to=20use=20biome.jsonc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/api/biome.json | 18 ++++- apps/catalog/biome.json | 17 +++- apps/mobile/biome.json | 16 +++- apps/web/biome.json | 16 +++- biome.json | 112 --------------------------- biome.jsonc | 91 ++++++++++++++++------ bun.lock | 20 ++--- package.json | 2 +- packages/argon2id/biome.json | 7 -- packages/argon2id/biome.jsonc | 7 ++ packages/core/biome.json | 2 +- packages/design-tokens/biome.json | 2 +- packages/tailwind-helpers/biome.json | 2 +- packages/treaty-fetch/biome.json | 2 +- packages/ui/biome.json | 2 +- tools/postcss/biome.json | 2 +- tools/tailwind-config/biome.json | 2 +- tools/tsconfig/biome.json | 2 +- 18 files changed, 157 insertions(+), 165 deletions(-) delete mode 100644 biome.json delete mode 100644 packages/argon2id/biome.json create mode 100644 packages/argon2id/biome.jsonc diff --git a/apps/api/biome.json b/apps/api/biome.json index 80676ceb..23a5da9b 100644 --- a/apps/api/biome.json +++ b/apps/api/biome.json @@ -1,4 +1,20 @@ { "$schema": "../../node_modules/@biomejs/biome/configuration_schema.json", - "extends": ["../../biome.json"] + "root": false, + "extends": "//", + "files": { + "includes": ["!apps/api/src/core/infra/crypto/argon2id/bin", "!apps/api/types", "!drizzle", "!types"] + }, + "overrides": [ + { + "includes": ["src/routes/index.ts"], + "linter": { + "rules": { + "style": { + "noDefaultExport": "off" + } + } + } + } + ] } diff --git a/apps/catalog/biome.json b/apps/catalog/biome.json index 80676ceb..947f51db 100644 --- a/apps/catalog/biome.json +++ b/apps/catalog/biome.json @@ -1,4 +1,19 @@ { "$schema": "../../node_modules/@biomejs/biome/configuration_schema.json", - "extends": ["../../biome.json"] + "extends": "//", + "files": { + "includes": ["!.rnstorybook/storybook.requires.ts"] + }, + "overrides": [ + { + "includes": ["**/*.d.ts", "src/app/**/*", ".storybook/**/*", ".rnstorybook/**/*"], + "linter": { + "rules": { + "style": { + "noDefaultExport": "off" + } + } + } + } + ] } diff --git a/apps/mobile/biome.json b/apps/mobile/biome.json index 80676ceb..0e1c04e8 100644 --- a/apps/mobile/biome.json +++ b/apps/mobile/biome.json @@ -1,4 +1,18 @@ { "$schema": "../../node_modules/@biomejs/biome/configuration_schema.json", - "extends": ["../../biome.json"] + "extends": "//", + "overrides": [ + { + "includes": [ + "src/apps/**/*" + ], + "linter": { + "rules": { + "style": { + "noDefaultExport": "off" + } + } + } + } + ] } diff --git a/apps/web/biome.json b/apps/web/biome.json index 80676ceb..0e1c04e8 100644 --- a/apps/web/biome.json +++ b/apps/web/biome.json @@ -1,4 +1,18 @@ { "$schema": "../../node_modules/@biomejs/biome/configuration_schema.json", - "extends": ["../../biome.json"] + "extends": "//", + "overrides": [ + { + "includes": [ + "src/apps/**/*" + ], + "linter": { + "rules": { + "style": { + "noDefaultExport": "off" + } + } + } + } + ] } diff --git a/biome.json b/biome.json deleted file mode 100644 index f180514e..00000000 --- a/biome.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", - "files": { - "ignore": [ - "node_modules", - "dist", - ".turbo", - ".next", - ".expo", - "bin", - ".tsup", - "./apps/api/drizzle", - "./apps/catalog/.rnstorybook/storybook.requires.ts", - "./apps/api/types/worker-configuration.d.ts", - "ios", - "android" - ], - "include": [ - "**/*.ts*", - "**/*.*js*", - "**/*.json" - ] - }, - "vcs": { - "clientKind": "git", - "enabled": true, - "useIgnoreFile": true - }, - "formatter": { - "formatWithErrors": false, - "lineWidth": 120 - }, - "javascript": { - "formatter": { - "arrowParentheses": "asNeeded" - }, - "parser": { - "unsafeParameterDecoratorsEnabled": true - } - }, - "json": { - "formatter": { - "enabled": true, - "indentStyle": "space" - }, - "parser": { - "allowComments": true - } - }, - "linter": { - "rules": { - "complexity": { - "noForEach": "off", - "noUselessConstructor": "off", - "noUselessFragments": "error", - "useArrowFunction": "error" - }, - "nursery": { - "useSortedClasses": { - "level": "warn", - "options": { - "functions": [ - "tv", - "twMerge", - "cn", - "clsx" - ] - } - } - }, - "recommended": true, - "style": { - "noDefaultExport": "error", - "noNonNullAssertion": "off", - "useFilenamingConvention": { - "level": "error", - "options": { - "filenameCases": [ - "kebab-case" - ], - "requireAscii": true, - "strictCase": false - } - } - }, - "suspicious": { - "noConsoleLog": "warn" - } - } - }, - "overrides": [ - { - "include": [ - "**/*.story.*", - "**/*.config.*", - "**/.storybook/**", - "**/src/app/**", - "apps/web/src/middleware.ts", - "./apps/api/src/routes/index.ts", - "./apps/catalog/.rnstorybook/**", - "./apps/catalog/.storybook/**" - ], - "linter": { - "rules": { - "style": { - "noDefaultExport": "off" - } - } - } - } - ] -} diff --git a/biome.jsonc b/biome.jsonc index 723492b4..50ca5e8c 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -1,12 +1,15 @@ { "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", + "root": true, "files": { "includes": [ + "**", + "!!**/.storybook/static", + "!!**/.wrangler", + "!**/bin", "**/*.ts*", "**/*.*js*", - "**/*.json*", - "!apps/api/src/core/infra/crypto/argon2id/bin", - "!apps/api/types" + "**/*.json*" ], "ignoreUnknown": true }, @@ -27,19 +30,59 @@ "level": "on", "options": { "groups": [ - { "type": false, "source": "cloudflare*" }, - { "type": false, "source": ":BUN:" }, - { "type": false, "source": ":NODE:" }, - { "type": false, "source": ["@mona-ca/**"] }, - { "type": false, "source": ":PACKAGE:" }, - { "type": false, "source": ":PATH:" }, + { + "type": false, + "source": "cloudflare*" + }, + { + "type": false, + "source": ":BUN:" + }, + { + "type": false, + "source": ":NODE:" + }, + { + "type": false, + "source": [ + "@mona-ca/**" + ] + }, + { + "type": false, + "source": ":PACKAGE:" + }, + { + "type": false, + "source": ":PATH:" + }, ":BLANK_LINE:", - { "type": true, "source": "cloudflare*" }, - { "type": true, "source": ":BUN:" }, - { "type": true, "source": ":NODE:" }, - { "type": true, "source": ["@mona-ca/**"] }, - { "type": true, "source": ":PACKAGE:" }, - { "type": true, "source": ":PATH:" } + { + "type": true, + "source": "cloudflare*" + }, + { + "type": true, + "source": ":BUN:" + }, + { + "type": true, + "source": ":NODE:" + }, + { + "type": true, + "source": [ + "@mona-ca/**" + ] + }, + { + "type": true, + "source": ":PACKAGE:" + }, + { + "type": true, + "source": ":PATH:" + } ] } } @@ -74,7 +117,12 @@ "useSortedClasses": { "level": "warn", "options": { - "functions": ["tv", "twMerge", "cn", "clsx"] + "functions": [ + "tv", + "twMerge", + "cn", + "clsx" + ] } }, "noFloatingPromises": "error", @@ -87,7 +135,9 @@ "useFilenamingConvention": { "level": "error", "options": { - "filenameCases": ["kebab-case"], + "filenameCases": [ + "kebab-case" + ], "requireAscii": true, "strictCase": false } @@ -109,12 +159,7 @@ { "includes": [ "**/*.story.*", - "**/*.config.*", - "**/.storybook/**", - "**/src/app/**/*.*", - - // api - "apps/api/src/routes/index.ts" + "**/*.config.*" ], "linter": { "rules": { diff --git a/bun.lock b/bun.lock index 846f1ebe..d7538a33 100644 --- a/bun.lock +++ b/bun.lock @@ -8,7 +8,7 @@ "@types/bun": "^1.2.1", }, "devDependencies": { - "@biomejs/biome": "2.2.7", + "@biomejs/biome": "2.3.10", "cross-env": "^7.0.3", "dotenv": "^16.4.7", "lefthook": "^1.10.10", @@ -612,23 +612,23 @@ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="], - "@biomejs/biome": ["@biomejs/biome@2.2.7", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.2.7", "@biomejs/cli-darwin-x64": "2.2.7", "@biomejs/cli-linux-arm64": "2.2.7", "@biomejs/cli-linux-arm64-musl": "2.2.7", "@biomejs/cli-linux-x64": "2.2.7", "@biomejs/cli-linux-x64-musl": "2.2.7", "@biomejs/cli-win32-arm64": "2.2.7", "@biomejs/cli-win32-x64": "2.2.7" }, "bin": { "biome": "bin/biome" } }, "sha512-1a8j0UP1vXVUf3UzMZEJ/zS2VgAG6wU6Cuh/I764sUGI+MCnJs/9WaojHYBDCxCMLTgU60/WqnYof85emXmSBA=="], + "@biomejs/biome": ["@biomejs/biome@2.3.10", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.3.10", "@biomejs/cli-darwin-x64": "2.3.10", "@biomejs/cli-linux-arm64": "2.3.10", "@biomejs/cli-linux-arm64-musl": "2.3.10", "@biomejs/cli-linux-x64": "2.3.10", "@biomejs/cli-linux-x64-musl": "2.3.10", "@biomejs/cli-win32-arm64": "2.3.10", "@biomejs/cli-win32-x64": "2.3.10" }, "bin": { "biome": "bin/biome" } }, "sha512-/uWSUd1MHX2fjqNLHNL6zLYWBbrJeG412/8H7ESuK8ewoRoMPUgHDebqKrPTx/5n6f17Xzqc9hdg3MEqA5hXnQ=="], - "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.2.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xBUUsebnO2/Qj1v7eZmKUy2ZcFkZ4/jLUkxN02Qup1RPoRaiW9AKXHrqS3L7iX6PzofHY2xuZ+Pb9kAcpoe0qA=="], + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.3.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-M6xUjtCVnNGFfK7HMNKa593nb7fwNm43fq1Mt71kpLpb+4mE7odO8W/oWVDyBVO4ackhresy1ZYO7OJcVo/B7w=="], - "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.2.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-vsY4NhmxqgfLJufr9XUnC+yGUPJiXAc1mz6FcjaAmuIuLwfghN4uQO7hnW2AneGyoi2mNe9Jbvf6Qtq4AjzrFg=="], + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.3.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-Vae7+V6t/Avr8tVbFNjnFSTKZogZHFYl7MMH62P/J1kZtr0tyRQ9Fe0onjqjS2Ek9lmNLmZc/VR5uSekh+p1fg=="], - "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.2.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-nUdco104rjV9dULi1VssQ5R/kX2jE/Z2sDjyqS+siV9sTQda0DwmEUixFNRCWvZJRRiZUWhgiDFJ4n7RowO8Mg=="], + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.3.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-hhPw2V3/EpHKsileVOFynuWiKRgFEV48cLe0eA+G2wO4SzlwEhLEB9LhlSrVeu2mtSn205W283LkX7Fh48CaxA=="], - "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.2.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-FrTwvKO/7t5HbVTvhlMOTOVQLAcR7r4O4iFQhEpZXUtBfosHqrX/JJlX7daPawoe14MDcCu9CDg0zLVpTuDvuQ=="], + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.3.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-B9DszIHkuKtOH2IFeeVkQmSMVUjss9KtHaNXquYYWCjH8IstNgXgx5B0aSBQNr6mn4RcKKRQZXn9Zu1rM3O0/A=="], - "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.2.7", "", { "os": "linux", "cpu": "x64" }, "sha512-tPTcGAIEOOZrj2tQ7fdraWlaxNKApBw6l4In8wQQV1IyxnAexqi0hykHzKEX8hKKctf5gxGBfNCzyIvqpj4CFQ=="], + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.3.10", "", { "os": "linux", "cpu": "x64" }, "sha512-wwAkWD1MR95u+J4LkWP74/vGz+tRrIQvr8kfMMJY8KOQ8+HMVleREOcPYsQX82S7uueco60L58Wc6M1I9WA9Dw=="], - "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.2.7", "", { "os": "linux", "cpu": "x64" }, "sha512-MnsysF5s/iLC5wnYvuMseOy+m8Pd4bWG1uwlVyy2AUbfjAVUgtbYbboc5wMXljFrDY7e6rLjLTR4S2xqDpGlQg=="], + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.3.10", "", { "os": "linux", "cpu": "x64" }, "sha512-QTfHZQh62SDFdYc2nfmZFuTm5yYb4eO1zwfB+90YxUumRCR171tS1GoTX5OD0wrv4UsziMPmrePMtkTnNyYG3g=="], - "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.2.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-h5D1jhwA2b7cFXerYiJfXHSzzAMFFoEDL5Mc2BgiaEw0iaSgSso/3Nc6FbOR55aTQISql+IpB4PS7JoV26Gdbw=="], + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.3.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-o7lYc9n+CfRbHvkjPhm8s9FgbKdYZu5HCcGVMItLjz93EhgJ8AM44W+QckDqLA9MKDNFrR8nPbO4b73VC5kGGQ=="], - "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.2.7", "", { "os": "win32", "cpu": "x64" }, "sha512-URqAJi0kONyBKG4V9NVafHLDtm6IHmF4qPYi/b6x7MD6jxpWeJiTCO6R5+xDlWckX2T/OGv6Yq3nkz6s0M8Ykw=="], + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.10", "", { "os": "win32", "cpu": "x64" }, "sha512-pHEFgq7dUEsKnqG9mx9bXihxGI49X+ar+UBrEIj3Wqj3UCZp1rNgV+OoyjFgcXsjCWpuEAF4VJdkZr3TrWdCbQ=="], "@borewit/text-codec": ["@borewit/text-codec@0.1.1", "", {}, "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA=="], diff --git a/package.json b/package.json index aec203ab..5580f079 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@types/bun": "^1.2.1" }, "devDependencies": { - "@biomejs/biome": "2.2.7", + "@biomejs/biome": "2.3.10", "cross-env": "^7.0.3", "dotenv": "^16.4.7", "lefthook": "^1.10.10", diff --git a/packages/argon2id/biome.json b/packages/argon2id/biome.json deleted file mode 100644 index cead6dfc..00000000 --- a/packages/argon2id/biome.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "../../node_modules/@biomejs/biome/configuration_schema.json", - "extends": ["../../biome.json"], - "files": { - "ignore": ["bin/**", "pkg/**"] - } -} diff --git a/packages/argon2id/biome.jsonc b/packages/argon2id/biome.jsonc new file mode 100644 index 00000000..6e00a4ed --- /dev/null +++ b/packages/argon2id/biome.jsonc @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/@biomejs/biome/configuration_schema.json", + "extends": "//" + // "files": { + // "ignore": ["bin/**", "pkg/**"] + // } +} diff --git a/packages/core/biome.json b/packages/core/biome.json index 80676ceb..ff4fc906 100644 --- a/packages/core/biome.json +++ b/packages/core/biome.json @@ -1,4 +1,4 @@ { "$schema": "../../node_modules/@biomejs/biome/configuration_schema.json", - "extends": ["../../biome.json"] + "extends": "//" } diff --git a/packages/design-tokens/biome.json b/packages/design-tokens/biome.json index 80676ceb..ff4fc906 100644 --- a/packages/design-tokens/biome.json +++ b/packages/design-tokens/biome.json @@ -1,4 +1,4 @@ { "$schema": "../../node_modules/@biomejs/biome/configuration_schema.json", - "extends": ["../../biome.json"] + "extends": "//" } diff --git a/packages/tailwind-helpers/biome.json b/packages/tailwind-helpers/biome.json index 80676ceb..ff4fc906 100644 --- a/packages/tailwind-helpers/biome.json +++ b/packages/tailwind-helpers/biome.json @@ -1,4 +1,4 @@ { "$schema": "../../node_modules/@biomejs/biome/configuration_schema.json", - "extends": ["../../biome.json"] + "extends": "//" } diff --git a/packages/treaty-fetch/biome.json b/packages/treaty-fetch/biome.json index 80676ceb..ff4fc906 100644 --- a/packages/treaty-fetch/biome.json +++ b/packages/treaty-fetch/biome.json @@ -1,4 +1,4 @@ { "$schema": "../../node_modules/@biomejs/biome/configuration_schema.json", - "extends": ["../../biome.json"] + "extends": "//" } diff --git a/packages/ui/biome.json b/packages/ui/biome.json index 80676ceb..ff4fc906 100644 --- a/packages/ui/biome.json +++ b/packages/ui/biome.json @@ -1,4 +1,4 @@ { "$schema": "../../node_modules/@biomejs/biome/configuration_schema.json", - "extends": ["../../biome.json"] + "extends": "//" } diff --git a/tools/postcss/biome.json b/tools/postcss/biome.json index 80676ceb..ff4fc906 100644 --- a/tools/postcss/biome.json +++ b/tools/postcss/biome.json @@ -1,4 +1,4 @@ { "$schema": "../../node_modules/@biomejs/biome/configuration_schema.json", - "extends": ["../../biome.json"] + "extends": "//" } diff --git a/tools/tailwind-config/biome.json b/tools/tailwind-config/biome.json index 80676ceb..ff4fc906 100644 --- a/tools/tailwind-config/biome.json +++ b/tools/tailwind-config/biome.json @@ -1,4 +1,4 @@ { "$schema": "../../node_modules/@biomejs/biome/configuration_schema.json", - "extends": ["../../biome.json"] + "extends": "//" } diff --git a/tools/tsconfig/biome.json b/tools/tsconfig/biome.json index 80676ceb..ff4fc906 100644 --- a/tools/tsconfig/biome.json +++ b/tools/tsconfig/biome.json @@ -1,4 +1,4 @@ { "$schema": "../../node_modules/@biomejs/biome/configuration_schema.json", - "extends": ["../../biome.json"] + "extends": "//" } From 41fe55347f248f584b57b9a40755b48972c7d1ad Mon Sep 17 00:00:00 2001 From: koutyuke Date: Wed, 31 Dec 2025 23:43:06 +0900 Subject: [PATCH 03/21] =?UTF-8?q?=F0=9F=94=A7=20chore(catalog):=20apply=20?= =?UTF-8?q?new=20lint=20rule?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/catalog/.rnstorybook/main.ts | 1 + apps/catalog/.storybook/global.css | 2 +- apps/catalog/.storybook/main.ts | 1 + apps/catalog/.storybook/preview.ts | 3 ++- apps/catalog/src/app/_layout.tsx | 2 +- apps/catalog/src/app/global.css | 2 +- apps/catalog/src/app/index.tsx | 4 +++- apps/catalog/tailwind.config.ts | 1 + apps/catalog/types/declarations.d.ts | 1 - 9 files changed, 11 insertions(+), 6 deletions(-) diff --git a/apps/catalog/.rnstorybook/main.ts b/apps/catalog/.rnstorybook/main.ts index 39d375cb..36d3c7e3 100644 --- a/apps/catalog/.rnstorybook/main.ts +++ b/apps/catalog/.rnstorybook/main.ts @@ -1,5 +1,6 @@ import { createRequire } from "node:module"; import { dirname, join } from "node:path"; + import type { StorybookConfig } from "@storybook/react-native"; const require = createRequire(import.meta.url); diff --git a/apps/catalog/.storybook/global.css b/apps/catalog/.storybook/global.css index 70212051..cd233ad9 100644 --- a/apps/catalog/.storybook/global.css +++ b/apps/catalog/.storybook/global.css @@ -1 +1 @@ -@import '@mona-ca/tailwind-config/global.css'; +@import "@mona-ca/tailwind-config/global.css"; diff --git a/apps/catalog/.storybook/main.ts b/apps/catalog/.storybook/main.ts index 00453007..ebcd7e0d 100644 --- a/apps/catalog/.storybook/main.ts +++ b/apps/catalog/.storybook/main.ts @@ -1,6 +1,7 @@ import { createRequire } from "node:module"; import path, { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; + import type { StorybookConfig } from "@storybook/react-webpack5"; const require = createRequire(import.meta.url); diff --git a/apps/catalog/.storybook/preview.ts b/apps/catalog/.storybook/preview.ts index ba3380a5..1eb2d4e2 100644 --- a/apps/catalog/.storybook/preview.ts +++ b/apps/catalog/.storybook/preview.ts @@ -1,8 +1,9 @@ import { withThemeByClassName, withThemeByDataAttribute } from "@storybook/addon-themes"; -import type { Preview } from "@storybook/react"; import { INITIAL_VIEWPORTS } from "storybook/viewport"; import "./global.css"; +import type { Preview } from "@storybook/react"; + const DEFAULT_THEME = "light"; const BACKGROUND_CSS_VALUE = "var(--color-slate-1)"; const ATTRIBUTE_NAME = "data-theme"; diff --git a/apps/catalog/src/app/_layout.tsx b/apps/catalog/src/app/_layout.tsx index ccb0effe..60ec1a8d 100644 --- a/apps/catalog/src/app/_layout.tsx +++ b/apps/catalog/src/app/_layout.tsx @@ -2,11 +2,11 @@ import { Stack } from "expo-router"; import * as SplashScreen from "expo-splash-screen"; import { Provider as JotaiProvider } from "jotai"; import { useEffect } from "react"; +import { View } from "react-native"; import { ThemeProvider } from "../../../mobile/src/layers/app/providers"; import "react-native-reanimated"; import "./global.css"; -import { View } from "react-native"; // Prevent the splash screen from auto-hiding before asset loading is complete. SplashScreen.preventAutoHideAsync(); diff --git a/apps/catalog/src/app/global.css b/apps/catalog/src/app/global.css index 70212051..cd233ad9 100644 --- a/apps/catalog/src/app/global.css +++ b/apps/catalog/src/app/global.css @@ -1 +1 @@ -@import '@mona-ca/tailwind-config/global.css'; +@import "@mona-ca/tailwind-config/global.css"; diff --git a/apps/catalog/src/app/index.tsx b/apps/catalog/src/app/index.tsx index 0adb7a40..e6b4b3c2 100644 --- a/apps/catalog/src/app/index.tsx +++ b/apps/catalog/src/app/index.tsx @@ -1,8 +1,10 @@ -import { type FC, useEffect } from "react"; +import { useEffect } from "react"; import { Text, View } from "react-native"; import { useTheme } from "../../../mobile/src/layers/entities/theme"; import StoryBookRoot from "../../.rnstorybook"; +import type { FC } from "react"; + const isStoryBookEnabled = process.env.EXPO_PUBLIC_STORYBOOK_ENABLED === "true"; const Home: FC = () => { diff --git a/apps/catalog/tailwind.config.ts b/apps/catalog/tailwind.config.ts index 9edda41f..8eb896ab 100644 --- a/apps/catalog/tailwind.config.ts +++ b/apps/catalog/tailwind.config.ts @@ -1,4 +1,5 @@ import { baseConfig } from "@mona-ca/tailwind-config"; + import type { Config } from "tailwindcss"; const nativewindConfig = require("nativewind/preset"); diff --git a/apps/catalog/types/declarations.d.ts b/apps/catalog/types/declarations.d.ts index 4152ef04..6f73d5fc 100644 --- a/apps/catalog/types/declarations.d.ts +++ b/apps/catalog/types/declarations.d.ts @@ -2,6 +2,5 @@ declare module "*.svg" { import type React from "react"; import type { SvgProps } from "react-native-svg"; const content: React.FC; - // biome-ignore lint/style/noDefaultExport: export default content; } From df4c0ed91dd24db435504c538a595cf803706c70 Mon Sep 17 00:00:00 2001 From: koutyuke Date: Wed, 31 Dec 2025 23:45:09 +0900 Subject: [PATCH 04/21] =?UTF-8?q?=F0=9F=94=A7=20chore(lefthook):=20simplif?= =?UTF-8?q?y=20biome=20check=20command=20by=20removing=20unnecessary=20con?= =?UTF-8?q?fig=20path?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lefthook.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lefthook.yml b/lefthook.yml index ed1d6518..28b98319 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -2,5 +2,5 @@ pre-commit: commands: check: glob: "*.{js,ts,jsx,tsx}" - run: bun biome check --write --no-errors-on-unmatched --files-ignore-unknown=true --config-path ./biome.json {staged_files} + run: bun biome check --write --no-errors-on-unmatched --files-ignore-unknown=true {staged_files} stage_fixed: true From 0c8a700703aeacead5b691fe431c63d38f12e6f9 Mon Sep 17 00:00:00 2001 From: koutyuke Date: Wed, 31 Dec 2025 23:50:36 +0900 Subject: [PATCH 05/21] =?UTF-8?q?=F0=9F=97=91=EF=B8=8F=20chore(biome):=20r?= =?UTF-8?q?emove=20outdated=20comment=20regarding=20biome=20resolution=20i?= =?UTF-8?q?n=20biome.jsonc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- biome.jsonc | 1 - 1 file changed, 1 deletion(-) diff --git a/biome.jsonc b/biome.jsonc index 50ca5e8c..0e05d650 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -154,7 +154,6 @@ } } }, - // It is not separated because biome cannot resolve it. ref: https://github.com/biomejs/biome/issues/7343 "overrides": [ { "includes": [ From 3c9202684781e855691ad6f36494708818ad64b9 Mon Sep 17 00:00:00 2001 From: koutyuke Date: Wed, 31 Dec 2025 23:54:22 +0900 Subject: [PATCH 06/21] =?UTF-8?q?=F0=9F=94=A7=20chore(auth):=20update=20va?= =?UTF-8?q?rious=20email=20and=20user=20profile=20handling=20components,?= =?UTF-8?q?=20including=20type=20exports=20and=20repository=20adjustments?= =?UTF-8?q?=20for=20improved=20clarity=20and=20functionality?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapters/gateways/email/email.gateway.ts | 8 ++++--- .../gateways/email/mail-context/index.ts | 1 + .../email/mail-context/verification.ts | 1 + apps/api/src/core/di/container.ts | 3 ++- apps/api/src/core/di/index.ts | 3 ++- .../domain/value-objects/client-platform.ts | 3 ++- .../src/core/domain/value-objects/gender.ts | 3 ++- .../src/core/domain/value-objects/index.ts | 16 ++++++------- apps/api/src/core/infra/config/env/env.ts | 3 ++- apps/api/src/core/infra/config/env/index.ts | 22 +++++++++--------- .../src/core/infra/config/env/validation.ts | 2 ++ .../infra/crypto/argon2id/argon2id.service.ts | 3 ++- .../infra/crypto/crypto-random.service.ts | 3 ++- .../core/infra/crypto/hmac-sha-256.service.ts | 1 + apps/api/src/core/infra/crypto/index.ts | 6 ++--- .../infra/crypto/password-hashing.service.ts | 3 ++- .../core/infra/crypto/token-secret.service.ts | 1 + .../src/core/infra/drizzle/drizzle.service.ts | 3 ++- .../src/core/infra/drizzle/schema/index.ts | 10 ++++---- apps/api/src/core/lib/encoding/index.ts | 2 +- apps/api/src/core/lib/http/index.ts | 4 ++-- apps/api/src/core/lib/types/index.ts | 3 ++- apps/api/src/core/lib/types/schema.ts | 4 +++- apps/api/src/core/ports/gateways/index.ts | 4 ++-- apps/api/src/core/ports/system/index.ts | 4 ++-- apps/api/src/core/testing/drivers/index.ts | 4 ++-- .../src/core/testing/mocks/system/index.ts | 2 +- .../mocks/system/token-secret.service.mock.ts | 1 + .../identity-provider/discord.gateway.ts | 7 ++++-- .../identity-provider/google.gateway.ts | 10 +++++--- .../auth-user/auth-user.repository.ts | 4 +++- .../password-reset-session/tests/save.test.ts | 2 +- .../provider-account.repository.ts | 11 ++++----- .../find-by-provider-and-provider-id.test.ts | 3 ++- .../provider-account/tests/save.test.ts | 3 ++- .../provider-link-request.repository.ts | 3 ++- .../tests/verify-email.usecase.test.ts | 6 ++--- .../tests/request.usecase.test.ts | 2 +- .../tests/validate-request.usecase.test.ts | 2 +- .../tests/verify-email.usecase.test.ts | 2 +- .../federated-auth/callback.usecase.ts | 10 ++++---- .../federated-auth/request.usecase.ts | 12 ++++------ .../tests/callback.usecase.test.ts | 9 ++++---- .../tests/request.usecase.test.ts | 1 + .../tests/request.usecase.test.ts | 2 +- .../tests/reset.usecase.test.ts | 4 ++-- .../tests/validate-session.usecase.test.ts | 4 ++-- .../tests/verify-email.usecase.test.ts | 4 ++-- .../provider-link/prepare.usecase.ts | 11 +++++---- .../provider-link/request.usecase.ts | 12 ++++------ .../tests/callback.usecase.test.ts | 7 +++--- .../tests/prepare.usecase.test.ts | 2 +- .../tests/request.usecase.test.ts | 1 + .../tests/unlink.usecase.test.ts | 2 +- .../tests/validate-request.usecase.test.ts | 4 ++-- .../provider-link/validate-request.usecase.ts | 6 +++-- .../session/tests/login.usecase.test.ts | 2 +- .../session/tests/logout.usecase.test.ts | 2 +- .../tests/update-password.usecase.test.ts | 2 +- .../tests/user-identities.usecase.test.ts | 2 +- .../tests/validate-session.usecase.test.ts | 2 +- .../session/user-identities.usecase.ts | 8 +++---- .../use-cases/signup/register.usecase.ts | 2 +- .../signup/tests/register.usecase.test.ts | 6 ++--- .../signup/tests/request.usecase.test.ts | 2 +- .../tests/validate-session.usecase.test.ts | 2 +- .../signup/tests/verify-email.usecase.test.ts | 4 ++-- .../tests/request.usecase.test.ts | 2 +- .../tests/verify-email.usecase.test.ts | 4 ++-- .../domain/entities/account-link-request.ts | 3 ++- .../entities/email-verification-request.ts | 3 ++- .../domain/entities/password-reset-session.ts | 3 ++- .../domain/entities/provider-link-request.ts | 3 ++- .../features/auth/domain/entities/session.ts | 9 +++----- .../auth/domain/entities/signup-session.ts | 1 + .../auth/domain/entities/user-registration.ts | 4 +++- .../value-objects/identity-providers.ts | 3 ++- apps/api/src/features/auth/index.ts | 8 +++---- .../hmac-signed-state.service.test.ts | 5 ++-- .../hmac-signed-state.service.ts | 7 ++++-- .../api/src/features/auth/lib/redirect-url.ts | 1 + .../features/auth/testing/converters/index.ts | 14 +++++------ .../converters/table-raw-converters.ts | 23 +++++++++---------- .../fixtures/account-link-request.fixture.ts | 7 ++++-- .../testing/fixtures/auth-user.fixture.ts | 1 + .../email-verification-request.fixture.ts | 10 ++++---- .../features/auth/testing/fixtures/index.ts | 6 ++--- .../password-reset-session.fixture.ts | 10 ++++---- .../fixtures/provider-account.fixture.ts | 3 ++- .../fixtures/provider-link-request.fixture.ts | 7 ++++-- .../auth/testing/fixtures/session.fixture.ts | 7 ++++-- .../fixtures/signup-session.fixture.ts | 7 ++++-- .../identity-provider.gateway.mock.ts | 5 ++-- .../infra/hmac-signed-state.service.mock.ts | 4 +++- .../account-link-request.repository.mock.ts | 4 +++- ...il-verification-request.repository.mock.ts | 7 +++--- .../auth/testing/mocks/repositories/index.ts | 11 ++++----- .../provider-link-request.repository.mock.ts | 4 +++- .../user-profile/tests/save.test.ts | 5 ++-- .../user-profile/user-profile.repository.ts | 4 +++- .../user-profile/get-user-profile.usecase.ts | 1 + .../tests/get-user-profile.usecase.test.ts | 2 +- .../tests/update-user-profile.usecase.test.ts | 2 +- .../update-user-profile.usecase.ts | 4 ++-- apps/api/src/features/user/index.ts | 4 ++-- .../user/testing/converters/converters.ts | 3 ++- .../testing/fixtures/user-profile.fixture.ts | 1 + .../user/testing/mocks/repositories/index.ts | 2 +- apps/api/src/plugins/auth/auth.plugin.ts | 10 ++++---- .../auth/tests/session-cookie-refresh.test.ts | 2 +- .../src/plugins/container/container.plugin.ts | 18 +++++++-------- apps/api/src/plugins/openapi/path-detail.ts | 1 + .../src/plugins/openapi/security-scheme.ts | 1 + .../src/plugins/ratelimit/ratelimit.plugin.ts | 4 +++- .../auth/federated-auth/callback.route.ts | 2 +- .../src/routes/auth/signup/register.route.ts | 3 +-- apps/api/src/routes/index.ts | 5 ++-- .../src/routes/users/me/email/verify.route.ts | 3 +-- .../me/identities/federated/callback.route.ts | 2 +- .../routes/users/me/profile/update.route.ts | 4 +++- 120 files changed, 323 insertions(+), 249 deletions(-) diff --git a/apps/api/src/core/adapters/gateways/email/email.gateway.ts b/apps/api/src/core/adapters/gateways/email/email.gateway.ts index db38705c..2973415b 100644 --- a/apps/api/src/core/adapters/gateways/email/email.gateway.ts +++ b/apps/api/src/core/adapters/gateways/email/email.gateway.ts @@ -1,8 +1,10 @@ import { render } from "@react-email/render"; +import { Resend } from "resend"; +import { verificationEmailTemplate } from "./mail-context"; + import type { ReactElement } from "react"; -import { type CreateEmailOptions, type CreateEmailRequestOptions, type CreateEmailResponse, Resend } from "resend"; +import type { CreateEmailOptions, CreateEmailRequestOptions, CreateEmailResponse } from "resend"; import type { IEmailGateway } from "../../../ports/gateways"; -import { verificationEmailTemplate } from "./mail-context"; import type { EmailRenderOptions, RequireAtLeastOne } from "./type"; export class EmailGateway implements IEmailGateway { @@ -23,7 +25,7 @@ export class EmailGateway implements IEmailGateway { } const contents = await this.render(payload); - // biome-ignore lint/suspicious/noConsoleLog: + // biome-ignore lint/suspicious/noConsole: Development mode logging for email preview console.log( "[Email: Development] Email will not be sent. Email content is as follows:\n\n", `to: ${payload.to}\n`, diff --git a/apps/api/src/core/adapters/gateways/email/mail-context/index.ts b/apps/api/src/core/adapters/gateways/email/mail-context/index.ts index c599dbe4..a2d1e989 100644 --- a/apps/api/src/core/adapters/gateways/email/mail-context/index.ts +++ b/apps/api/src/core/adapters/gateways/email/mail-context/index.ts @@ -1,2 +1,3 @@ export { verificationEmailTemplate } from "./verification"; + export type { EmailContext } from "./type"; diff --git a/apps/api/src/core/adapters/gateways/email/mail-context/verification.ts b/apps/api/src/core/adapters/gateways/email/mail-context/verification.ts index b47e39da..63f29ea1 100644 --- a/apps/api/src/core/adapters/gateways/email/mail-context/verification.ts +++ b/apps/api/src/core/adapters/gateways/email/mail-context/verification.ts @@ -1,4 +1,5 @@ import { DEFAULT_EMAIL_ADDRESS } from "@mona-ca/core/email"; + import type { EmailContext } from "./type"; export const verificationEmailTemplate = (email: string, code: string): EmailContext => { diff --git a/apps/api/src/core/di/container.ts b/apps/api/src/core/di/container.ts index 30f553bd..976fd21d 100644 --- a/apps/api/src/core/di/container.ts +++ b/apps/api/src/core/di/container.ts @@ -1,8 +1,9 @@ import { EmailGateway } from "../adapters/gateways/email"; import { TurnstileGateway } from "../adapters/gateways/turnstile"; -import type { CloudflareBindings, EnvVariables } from "../infra/config/env"; import { CryptoRandomService, HmacSha256Service, PasswordHashingService, TokenSecretService } from "../infra/crypto"; import { DrizzleService } from "../infra/drizzle"; + +import type { CloudflareBindings, EnvVariables } from "../infra/config/env"; import type { IEmailGateway, ITurnstileGateway } from "../ports/gateways"; import type { ICryptoRandomService, IHmacService, IPasswordHashingService, ITokenSecretService } from "../ports/system"; import type { ICoreDIContainer } from "./container.interface"; diff --git a/apps/api/src/core/di/index.ts b/apps/api/src/core/di/index.ts index bc07f12f..e66601fb 100644 --- a/apps/api/src/core/di/index.ts +++ b/apps/api/src/core/di/index.ts @@ -1,2 +1,3 @@ -export type { ICoreDIContainer } from "./container.interface"; export { CoreDIContainer } from "./container"; + +export type { ICoreDIContainer } from "./container.interface"; diff --git a/apps/api/src/core/domain/value-objects/client-platform.ts b/apps/api/src/core/domain/value-objects/client-platform.ts index 20131c2a..17f99b9c 100644 --- a/apps/api/src/core/domain/value-objects/client-platform.ts +++ b/apps/api/src/core/domain/value-objects/client-platform.ts @@ -1,6 +1,7 @@ -import type { Brand } from "@mona-ca/core/types"; import { t } from "elysia"; +import type { Brand } from "@mona-ca/core/types"; + export type RawMobilePlatform = "mobile"; export type MobilePlatform = Brand<"ClientPlatform", RawMobilePlatform>; diff --git a/apps/api/src/core/domain/value-objects/gender.ts b/apps/api/src/core/domain/value-objects/gender.ts index ed7603f3..dd5262ea 100644 --- a/apps/api/src/core/domain/value-objects/gender.ts +++ b/apps/api/src/core/domain/value-objects/gender.ts @@ -1,6 +1,7 @@ -import type { Brand } from "@mona-ca/core/types"; import { t } from "elysia"; +import type { Brand } from "@mona-ca/core/types"; + export type MaleGender = Brand<"Gender", "male">; export type FemaleGender = Brand<"Gender", "female">; export type Gender = MaleGender | FemaleGender; diff --git a/apps/api/src/core/domain/value-objects/index.ts b/apps/api/src/core/domain/value-objects/index.ts index beafc004..ba8f807d 100644 --- a/apps/api/src/core/domain/value-objects/index.ts +++ b/apps/api/src/core/domain/value-objects/index.ts @@ -1,20 +1,20 @@ export { - newClientPlatform, clientPlatformSchema, - newMobilePlatform, - newWebPlatform, isMobilePlatform, isWebPlatform, mobilePlatformSchema, + newClientPlatform, + newMobilePlatform, + newWebPlatform, webPlatformSchema, } from "./client-platform"; export { - newMaleGender, - newFemaleGender, - newGender, - maleGenderSchema, femaleGenderSchema, genderSchema, + maleGenderSchema, + newFemaleGender, + newGender, + newMaleGender, } from "./gender"; export { newUserId } from "./ids"; @@ -24,8 +24,8 @@ export type { WebPlatform, } from "./client-platform"; export type { - MaleGender, FemaleGender, Gender, + MaleGender, } from "./gender"; export type { UserId } from "./ids"; diff --git a/apps/api/src/core/infra/config/env/env.ts b/apps/api/src/core/infra/config/env/env.ts index c90aa73b..571d188c 100644 --- a/apps/api/src/core/infra/config/env/env.ts +++ b/apps/api/src/core/infra/config/env/env.ts @@ -1,7 +1,8 @@ import { env as productionEnv } from "cloudflare:workers"; -import type { CloudflareBindings, Env, EnvVariables } from "./type"; import { validateEnv } from "./validation"; +import type { CloudflareBindings, Env, EnvVariables } from "./type"; + const getEnv = (): { env: Readonly; envVariables: Readonly; diff --git a/apps/api/src/core/infra/config/env/index.ts b/apps/api/src/core/infra/config/env/index.ts index 3e2777bf..4c462ca6 100644 --- a/apps/api/src/core/infra/config/env/index.ts +++ b/apps/api/src/core/infra/config/env/index.ts @@ -1,24 +1,24 @@ +export { cloudflareBindings, env, envVariables } from "./env"; export { EnvVariablesSchema, - PublicSchema, + HMACSecretSchema, OAuthProviderSchema, PepperSchema, + PublicSchema, ResendSchema, - UpstashRedisSchema, TurnstileSchema, - HMACSecretSchema, + UpstashRedisSchema, } from "./schema"; -export { env, envVariables, cloudflareBindings } from "./env"; export type { - PublicEnv, - PepperEnv, - ResendEnv, - UpstashRedisEnv, - TurnstileEnv, - OAuthProviderEnv, - EnvVariables, CloudflareBindings, Env, + EnvVariables, HMACSecretEnv, + OAuthProviderEnv, + PepperEnv, + PublicEnv, + ResendEnv, + TurnstileEnv, + UpstashRedisEnv, } from "./type"; diff --git a/apps/api/src/core/infra/config/env/validation.ts b/apps/api/src/core/infra/config/env/validation.ts index d794fe85..fc520b5f 100644 --- a/apps/api/src/core/infra/config/env/validation.ts +++ b/apps/api/src/core/infra/config/env/validation.ts @@ -1,11 +1,13 @@ import { Value } from "@sinclair/typebox/value"; import { EnvVariablesSchema } from "./schema"; + import type { EnvVariables } from "./type"; export const validateEnv = (envVariables: EnvVariables) => { const preparedEnv = Value.Clean(EnvVariablesSchema, Value.Convert(EnvVariablesSchema, envVariables)); if (!Value.Check(EnvVariablesSchema, preparedEnv)) { + // biome-ignore lint/suspicious/noConsole: Critical error logging before throwing console.error("🚨 Invalid environment variables"); throw new Error("🚨 Invalid environment variables"); } diff --git a/apps/api/src/core/infra/crypto/argon2id/argon2id.service.ts b/apps/api/src/core/infra/crypto/argon2id/argon2id.service.ts index 34001057..2157500d 100644 --- a/apps/api/src/core/infra/crypto/argon2id/argon2id.service.ts +++ b/apps/api/src/core/infra/crypto/argon2id/argon2id.service.ts @@ -1,6 +1,7 @@ -import type { IArgon2idService } from "../../../ports/system"; import { HashOptions, hash, verify } from "./bin/wasm_argon2"; +import type { IArgon2idService } from "../../../ports/system"; + export class Argon2idService implements IArgon2idService { private readonly hashOption: HashOptions | undefined; diff --git a/apps/api/src/core/infra/crypto/crypto-random.service.ts b/apps/api/src/core/infra/crypto/crypto-random.service.ts index 517ceefe..7e5d493d 100644 --- a/apps/api/src/core/infra/crypto/crypto-random.service.ts +++ b/apps/api/src/core/infra/crypto/crypto-random.service.ts @@ -1,10 +1,11 @@ // ref: https://crypto.oslojs.dev/examples/random-values import { - type RandomReader, generateRandomIntegerNumber as osloGenerateRandomIntegerNumber, generateRandomString as osloGenerateRandomString, } from "@oslojs/crypto/random"; + +import type { RandomReader } from "@oslojs/crypto/random"; import type { ICryptoRandomService, RandomStringOptions } from "../../ports/system"; const LOWER = "abcdefghijklmnopqrstuvwxyz"; diff --git a/apps/api/src/core/infra/crypto/hmac-sha-256.service.ts b/apps/api/src/core/infra/crypto/hmac-sha-256.service.ts index 0d8c6b75..f8b71b7d 100644 --- a/apps/api/src/core/infra/crypto/hmac-sha-256.service.ts +++ b/apps/api/src/core/infra/crypto/hmac-sha-256.service.ts @@ -1,5 +1,6 @@ import { createHmac } from "node:crypto"; import { timingSafeStringEqual } from "../../lib/security"; + import type { IHmacService, MacEncoding, MacOptions } from "../../ports/system"; export class HmacSha256Service implements IHmacService { diff --git a/apps/api/src/core/infra/crypto/index.ts b/apps/api/src/core/infra/crypto/index.ts index 16f530bc..e4ac8a2d 100644 --- a/apps/api/src/core/infra/crypto/index.ts +++ b/apps/api/src/core/infra/crypto/index.ts @@ -1,4 +1,4 @@ -export { TokenSecretService } from "./token-secret.service"; -export { PasswordHashingService } from "./password-hashing.service"; -export { HmacSha256Service } from "./hmac-sha-256.service"; export { CryptoRandomService } from "./crypto-random.service"; +export { HmacSha256Service } from "./hmac-sha-256.service"; +export { PasswordHashingService } from "./password-hashing.service"; +export { TokenSecretService } from "./token-secret.service"; diff --git a/apps/api/src/core/infra/crypto/password-hashing.service.ts b/apps/api/src/core/infra/crypto/password-hashing.service.ts index 8149008c..1853b5bd 100644 --- a/apps/api/src/core/infra/crypto/password-hashing.service.ts +++ b/apps/api/src/core/infra/crypto/password-hashing.service.ts @@ -1,6 +1,7 @@ -import type { IPasswordHashingService } from "../../ports/system"; import { Argon2idService } from "./argon2id"; +import type { IPasswordHashingService } from "../../ports/system"; + export class PasswordHashingService implements IPasswordHashingService { private readonly argon2idService: Argon2idService; private readonly pepper: string; diff --git a/apps/api/src/core/infra/crypto/token-secret.service.ts b/apps/api/src/core/infra/crypto/token-secret.service.ts index 70c67a83..09bce94e 100644 --- a/apps/api/src/core/infra/crypto/token-secret.service.ts +++ b/apps/api/src/core/infra/crypto/token-secret.service.ts @@ -1,6 +1,7 @@ import { timingSafeEqual } from "node:crypto"; import { sha256 } from "@oslojs/crypto/sha2"; import { encodeBase32LowerCaseNoPadding } from "@oslojs/encoding"; + import type { ITokenSecretService } from "../../ports/system"; export class TokenSecretService implements ITokenSecretService { diff --git a/apps/api/src/core/infra/drizzle/drizzle.service.ts b/apps/api/src/core/infra/drizzle/drizzle.service.ts index e3a68fb2..2de7c0ae 100644 --- a/apps/api/src/core/infra/drizzle/drizzle.service.ts +++ b/apps/api/src/core/infra/drizzle/drizzle.service.ts @@ -1,7 +1,8 @@ import { drizzle } from "drizzle-orm/d1"; -import type { DrizzleD1Database } from "drizzle-orm/d1"; import * as schema from "./schema"; +import type { DrizzleD1Database } from "drizzle-orm/d1"; + export class DrizzleService { public db: DrizzleD1Database; public schema = schema; diff --git a/apps/api/src/core/infra/drizzle/schema/index.ts b/apps/api/src/core/infra/drizzle/schema/index.ts index 5dad4f41..938436b2 100644 --- a/apps/api/src/core/infra/drizzle/schema/index.ts +++ b/apps/api/src/core/infra/drizzle/schema/index.ts @@ -1,8 +1,8 @@ -export { providerAccountsTable } from "./provider-accounts.table"; -export { sessionsTable } from "./sessions.table"; -export { usersTable } from "./users.table"; +export { accountLinkRequestsTable } from "./account-link-requests.table"; export { emailVerificationRequestsTable } from "./email-verification-requests.table"; export { passwordResetSessionsTable } from "./password-reset-sessions.table"; -export { accountLinkRequestsTable } from "./account-link-requests.table"; -export { signupSessionsTable } from "./signup-sessions.table"; +export { providerAccountsTable } from "./provider-accounts.table"; export { providerLinkRequestsTable } from "./provider-link-requests.table"; +export { sessionsTable } from "./sessions.table"; +export { signupSessionsTable } from "./signup-sessions.table"; +export { usersTable } from "./users.table"; diff --git a/apps/api/src/core/lib/encoding/index.ts b/apps/api/src/core/lib/encoding/index.ts index 9824d8b1..5c9f4096 100644 --- a/apps/api/src/core/lib/encoding/index.ts +++ b/apps/api/src/core/lib/encoding/index.ts @@ -1,4 +1,4 @@ export { - encodeBase64URLSafe, decodeBase64URLSafe, + encodeBase64URLSafe, } from "./base64-url-safe"; diff --git a/apps/api/src/core/lib/http/index.ts b/apps/api/src/core/lib/http/index.ts index fe8e5587..c9cceb95 100644 --- a/apps/api/src/core/lib/http/index.ts +++ b/apps/api/src/core/lib/http/index.ts @@ -1,2 +1,2 @@ -export { getIP, DEVELOPMENT_IP_ADDRESS } from "./get-ip"; -export { PROD_ORIGIN_REGEX, DEV_ORIGIN_REGEX } from "./cors"; +export { DEV_ORIGIN_REGEX, PROD_ORIGIN_REGEX } from "./cors"; +export { DEVELOPMENT_IP_ADDRESS, getIP } from "./get-ip"; diff --git a/apps/api/src/core/lib/types/index.ts b/apps/api/src/core/lib/types/index.ts index 44551aa0..03dd0da9 100644 --- a/apps/api/src/core/lib/types/index.ts +++ b/apps/api/src/core/lib/types/index.ts @@ -1,2 +1,3 @@ export { StringEnum } from "./schema"; -export type { JsonValue, JsonObject, JsonArray, JsonPrimitive } from "./json"; + +export type { JsonArray, JsonObject, JsonPrimitive, JsonValue } from "./json"; diff --git a/apps/api/src/core/lib/types/schema.ts b/apps/api/src/core/lib/types/schema.ts index 92808a4c..82b9e819 100644 --- a/apps/api/src/core/lib/types/schema.ts +++ b/apps/api/src/core/lib/types/schema.ts @@ -1,6 +1,8 @@ -import { Kind, type SchemaOptions, Type, TypeRegistry } from "@sinclair/typebox"; +import { Kind, Type, TypeRegistry } from "@sinclair/typebox"; import { DefaultErrorFunction, SetErrorFunction, ValueErrorType } from "@sinclair/typebox/errors"; +import type { SchemaOptions } from "@sinclair/typebox"; + TypeRegistry.Set("StringEnum", (schema: { enum: string[] }, value: unknown) => { return typeof value === "string" && schema.enum.includes(value); }); diff --git a/apps/api/src/core/ports/gateways/index.ts b/apps/api/src/core/ports/gateways/index.ts index 5cabe80c..48eadb12 100644 --- a/apps/api/src/core/ports/gateways/index.ts +++ b/apps/api/src/core/ports/gateways/index.ts @@ -1,6 +1,6 @@ +export type { IEmailGateway } from "./email.gateway.interface"; export type { ITurnstileGateway, - TurnstileResult, TurnstileErrorCodes, + TurnstileResult, } from "./turnstile.gateway.interface"; -export type { IEmailGateway } from "./email.gateway.interface"; diff --git a/apps/api/src/core/ports/system/index.ts b/apps/api/src/core/ports/system/index.ts index 01cd2993..d8465067 100644 --- a/apps/api/src/core/ports/system/index.ts +++ b/apps/api/src/core/ports/system/index.ts @@ -1,5 +1,5 @@ +export type { IArgon2idService } from "./argon2id.service.interface"; export type { ICryptoRandomService, RandomStringOptions } from "./crypto-random.service.interface"; -export type { MacEncoding, MacOptions, IHmacService } from "./hmac.service.interface"; +export type { IHmacService, MacEncoding, MacOptions } from "./hmac.service.interface"; export type { IPasswordHashingService } from "./password-hashing.service.interface"; export type { ITokenSecretService } from "./token-secret.service.interface"; -export type { IArgon2idService } from "./argon2id.service.interface"; diff --git a/apps/api/src/core/testing/drivers/index.ts b/apps/api/src/core/testing/drivers/index.ts index 9b65515f..64c0bcc9 100644 --- a/apps/api/src/core/testing/drivers/index.ts +++ b/apps/api/src/core/testing/drivers/index.ts @@ -1,17 +1,17 @@ +export { AccountLinkRequestsTableDriver } from "./account-link-requests.table.driver"; export { EmailVerificationRequestsTableDriver } from "./email-verification-requests.table.driver"; export { PasswordResetSessionsTableDriver } from "./password-reset-sessions.table.driver"; export { ProviderAccountsTableDriver } from "./provider-accounts.table.driver"; -export { AccountLinkRequestsTableDriver } from "./account-link-requests.table.driver"; export { ProviderLinkRequestsTableDriver } from "./provider-link-requests.table.driver"; export { SessionsTableDriver } from "./sessions.table.driver"; export { SignupSessionsTableDriver } from "./signup-sessions.table.driver"; export { UsersTableDriver } from "./users.table.driver"; export { toRawBoolean, toRawDate, toRawUint8Array } from "./utils"; +export type { RawAccountLinkRequest } from "./account-link-requests.table.driver"; export type { RawEmailVerificationRequest } from "./email-verification-requests.table.driver"; export type { RawPasswordResetSession } from "./password-reset-sessions.table.driver"; export type { RawProviderAccount } from "./provider-accounts.table.driver"; -export type { RawAccountLinkRequest } from "./account-link-requests.table.driver"; export type { RawProviderLinkRequest } from "./provider-link-requests.table.driver"; export type { RawSession } from "./sessions.table.driver"; export type { RawSignupSession } from "./signup-sessions.table.driver"; diff --git a/apps/api/src/core/testing/mocks/system/index.ts b/apps/api/src/core/testing/mocks/system/index.ts index 80ef35db..b0459240 100644 --- a/apps/api/src/core/testing/mocks/system/index.ts +++ b/apps/api/src/core/testing/mocks/system/index.ts @@ -1,4 +1,4 @@ +export { CryptoRandomServiceMock } from "./crypto-random.service.mock"; export { HmacServiceMock } from "./hmac.service.mock"; export { PasswordHashingServiceMock } from "./password-hashing.service.mock"; -export { CryptoRandomServiceMock } from "./crypto-random.service.mock"; export { TokenSecretServiceMock } from "./token-secret.service.mock"; diff --git a/apps/api/src/core/testing/mocks/system/token-secret.service.mock.ts b/apps/api/src/core/testing/mocks/system/token-secret.service.mock.ts index 8973332f..47ed5637 100644 --- a/apps/api/src/core/testing/mocks/system/token-secret.service.mock.ts +++ b/apps/api/src/core/testing/mocks/system/token-secret.service.mock.ts @@ -1,4 +1,5 @@ import { timingSafeEqual } from "node:crypto"; + import type { ITokenSecretService } from "../../../ports/system"; export class TokenSecretServiceMock implements ITokenSecretService { diff --git a/apps/api/src/features/auth/adapters/gateways/identity-provider/discord.gateway.ts b/apps/api/src/features/auth/adapters/gateways/identity-provider/discord.gateway.ts index 742f2037..e44e220d 100644 --- a/apps/api/src/features/auth/adapters/gateways/identity-provider/discord.gateway.ts +++ b/apps/api/src/features/auth/adapters/gateways/identity-provider/discord.gateway.ts @@ -4,19 +4,19 @@ import { ArcticFetchError, Discord as DiscordProvider, OAuth2RequestError, - type OAuth2Tokens, UnexpectedErrorResponseBodyError, UnexpectedResponseError, } from "arctic"; import { t } from "elysia"; +import { newIdentityProvidersUserId } from "../../../domain/value-objects/identity-providers"; +import type { OAuth2Tokens } from "arctic"; import type { GetTokensResult, GetUserInfoResult, IIdentityProviderGateway, UserInfo, } from "../../../application/ports/out/gateways/identity-provider.gateway.interface"; -import { newIdentityProvidersUserId } from "../../../domain/value-objects/identity-providers"; const discordUserDtoSchema = t.Object({ id: t.String(), @@ -61,6 +61,7 @@ export class DiscordIdentityProviderGateway implements IIdentityProviderGateway return err("FETCH_TOKENS_FAILED"); } + // biome-ignore lint/suspicious/noConsole: Logging unexpected errors for debugging console.error("Unknown error in getTokens:", error); return err("FETCH_TOKENS_FAILED"); } @@ -98,6 +99,7 @@ export class DiscordIdentityProviderGateway implements IIdentityProviderGateway userInfo, }); } catch (error) { + // biome-ignore lint/suspicious/noConsole: Logging unexpected errors for debugging console.error("Error in getUserInfo:", error); return err("USER_INFO_GET_FAILED"); } @@ -107,6 +109,7 @@ export class DiscordIdentityProviderGateway implements IIdentityProviderGateway try { await this.discord.revokeToken(tokens.accessToken()); } catch (error) { + // biome-ignore lint/suspicious/noConsole: Logging revocation errors for debugging console.error("revokeToken request error", error); } } diff --git a/apps/api/src/features/auth/adapters/gateways/identity-provider/google.gateway.ts b/apps/api/src/features/auth/adapters/gateways/identity-provider/google.gateway.ts index 3e2783f7..62d9032a 100644 --- a/apps/api/src/features/auth/adapters/gateways/identity-provider/google.gateway.ts +++ b/apps/api/src/features/auth/adapters/gateways/identity-provider/google.gateway.ts @@ -2,22 +2,22 @@ import { err, ok } from "@mona-ca/core/result"; import { Value } from "@sinclair/typebox/value"; import { ArcticFetchError, + decodeIdToken, Google as GoogleProvider, OAuth2RequestError, - type OAuth2Tokens, UnexpectedErrorResponseBodyError, UnexpectedResponseError, - decodeIdToken, } from "arctic"; import { t } from "elysia"; +import { newIdentityProvidersUserId } from "../../../domain/value-objects/identity-providers"; +import type { OAuth2Tokens } from "arctic"; import type { GetTokensResult, GetUserInfoResult, IIdentityProviderGateway, UserInfo, } from "../../../application/ports/out/gateways/identity-provider.gateway.interface"; -import { newIdentityProvidersUserId } from "../../../domain/value-objects/identity-providers"; const googleIdTokenClaimsSchema = t.Object({ sub: t.String(), @@ -46,6 +46,7 @@ export class GoogleIdentityProviderGateway implements IIdentityProviderGateway { return ok(tokens); } catch (error) { if (error instanceof OAuth2RequestError) { + // biome-ignore lint/suspicious/noConsole: Logging OAuth2 request errors for debugging console.error(error); return err("CREDENTIALS_INVALID"); } @@ -59,6 +60,7 @@ export class GoogleIdentityProviderGateway implements IIdentityProviderGateway { return err("FETCH_TOKENS_FAILED"); } + // biome-ignore lint/suspicious/noConsole: Logging unexpected errors for debugging console.error("Unknown error in getTokens:", error); return err("FETCH_TOKENS_FAILED"); } @@ -86,6 +88,7 @@ export class GoogleIdentityProviderGateway implements IIdentityProviderGateway { userInfo, }); } catch (error) { + // biome-ignore lint/suspicious/noConsole: Logging unexpected errors for debugging console.error("Error in getUserInfo:", error); return err("USER_INFO_GET_FAILED"); } @@ -95,6 +98,7 @@ export class GoogleIdentityProviderGateway implements IIdentityProviderGateway { try { await this.google.revokeToken(tokens.accessToken()); } catch (error) { + // biome-ignore lint/suspicious/noConsole: Logging revocation errors for debugging console.error("revokeToken request error", error); } } diff --git a/apps/api/src/features/auth/adapters/repositories/auth-user/auth-user.repository.ts b/apps/api/src/features/auth/adapters/repositories/auth-user/auth-user.repository.ts index 1a6b245d..f3c58059 100644 --- a/apps/api/src/features/auth/adapters/repositories/auth-user/auth-user.repository.ts +++ b/apps/api/src/features/auth/adapters/repositories/auth-user/auth-user.repository.ts @@ -1,5 +1,7 @@ import { eq } from "drizzle-orm"; -import { type UserId, newUserId } from "../../../../../core/domain/value-objects"; +import { newUserId } from "../../../../../core/domain/value-objects"; + +import type { UserId } from "../../../../../core/domain/value-objects"; import type { DrizzleService } from "../../../../../core/infra/drizzle"; import type { IAuthUserRepository } from "../../../application/ports/out/repositories/auth-user.repository.interface"; import type { UserCredentials } from "../../../domain/entities/user-credentials"; diff --git a/apps/api/src/features/auth/adapters/repositories/password-reset-session/tests/save.test.ts b/apps/api/src/features/auth/adapters/repositories/password-reset-session/tests/save.test.ts index 4ef73f36..262b4dc5 100644 --- a/apps/api/src/features/auth/adapters/repositories/password-reset-session/tests/save.test.ts +++ b/apps/api/src/features/auth/adapters/repositories/password-reset-session/tests/save.test.ts @@ -1,7 +1,7 @@ import { env } from "cloudflare:test"; import { afterAll, beforeAll, beforeEach, describe, expect, test } from "vitest"; import { DrizzleService } from "../../../../../../core/infra/drizzle"; -import { PasswordResetSessionsTableDriver, UsersTableDriver, toRawDate } from "../../../../../../core/testing/drivers"; +import { PasswordResetSessionsTableDriver, toRawDate, UsersTableDriver } from "../../../../../../core/testing/drivers"; import { convertPasswordResetSessionToRaw, convertUserRegistrationToRaw } from "../../../../testing/converters"; import { createAuthUserFixture, createPasswordResetSessionFixture } from "../../../../testing/fixtures"; import { PasswordResetSessionRepository } from "../password-reset-session.repository"; diff --git a/apps/api/src/features/auth/adapters/repositories/provider-account/provider-account.repository.ts b/apps/api/src/features/auth/adapters/repositories/provider-account/provider-account.repository.ts index 0ecb7022..b8e02eba 100644 --- a/apps/api/src/features/auth/adapters/repositories/provider-account/provider-account.repository.ts +++ b/apps/api/src/features/auth/adapters/repositories/provider-account/provider-account.repository.ts @@ -1,17 +1,16 @@ import { and, eq } from "drizzle-orm"; import { newUserId } from "../../../../../core/domain/value-objects"; +import { newIdentityProviders, newIdentityProvidersUserId } from "../../../domain/value-objects/identity-providers"; import type { UserId } from "../../../../../core/domain/value-objects"; import type { DrizzleService } from "../../../../../core/infra/drizzle"; import type { IProviderAccountRepository } from "../../../application/ports/out/repositories/provider-account.repository.interface"; import type { ProviderAccount } from "../../../domain/entities/provider-account"; -import { - type IdentityProviders, - type IdentityProvidersUserId, - newIdentityProviders, - newIdentityProvidersUserId, +import type { + IdentityProviders, + IdentityProvidersUserId, + RawIdentityProviders, } from "../../../domain/value-objects/identity-providers"; -import type { RawIdentityProviders } from "../../../domain/value-objects/identity-providers"; interface FoundProviderAccountDto { provider: RawIdentityProviders; diff --git a/apps/api/src/features/auth/adapters/repositories/provider-account/tests/find-by-provider-and-provider-id.test.ts b/apps/api/src/features/auth/adapters/repositories/provider-account/tests/find-by-provider-and-provider-id.test.ts index 81f3f298..6206b3fa 100644 --- a/apps/api/src/features/auth/adapters/repositories/provider-account/tests/find-by-provider-and-provider-id.test.ts +++ b/apps/api/src/features/auth/adapters/repositories/provider-account/tests/find-by-provider-and-provider-id.test.ts @@ -2,12 +2,13 @@ import { env } from "cloudflare:test"; import { afterAll, beforeAll, beforeEach, describe, expect, test } from "vitest"; import { DrizzleService } from "../../../../../../core/infra/drizzle"; import { ProviderAccountsTableDriver, UsersTableDriver } from "../../../../../../core/testing/drivers"; -import type { IdentityProviders } from "../../../../domain/value-objects/identity-providers"; import { newIdentityProviders, newIdentityProvidersUserId } from "../../../../domain/value-objects/identity-providers"; import { convertProviderAccountToRaw, convertUserRegistrationToRaw } from "../../../../testing/converters"; import { createAuthUserFixture, createProviderAccountFixture } from "../../../../testing/fixtures"; import { ProviderAccountRepository } from "../provider-account.repository"; +import type { IdentityProviders } from "../../../../domain/value-objects/identity-providers"; + const { DB } = env; const drizzleService = new DrizzleService(DB); diff --git a/apps/api/src/features/auth/adapters/repositories/provider-account/tests/save.test.ts b/apps/api/src/features/auth/adapters/repositories/provider-account/tests/save.test.ts index 1da7a02b..50c4da59 100644 --- a/apps/api/src/features/auth/adapters/repositories/provider-account/tests/save.test.ts +++ b/apps/api/src/features/auth/adapters/repositories/provider-account/tests/save.test.ts @@ -2,11 +2,12 @@ import { env } from "cloudflare:test"; import { afterAll, beforeAll, beforeEach, describe, expect, test } from "vitest"; import { DrizzleService } from "../../../../../../core/infra/drizzle"; import { ProviderAccountsTableDriver, UsersTableDriver } from "../../../../../../core/testing/drivers"; -import type { ProviderAccount } from "../../../../domain/entities/provider-account"; import { convertProviderAccountToRaw, convertUserRegistrationToRaw } from "../../../../testing/converters"; import { createAuthUserFixture, createProviderAccountFixture } from "../../../../testing/fixtures"; import { ProviderAccountRepository } from "../provider-account.repository"; +import type { ProviderAccount } from "../../../../domain/entities/provider-account"; + const { DB } = env; const drizzleService = new DrizzleService(DB); diff --git a/apps/api/src/features/auth/adapters/repositories/provider-link-request/provider-link-request.repository.ts b/apps/api/src/features/auth/adapters/repositories/provider-link-request/provider-link-request.repository.ts index 07d40fd9..82d3888f 100644 --- a/apps/api/src/features/auth/adapters/repositories/provider-link-request/provider-link-request.repository.ts +++ b/apps/api/src/features/auth/adapters/repositories/provider-link-request/provider-link-request.repository.ts @@ -1,12 +1,13 @@ import { eq, lte } from "drizzle-orm"; import { newUserId } from "../../../../../core/domain/value-objects"; +import { newIdentityProviders } from "../../../domain/value-objects/identity-providers"; import { newProviderLinkRequestId } from "../../../domain/value-objects/ids"; import type { UserId } from "../../../../../core/domain/value-objects"; import type { DrizzleService } from "../../../../../core/infra/drizzle"; import type { IProviderLinkRequestRepository } from "../../../application/ports/out/repositories/provider-link-request.repository.interface"; import type { ProviderLinkRequest } from "../../../domain/entities/provider-link-request"; -import { type RawIdentityProviders, newIdentityProviders } from "../../../domain/value-objects/identity-providers"; +import type { RawIdentityProviders } from "../../../domain/value-objects/identity-providers"; import type { ProviderLinkRequestId } from "../../../domain/value-objects/ids"; interface FoundProviderLinkRequestDto { diff --git a/apps/api/src/features/auth/application/use-cases/account-link/tests/verify-email.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/account-link/tests/verify-email.usecase.test.ts index 164a4d7c..f6f9695d 100644 --- a/apps/api/src/features/auth/application/use-cases/account-link/tests/verify-email.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/account-link/tests/verify-email.usecase.test.ts @@ -1,4 +1,4 @@ -import { assert, afterEach, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, assert, beforeEach, describe, expect, it } from "vitest"; import { newUserId } from "../../../../../../core/domain/value-objects"; import { ulid } from "../../../../../../core/lib/id"; import { TokenSecretServiceMock } from "../../../../../../core/testing/mocks/system"; @@ -7,13 +7,13 @@ import { createAccountLinkRequestFixture, createAuthUserFixture } from "../../.. import { AccountLinkRequestRepositoryMock, AuthUserRepositoryMock, - ProviderAccountRepositoryMock, - SessionRepositoryMock, createAccountLinkRequestMap, createAuthUserMap, createProviderAccountKey, createProviderAccountMap, createSessionMap, + ProviderAccountRepositoryMock, + SessionRepositoryMock, } from "../../../../testing/mocks/repositories"; import { AccountLinkVerifyEmailUseCase } from "../verify-email.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/email-verification/tests/request.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/email-verification/tests/request.usecase.test.ts index 8311fbbc..b16bf7d0 100644 --- a/apps/api/src/features/auth/application/use-cases/email-verification/tests/request.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/email-verification/tests/request.usecase.test.ts @@ -4,8 +4,8 @@ import { CryptoRandomServiceMock, TokenSecretServiceMock } from "../../../../../ import { decodeToken } from "../../../../domain/value-objects/tokens"; import { createAuthUserFixture, createEmailVerificationRequestFixture } from "../../../../testing/fixtures"; import { - EmailVerificationRequestRepositoryMock, createEmailVerificationRequestMap, + EmailVerificationRequestRepositoryMock, } from "../../../../testing/mocks/repositories"; import { EmailVerificationRequestUseCase } from "../request.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/email-verification/tests/validate-request.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/email-verification/tests/validate-request.usecase.test.ts index 7f8b0e64..b7dddc62 100644 --- a/apps/api/src/features/auth/application/use-cases/email-verification/tests/validate-request.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/email-verification/tests/validate-request.usecase.test.ts @@ -5,8 +5,8 @@ import { TokenSecretServiceMock } from "../../../../../../core/testing/mocks/sys import { encodeToken, newEmailVerificationRequestToken } from "../../../../domain/value-objects/tokens"; import { createAuthUserFixture, createEmailVerificationRequestFixture } from "../../../../testing/fixtures"; import { - EmailVerificationRequestRepositoryMock, createEmailVerificationRequestMap, + EmailVerificationRequestRepositoryMock, } from "../../../../testing/mocks/repositories"; import { EmailVerificationValidateRequestUseCase } from "../validate-request.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/email-verification/tests/verify-email.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/email-verification/tests/verify-email.usecase.test.ts index 150fa658..d1a0195b 100644 --- a/apps/api/src/features/auth/application/use-cases/email-verification/tests/verify-email.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/email-verification/tests/verify-email.usecase.test.ts @@ -2,10 +2,10 @@ import { assert, beforeEach, describe, expect, it } from "vitest"; import { createAuthUserFixture, createEmailVerificationRequestFixture } from "../../../../testing/fixtures"; import { AuthUserRepositoryMock, - EmailVerificationRequestRepositoryMock, createAuthUserMap, createEmailVerificationRequestMap, createSessionMap, + EmailVerificationRequestRepositoryMock, } from "../../../../testing/mocks/repositories"; import { EmailVerificationVerifyEmailUseCase } from "../verify-email.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/federated-auth/callback.usecase.ts b/apps/api/src/features/auth/application/use-cases/federated-auth/callback.usecase.ts index dd431ec6..bde32ac5 100644 --- a/apps/api/src/features/auth/application/use-cases/federated-auth/callback.usecase.ts +++ b/apps/api/src/features/auth/application/use-cases/federated-auth/callback.usecase.ts @@ -1,5 +1,6 @@ import { getMobileScheme, getWebBaseURL, validateRedirectURL } from "@mona-ca/core/http"; import { err, ok } from "@mona-ca/core/result"; +import { match } from "ts-pattern"; import { isMobilePlatform, isWebPlatform, @@ -8,12 +9,11 @@ import { newUserId, } from "../../../../../core/domain/value-objects"; import { ulid } from "../../../../../core/lib/id"; -import { type AccountLinkRequest, createAccountLinkRequest } from "../../../domain/entities/account-link-request"; +import { createAccountLinkRequest } from "../../../domain/entities/account-link-request"; import { createProviderAccount } from "../../../domain/entities/provider-account"; import { createSession } from "../../../domain/entities/session"; -import { DEFAULT_USER_GENDER, createUserRegistration } from "../../../domain/entities/user-registration"; +import { createUserRegistration, DEFAULT_USER_GENDER } from "../../../domain/entities/user-registration"; import { - type IdentityProvidersUserId, isDiscordProvider, isGoogleProvider, newIdentityProvidersUserId, @@ -21,11 +21,11 @@ import { import { newAccountLinkRequestId, newSessionId } from "../../../domain/value-objects/ids"; import { encodeToken } from "../../../domain/value-objects/tokens"; -import { match } from "ts-pattern"; import type { UserId } from "../../../../../core/domain/value-objects"; import type { ITokenSecretService } from "../../../../../core/ports/system"; +import type { AccountLinkRequest } from "../../../domain/entities/account-link-request"; import type { Session } from "../../../domain/entities/session"; -import type { IdentityProviders } from "../../../domain/value-objects/identity-providers"; +import type { IdentityProviders, IdentityProvidersUserId } from "../../../domain/value-objects/identity-providers"; import type { AccountLinkRequestToken, SessionToken } from "../../../domain/value-objects/tokens"; import type { FederatedAuthCallbackUseCaseResult, diff --git a/apps/api/src/features/auth/application/use-cases/federated-auth/request.usecase.ts b/apps/api/src/features/auth/application/use-cases/federated-auth/request.usecase.ts index fb81c5e8..95afaa83 100644 --- a/apps/api/src/features/auth/application/use-cases/federated-auth/request.usecase.ts +++ b/apps/api/src/features/auth/application/use-cases/federated-auth/request.usecase.ts @@ -1,14 +1,12 @@ import { getMobileScheme, getWebBaseURL, validateRedirectURL } from "@mona-ca/core/http"; import { err, ok } from "@mona-ca/core/result"; import { generateCodeVerifier } from "arctic"; - import { match } from "ts-pattern"; -import { type ClientPlatform, isMobilePlatform, isWebPlatform } from "../../../../../core/domain/value-objects"; -import { - type IdentityProviders, - isDiscordProvider, - isGoogleProvider, -} from "../../../domain/value-objects/identity-providers"; +import { isMobilePlatform, isWebPlatform } from "../../../../../core/domain/value-objects"; +import { isDiscordProvider, isGoogleProvider } from "../../../domain/value-objects/identity-providers"; + +import type { ClientPlatform } from "../../../../../core/domain/value-objects"; +import type { IdentityProviders } from "../../../domain/value-objects/identity-providers"; import type { FederatedAuthRequestUseCaseResult, IFederatedAuthRequestUseCase, diff --git a/apps/api/src/features/auth/application/use-cases/federated-auth/tests/callback.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/federated-auth/tests/callback.usecase.test.ts index f824c7ef..9cacf120 100644 --- a/apps/api/src/features/auth/application/use-cases/federated-auth/tests/callback.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/federated-auth/tests/callback.usecase.test.ts @@ -1,4 +1,4 @@ -import { assert, afterEach, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, assert, beforeEach, describe, expect, it } from "vitest"; import { newClientPlatform, newGender } from "../../../../../../core/domain/value-objects"; import { ulid } from "../../../../../../core/lib/id"; import { TokenSecretServiceMock } from "../../../../../../core/testing/mocks/system"; @@ -10,16 +10,17 @@ import { HmacSignedStateServiceMock } from "../../../../testing/mocks/infra"; import { AccountLinkRequestRepositoryMock, AuthUserRepositoryMock, - ProviderAccountRepositoryMock, - SessionRepositoryMock, createAccountLinkRequestMap, createAuthUserMap, createProviderAccountKey, createProviderAccountMap, createSessionMap, + ProviderAccountRepositoryMock, + SessionRepositoryMock, } from "../../../../testing/mocks/repositories"; -import type { UserInfo } from "../../../ports/out/gateways/identity-provider.gateway.interface"; import { FederatedAuthCallbackUseCase } from "../callback.usecase"; + +import type { UserInfo } from "../../../ports/out/gateways/identity-provider.gateway.interface"; import type { federatedAuthStateSchema } from "../schema"; const authUserMap = createAuthUserMap(); diff --git a/apps/api/src/features/auth/application/use-cases/federated-auth/tests/request.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/federated-auth/tests/request.usecase.test.ts index 30df4d40..598f2525 100644 --- a/apps/api/src/features/auth/application/use-cases/federated-auth/tests/request.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/federated-auth/tests/request.usecase.test.ts @@ -4,6 +4,7 @@ import { newIdentityProviders } from "../../../../domain/value-objects/identity- import { IdentityProviderGatewayMock } from "../../../../testing/mocks/gateways"; import { HmacSignedStateServiceMock } from "../../../../testing/mocks/infra"; import { FederatedAuthRequestUseCase } from "../request.usecase"; + import type { federatedAuthStateSchema } from "../schema"; const googleIdentityProviderGateway = new IdentityProviderGatewayMock(); diff --git a/apps/api/src/features/auth/application/use-cases/password-reset/tests/request.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/password-reset/tests/request.usecase.test.ts index 5c1c7bf9..76a36d96 100644 --- a/apps/api/src/features/auth/application/use-cases/password-reset/tests/request.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/password-reset/tests/request.usecase.test.ts @@ -4,10 +4,10 @@ import { CryptoRandomServiceMock, TokenSecretServiceMock } from "../../../../../ import { createAuthUserFixture, createPasswordResetSessionFixture } from "../../../../testing/fixtures"; import { AuthUserRepositoryMock, - PasswordResetSessionRepositoryMock, createAuthUserMap, createPasswordResetSessionMap, createSessionMap, + PasswordResetSessionRepositoryMock, } from "../../../../testing/mocks/repositories"; import { PasswordResetRequestUseCase } from "../request.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/password-reset/tests/reset.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/password-reset/tests/reset.usecase.test.ts index f6853662..743dd9b3 100644 --- a/apps/api/src/features/auth/application/use-cases/password-reset/tests/reset.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/password-reset/tests/reset.usecase.test.ts @@ -7,11 +7,11 @@ import { } from "../../../../testing/fixtures"; import { AuthUserRepositoryMock, - PasswordResetSessionRepositoryMock, - SessionRepositoryMock, createAuthUserMap, createPasswordResetSessionMap, createSessionMap, + PasswordResetSessionRepositoryMock, + SessionRepositoryMock, } from "../../../../testing/mocks/repositories"; import { PasswordResetResetUseCase } from "../reset.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/password-reset/tests/validate-session.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/password-reset/tests/validate-session.usecase.test.ts index 31aa8ecb..3b9b70fd 100644 --- a/apps/api/src/features/auth/application/use-cases/password-reset/tests/validate-session.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/password-reset/tests/validate-session.usecase.test.ts @@ -1,12 +1,12 @@ -import { assert, afterEach, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, assert, beforeEach, describe, expect, it } from "vitest"; import { TokenSecretServiceMock } from "../../../../../../core/testing/mocks/system"; import { createAuthUserFixture, createPasswordResetSessionFixture } from "../../../../testing/fixtures"; import { AuthUserRepositoryMock, - PasswordResetSessionRepositoryMock, createAuthUserMap, createPasswordResetSessionMap, createSessionMap, + PasswordResetSessionRepositoryMock, } from "../../../../testing/mocks/repositories"; import { PasswordResetValidateSessionUseCase } from "../validate-session.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/password-reset/tests/verify-email.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/password-reset/tests/verify-email.usecase.test.ts index 3a73af45..82f021be 100644 --- a/apps/api/src/features/auth/application/use-cases/password-reset/tests/verify-email.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/password-reset/tests/verify-email.usecase.test.ts @@ -1,8 +1,8 @@ -import { assert, afterEach, describe, expect, it } from "vitest"; +import { afterEach, assert, describe, expect, it } from "vitest"; import { createPasswordResetSessionFixture } from "../../../../testing/fixtures"; import { - PasswordResetSessionRepositoryMock, createPasswordResetSessionMap, + PasswordResetSessionRepositoryMock, } from "../../../../testing/mocks/repositories"; import { PasswordResetVerifyEmailUseCase } from "../verify-email.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/provider-link/prepare.usecase.ts b/apps/api/src/features/auth/application/use-cases/provider-link/prepare.usecase.ts index 87b11aa8..ac05419f 100644 --- a/apps/api/src/features/auth/application/use-cases/provider-link/prepare.usecase.ts +++ b/apps/api/src/features/auth/application/use-cases/provider-link/prepare.usecase.ts @@ -1,11 +1,14 @@ import { ok } from "@mona-ca/core/result"; -import type { UserId } from "../../../../../core/domain/value-objects"; import { ulid } from "../../../../../core/lib/id"; +import { createProviderLinkRequest } from "../../../domain/entities/provider-link-request"; +import { newProviderLinkRequestId } from "../../../domain/value-objects/ids"; +import { encodeToken } from "../../../domain/value-objects/tokens"; + +import type { UserId } from "../../../../../core/domain/value-objects"; import type { ITokenSecretService } from "../../../../../core/ports/system"; -import { type ProviderLinkRequest, createProviderLinkRequest } from "../../../domain/entities/provider-link-request"; +import type { ProviderLinkRequest } from "../../../domain/entities/provider-link-request"; import type { IdentityProviders } from "../../../domain/value-objects/identity-providers"; -import { newProviderLinkRequestId } from "../../../domain/value-objects/ids"; -import { type ProviderLinkRequestToken, encodeToken } from "../../../domain/value-objects/tokens"; +import type { ProviderLinkRequestToken } from "../../../domain/value-objects/tokens"; import type { IProviderLinkPrepareUseCase, ProviderLinkPrepareUseCaseResult, diff --git a/apps/api/src/features/auth/application/use-cases/provider-link/request.usecase.ts b/apps/api/src/features/auth/application/use-cases/provider-link/request.usecase.ts index 754a9e0c..7e855f41 100644 --- a/apps/api/src/features/auth/application/use-cases/provider-link/request.usecase.ts +++ b/apps/api/src/features/auth/application/use-cases/provider-link/request.usecase.ts @@ -1,15 +1,13 @@ import { getMobileScheme, getWebBaseURL, validateRedirectURL } from "@mona-ca/core/http"; import { err, ok } from "@mona-ca/core/result"; import { generateCodeVerifier } from "arctic"; - import { match } from "ts-pattern"; -import { type ClientPlatform, isMobilePlatform, isWebPlatform } from "../../../../../core/domain/value-objects"; +import { isMobilePlatform, isWebPlatform } from "../../../../../core/domain/value-objects"; +import { isDiscordProvider, isGoogleProvider } from "../../../domain/value-objects/identity-providers"; + +import type { ClientPlatform } from "../../../../../core/domain/value-objects"; import type { UserCredentials } from "../../../domain/entities/user-credentials"; -import { - type IdentityProviders, - isDiscordProvider, - isGoogleProvider, -} from "../../../domain/value-objects/identity-providers"; +import type { IdentityProviders } from "../../../domain/value-objects/identity-providers"; import type { IProviderLinkRequestUseCase, ProviderLinkRequestUseCaseResult, diff --git a/apps/api/src/features/auth/application/use-cases/provider-link/tests/callback.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/provider-link/tests/callback.usecase.test.ts index 39ecef10..8ce85d76 100644 --- a/apps/api/src/features/auth/application/use-cases/provider-link/tests/callback.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/provider-link/tests/callback.usecase.test.ts @@ -1,4 +1,4 @@ -import { assert, afterEach, describe, expect, it } from "vitest"; +import { afterEach, assert, describe, expect, it } from "vitest"; import { newClientPlatform } from "../../../../../../core/domain/value-objects"; import { ulid } from "../../../../../../core/lib/id"; import { newIdentityProviders, newIdentityProvidersUserId } from "../../../../domain/value-objects/identity-providers"; @@ -6,12 +6,13 @@ import { createAuthUserFixture, createProviderAccountFixture } from "../../../.. import { IdentityProviderGatewayMock } from "../../../../testing/mocks/gateways"; import { HmacSignedStateServiceMock } from "../../../../testing/mocks/infra"; import { - ProviderAccountRepositoryMock, createProviderAccountKey, createProviderAccountMap, + ProviderAccountRepositoryMock, } from "../../../../testing/mocks/repositories"; -import type { UserInfo } from "../../../ports/out/gateways/identity-provider.gateway.interface"; import { ProviderLinkCallbackUseCase } from "../callback.usecase"; + +import type { UserInfo } from "../../../ports/out/gateways/identity-provider.gateway.interface"; import type { providerLinkStateSchema } from "../schema"; const providerAccountMap = createProviderAccountMap(); diff --git a/apps/api/src/features/auth/application/use-cases/provider-link/tests/prepare.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/provider-link/tests/prepare.usecase.test.ts index 7690797a..7ae2fa40 100644 --- a/apps/api/src/features/auth/application/use-cases/provider-link/tests/prepare.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/provider-link/tests/prepare.usecase.test.ts @@ -4,8 +4,8 @@ import { ulid } from "../../../../../../core/lib/id"; import { TokenSecretServiceMock } from "../../../../../../core/testing/mocks/system"; import { newIdentityProviders } from "../../../../domain/value-objects/identity-providers"; import { - ProviderLinkRequestRepositoryMock, createProviderLinkRequestMap, + ProviderLinkRequestRepositoryMock, } from "../../../../testing/mocks/repositories"; import { ProviderLinkPrepareUseCase } from "../prepare.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/provider-link/tests/request.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/provider-link/tests/request.usecase.test.ts index 973ad52d..2a2b57c1 100644 --- a/apps/api/src/features/auth/application/use-cases/provider-link/tests/request.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/provider-link/tests/request.usecase.test.ts @@ -5,6 +5,7 @@ import { createAuthUserFixture } from "../../../../testing/fixtures"; import { IdentityProviderGatewayMock } from "../../../../testing/mocks/gateways"; import { HmacSignedStateServiceMock } from "../../../../testing/mocks/infra"; import { ProviderLinkRequestUseCase } from "../request.usecase"; + import type { providerLinkStateSchema } from "../schema"; const googleIdentityProviderGateway = new IdentityProviderGatewayMock(); diff --git a/apps/api/src/features/auth/application/use-cases/provider-link/tests/unlink.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/provider-link/tests/unlink.usecase.test.ts index 9d321af6..59bdc7d0 100644 --- a/apps/api/src/features/auth/application/use-cases/provider-link/tests/unlink.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/provider-link/tests/unlink.usecase.test.ts @@ -2,9 +2,9 @@ import { assert, beforeEach, describe, expect, it } from "vitest"; import { newIdentityProviders, newIdentityProvidersUserId } from "../../../../domain/value-objects/identity-providers"; import { createAuthUserFixture, createProviderAccountFixture } from "../../../../testing/fixtures"; import { - ProviderAccountRepositoryMock, createProviderAccountKey, createProviderAccountMap, + ProviderAccountRepositoryMock, } from "../../../../testing/mocks/repositories"; import { ProviderLinkUnlinkUseCase } from "../unlink.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/provider-link/tests/validate-request.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/provider-link/tests/validate-request.usecase.test.ts index 79a48cd2..e75e9773 100644 --- a/apps/api/src/features/auth/application/use-cases/provider-link/tests/validate-request.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/provider-link/tests/validate-request.usecase.test.ts @@ -1,4 +1,4 @@ -import { assert, afterEach, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, assert, beforeEach, describe, expect, it } from "vitest"; import { newUserId } from "../../../../../../core/domain/value-objects"; import { ulid } from "../../../../../../core/lib/id"; import { TokenSecretServiceMock } from "../../../../../../core/testing/mocks/system"; @@ -7,10 +7,10 @@ import { encodeToken, newProviderLinkRequestToken } from "../../../../domain/val import { createAuthUserFixture, createProviderLinkRequestFixture } from "../../../../testing/fixtures"; import { AuthUserRepositoryMock, - ProviderLinkRequestRepositoryMock, createAuthUserMap, createProviderLinkRequestMap, createSessionMap, + ProviderLinkRequestRepositoryMock, } from "../../../../testing/mocks/repositories"; import { ProviderLinkValidateRequestUseCase } from "../validate-request.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/provider-link/validate-request.usecase.ts b/apps/api/src/features/auth/application/use-cases/provider-link/validate-request.usecase.ts index 98922fd9..b3f9dcf5 100644 --- a/apps/api/src/features/auth/application/use-cases/provider-link/validate-request.usecase.ts +++ b/apps/api/src/features/auth/application/use-cases/provider-link/validate-request.usecase.ts @@ -1,8 +1,10 @@ import { err, ok } from "@mona-ca/core/result"; -import type { ITokenSecretService } from "../../../../../core/ports/system"; import { isExpiredProviderLinkRequest } from "../../../domain/entities/provider-link-request"; +import { decodeToken } from "../../../domain/value-objects/tokens"; + +import type { ITokenSecretService } from "../../../../../core/ports/system"; import type { IdentityProviders } from "../../../domain/value-objects/identity-providers"; -import { type ProviderLinkRequestToken, decodeToken } from "../../../domain/value-objects/tokens"; +import type { ProviderLinkRequestToken } from "../../../domain/value-objects/tokens"; import type { IProviderLinkValidateRequestUseCase, ProviderLinkValidateRequestUseCaseResult, diff --git a/apps/api/src/features/auth/application/use-cases/session/tests/login.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/session/tests/login.usecase.test.ts index 42473218..d68b5c2a 100644 --- a/apps/api/src/features/auth/application/use-cases/session/tests/login.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/session/tests/login.usecase.test.ts @@ -3,9 +3,9 @@ import { PasswordHashingServiceMock, TokenSecretServiceMock } from "../../../../ import { createAuthUserFixture } from "../../../../testing/fixtures"; import { AuthUserRepositoryMock, - SessionRepositoryMock, createAuthUserMap, createSessionMap, + SessionRepositoryMock, } from "../../../../testing/mocks/repositories"; import { LoginUseCase } from "../login.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/session/tests/logout.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/session/tests/logout.usecase.test.ts index 24df6d6c..f0392832 100644 --- a/apps/api/src/features/auth/application/use-cases/session/tests/logout.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/session/tests/logout.usecase.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; import { createSessionFixture } from "../../../../testing/fixtures"; -import { SessionRepositoryMock, createSessionMap } from "../../../../testing/mocks/repositories"; +import { createSessionMap, SessionRepositoryMock } from "../../../../testing/mocks/repositories"; import { LogoutUseCase } from "../logout.usecase"; const sessionMap = createSessionMap(); diff --git a/apps/api/src/features/auth/application/use-cases/session/tests/update-password.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/session/tests/update-password.usecase.test.ts index a5cec201..ac183df5 100644 --- a/apps/api/src/features/auth/application/use-cases/session/tests/update-password.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/session/tests/update-password.usecase.test.ts @@ -3,9 +3,9 @@ import { PasswordHashingServiceMock, TokenSecretServiceMock } from "../../../../ import { createAuthUserFixture, createSessionFixture } from "../../../../testing/fixtures"; import { AuthUserRepositoryMock, - SessionRepositoryMock, createAuthUserMap, createSessionMap, + SessionRepositoryMock, } from "../../../../testing/mocks/repositories"; import { UpdatePasswordUseCase } from "../update-password.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/session/tests/user-identities.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/session/tests/user-identities.usecase.test.ts index cfde25b0..49ce37d3 100644 --- a/apps/api/src/features/auth/application/use-cases/session/tests/user-identities.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/session/tests/user-identities.usecase.test.ts @@ -2,9 +2,9 @@ import { assert, beforeEach, describe, expect, it } from "vitest"; import { newIdentityProviders, newIdentityProvidersUserId } from "../../../../domain/value-objects/identity-providers"; import { createAuthUserFixture, createProviderAccountFixture } from "../../../../testing/fixtures"; import { - ProviderAccountRepositoryMock, createProviderAccountKey, createProviderAccountMap, + ProviderAccountRepositoryMock, } from "../../../../testing/mocks/repositories"; import { UserIdentitiesUseCase } from "../user-identities.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/session/tests/validate-session.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/session/tests/validate-session.usecase.test.ts index 277a3fde..1befd9fb 100644 --- a/apps/api/src/features/auth/application/use-cases/session/tests/validate-session.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/session/tests/validate-session.usecase.test.ts @@ -5,9 +5,9 @@ import { encodeToken, newSessionToken } from "../../../../domain/value-objects/t import { createAuthUserFixture, createSessionFixture } from "../../../../testing/fixtures"; import { AuthUserRepositoryMock, - SessionRepositoryMock, createAuthUserMap, createSessionMap, + SessionRepositoryMock, } from "../../../../testing/mocks/repositories"; import { ValidateSessionUseCase } from "../validate-session.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/session/user-identities.usecase.ts b/apps/api/src/features/auth/application/use-cases/session/user-identities.usecase.ts index 724ad06d..2c8246a4 100644 --- a/apps/api/src/features/auth/application/use-cases/session/user-identities.usecase.ts +++ b/apps/api/src/features/auth/application/use-cases/session/user-identities.usecase.ts @@ -1,11 +1,9 @@ import { ok } from "@mona-ca/core/result"; import { match } from "ts-pattern"; +import { isDiscordProvider, isGoogleProvider } from "../../../domain/value-objects/identity-providers"; + import type { UserCredentials } from "../../../domain/entities/user-credentials"; -import { - type IdentityProviders, - isDiscordProvider, - isGoogleProvider, -} from "../../../domain/value-objects/identity-providers"; +import type { IdentityProviders } from "../../../domain/value-objects/identity-providers"; import type { FederatedIdentities, IUserIdentitiesUseCase, diff --git a/apps/api/src/features/auth/application/use-cases/signup/register.usecase.ts b/apps/api/src/features/auth/application/use-cases/signup/register.usecase.ts index 3d89d6f4..313a10a8 100644 --- a/apps/api/src/features/auth/application/use-cases/signup/register.usecase.ts +++ b/apps/api/src/features/auth/application/use-cases/signup/register.usecase.ts @@ -2,6 +2,7 @@ import { err, ok } from "@mona-ca/core/result"; import { newUserId } from "../../../../../core/domain/value-objects"; import { ulid } from "../../../../../core/lib/id"; import { createSession } from "../../../domain/entities/session"; +import { createUserRegistration } from "../../../domain/entities/user-registration"; import { newSessionId } from "../../../domain/value-objects/ids"; import { encodeToken } from "../../../domain/value-objects/tokens"; @@ -9,7 +10,6 @@ import type { Gender, UserId } from "../../../../../core/domain/value-objects"; import type { IPasswordHashingService, ITokenSecretService } from "../../../../../core/ports/system"; import type { Session } from "../../../domain/entities/session"; import type { SignupSession } from "../../../domain/entities/signup-session"; -import { createUserRegistration } from "../../../domain/entities/user-registration"; import type { SessionToken } from "../../../domain/value-objects/tokens"; import type { ISignupRegisterUseCase, diff --git a/apps/api/src/features/auth/application/use-cases/signup/tests/register.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/signup/tests/register.usecase.test.ts index 092ad147..dcb6a205 100644 --- a/apps/api/src/features/auth/application/use-cases/signup/tests/register.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/signup/tests/register.usecase.test.ts @@ -1,4 +1,4 @@ -import { assert, afterEach, describe, expect, it } from "vitest"; +import { afterEach, assert, describe, expect, it } from "vitest"; import { newGender, newUserId } from "../../../../../../core/domain/value-objects"; import { ulid } from "../../../../../../core/lib/id"; import { PasswordHashingServiceMock, TokenSecretServiceMock } from "../../../../../../core/testing/mocks/system"; @@ -6,11 +6,11 @@ import { createUserRegistration } from "../../../../domain/entities/user-registr import { createSignupSessionFixture } from "../../../../testing/fixtures"; import { AuthUserRepositoryMock, - SessionRepositoryMock, - SignupSessionRepositoryMock, createAuthUserMap, createSessionMap, createSignupSessionMap, + SessionRepositoryMock, + SignupSessionRepositoryMock, } from "../../../../testing/mocks/repositories"; import { SignupRegisterUseCase } from "../register.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/signup/tests/request.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/signup/tests/request.usecase.test.ts index f0e6b75c..5af56ff6 100644 --- a/apps/api/src/features/auth/application/use-cases/signup/tests/request.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/signup/tests/request.usecase.test.ts @@ -7,10 +7,10 @@ import { createUserRegistration } from "../../../../domain/entities/user-registr import { createAuthUserFixture, createSignupSessionFixture } from "../../../../testing/fixtures"; import { AuthUserRepositoryMock, - SignupSessionRepositoryMock, createAuthUserMap, createSessionMap, createSignupSessionMap, + SignupSessionRepositoryMock, } from "../../../../testing/mocks/repositories"; import { SignupRequestUseCase } from "../request.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/signup/tests/validate-session.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/signup/tests/validate-session.usecase.test.ts index bab08db2..3a7725cb 100644 --- a/apps/api/src/features/auth/application/use-cases/signup/tests/validate-session.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/signup/tests/validate-session.usecase.test.ts @@ -2,7 +2,7 @@ import { assert, beforeEach, describe, expect, it } from "vitest"; import { TokenSecretServiceMock } from "../../../../../../core/testing/mocks/system"; import { newSignupSessionToken } from "../../../../domain/value-objects/tokens"; import { createSignupSessionFixture } from "../../../../testing/fixtures"; -import { SignupSessionRepositoryMock, createSignupSessionMap } from "../../../../testing/mocks/repositories"; +import { createSignupSessionMap, SignupSessionRepositoryMock } from "../../../../testing/mocks/repositories"; import { SignupValidateSessionUseCase } from "../validate-session.usecase"; const signupSessionMap = createSignupSessionMap(); diff --git a/apps/api/src/features/auth/application/use-cases/signup/tests/verify-email.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/signup/tests/verify-email.usecase.test.ts index 4d644bd2..97e7d80b 100644 --- a/apps/api/src/features/auth/application/use-cases/signup/tests/verify-email.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/signup/tests/verify-email.usecase.test.ts @@ -1,6 +1,6 @@ -import { assert, afterEach, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, assert, beforeEach, describe, expect, it } from "vitest"; import { createSignupSessionFixture } from "../../../../testing/fixtures"; -import { SignupSessionRepositoryMock, createSignupSessionMap } from "../../../../testing/mocks/repositories"; +import { createSignupSessionMap, SignupSessionRepositoryMock } from "../../../../testing/mocks/repositories"; import { SignupVerifyEmailUseCase } from "../verify-email.usecase"; const signupSessionMap = createSignupSessionMap(); diff --git a/apps/api/src/features/auth/application/use-cases/update-email/tests/request.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/update-email/tests/request.usecase.test.ts index 4e408efb..6dd6fb77 100644 --- a/apps/api/src/features/auth/application/use-cases/update-email/tests/request.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/update-email/tests/request.usecase.test.ts @@ -5,10 +5,10 @@ import { decodeToken } from "../../../../domain/value-objects/tokens"; import { createAuthUserFixture, createEmailVerificationRequestFixture } from "../../../../testing/fixtures"; import { AuthUserRepositoryMock, - EmailVerificationRequestRepositoryMock, createAuthUserMap, createEmailVerificationRequestMap, createSessionMap, + EmailVerificationRequestRepositoryMock, } from "../../../../testing/mocks/repositories"; import { UpdateEmailRequestUseCase } from "../request.usecase"; diff --git a/apps/api/src/features/auth/application/use-cases/update-email/tests/verify-email.usecase.test.ts b/apps/api/src/features/auth/application/use-cases/update-email/tests/verify-email.usecase.test.ts index 79287964..4ec77043 100644 --- a/apps/api/src/features/auth/application/use-cases/update-email/tests/verify-email.usecase.test.ts +++ b/apps/api/src/features/auth/application/use-cases/update-email/tests/verify-email.usecase.test.ts @@ -7,11 +7,11 @@ import { } from "../../../../testing/fixtures"; import { AuthUserRepositoryMock, - EmailVerificationRequestRepositoryMock, - SessionRepositoryMock, createAuthUserMap, createEmailVerificationRequestMap, createSessionMap, + EmailVerificationRequestRepositoryMock, + SessionRepositoryMock, } from "../../../../testing/mocks/repositories"; import { UpdateEmailVerifyEmailUseCase } from "../verify-email.usecase"; diff --git a/apps/api/src/features/auth/domain/entities/account-link-request.ts b/apps/api/src/features/auth/domain/entities/account-link-request.ts index c8a78df1..c134e4b8 100644 --- a/apps/api/src/features/auth/domain/entities/account-link-request.ts +++ b/apps/api/src/features/auth/domain/entities/account-link-request.ts @@ -1,5 +1,6 @@ -import type { UserId } from "../../../../core/domain/value-objects"; import { TimeSpan } from "../../../../core/lib/time"; + +import type { UserId } from "../../../../core/domain/value-objects"; import type { IdentityProviders, IdentityProvidersUserId } from "../value-objects/identity-providers"; import type { AccountLinkRequestId } from "../value-objects/ids"; diff --git a/apps/api/src/features/auth/domain/entities/email-verification-request.ts b/apps/api/src/features/auth/domain/entities/email-verification-request.ts index c2bd7f12..f356acbe 100644 --- a/apps/api/src/features/auth/domain/entities/email-verification-request.ts +++ b/apps/api/src/features/auth/domain/entities/email-verification-request.ts @@ -1,5 +1,6 @@ -import type { UserId } from "../../../../core/domain/value-objects"; import { TimeSpan } from "../../../../core/lib/time"; + +import type { UserId } from "../../../../core/domain/value-objects"; import type { EmailVerificationRequestId } from "../value-objects/ids"; export const EMAIL_VERIFICATION_REQUEST_EXPIRES_SPAN_MINUTES = 10 as const; diff --git a/apps/api/src/features/auth/domain/entities/password-reset-session.ts b/apps/api/src/features/auth/domain/entities/password-reset-session.ts index 30c9c289..6338acdc 100644 --- a/apps/api/src/features/auth/domain/entities/password-reset-session.ts +++ b/apps/api/src/features/auth/domain/entities/password-reset-session.ts @@ -1,5 +1,6 @@ -import type { UserId } from "../../../../core/domain/value-objects"; import { TimeSpan } from "../../../../core/lib/time"; + +import type { UserId } from "../../../../core/domain/value-objects"; import type { PasswordResetSessionId } from "../value-objects/ids"; export const PASSWORD_RESET_SESSION_EMAIL_VERIFICATION_EXPIRES_SPAN_MINUTES = 10 as const; diff --git a/apps/api/src/features/auth/domain/entities/provider-link-request.ts b/apps/api/src/features/auth/domain/entities/provider-link-request.ts index a0200125..64270dda 100644 --- a/apps/api/src/features/auth/domain/entities/provider-link-request.ts +++ b/apps/api/src/features/auth/domain/entities/provider-link-request.ts @@ -1,5 +1,6 @@ -import type { UserId } from "../../../../core/domain/value-objects"; import { TimeSpan } from "../../../../core/lib/time"; + +import type { UserId } from "../../../../core/domain/value-objects"; import type { IdentityProviders } from "../value-objects/identity-providers"; import type { ProviderLinkRequestId } from "../value-objects/ids"; diff --git a/apps/api/src/features/auth/domain/entities/session.ts b/apps/api/src/features/auth/domain/entities/session.ts index 240fe262..93fcfeea 100644 --- a/apps/api/src/features/auth/domain/entities/session.ts +++ b/apps/api/src/features/auth/domain/entities/session.ts @@ -1,5 +1,6 @@ -import type { UserId } from "../../../../core/domain/value-objects"; import { TimeSpan } from "../../../../core/lib/time"; + +import type { UserId } from "../../../../core/domain/value-objects"; import type { SessionId } from "../value-objects/ids"; export const SESSION_EXPIRES_SPAN_DAYS = 30 as const; @@ -15,11 +16,7 @@ export interface Session { expiresAt: Date; } -export const createSession = (arg: { - id: SessionId; - userId: UserId; - secretHash: Uint8Array; -}): Session => ({ +export const createSession = (arg: { id: SessionId; userId: UserId; secretHash: Uint8Array }): Session => ({ id: arg.id, userId: arg.userId, secretHash: arg.secretHash, diff --git a/apps/api/src/features/auth/domain/entities/signup-session.ts b/apps/api/src/features/auth/domain/entities/signup-session.ts index 01f11e22..b8db8ea8 100644 --- a/apps/api/src/features/auth/domain/entities/signup-session.ts +++ b/apps/api/src/features/auth/domain/entities/signup-session.ts @@ -1,4 +1,5 @@ import { TimeSpan } from "../../../../core/lib/time"; + import type { SignupSessionId } from "../value-objects/ids"; export const SIGNUP_SESSION_EMAIL_VERIFICATION_EXPIRES_SPAN_MINUTES = 10 as const; diff --git a/apps/api/src/features/auth/domain/entities/user-registration.ts b/apps/api/src/features/auth/domain/entities/user-registration.ts index d11fd765..3f07e416 100644 --- a/apps/api/src/features/auth/domain/entities/user-registration.ts +++ b/apps/api/src/features/auth/domain/entities/user-registration.ts @@ -1,4 +1,6 @@ -import { type Gender, type UserId, newGender } from "../../../../core/domain/value-objects"; +import { newGender } from "../../../../core/domain/value-objects"; + +import type { Gender, UserId } from "../../../../core/domain/value-objects"; export const DEFAULT_USER_GENDER = newGender("male") satisfies Gender; diff --git a/apps/api/src/features/auth/domain/value-objects/identity-providers.ts b/apps/api/src/features/auth/domain/value-objects/identity-providers.ts index f58336d9..b28d3ad5 100644 --- a/apps/api/src/features/auth/domain/value-objects/identity-providers.ts +++ b/apps/api/src/features/auth/domain/value-objects/identity-providers.ts @@ -1,6 +1,7 @@ -import type { Brand } from "@mona-ca/core/types"; import { t } from "elysia"; +import type { Brand } from "@mona-ca/core/types"; + // type export type RawDiscordProvider = "discord"; export type DiscordProvider = Brand<"IdentityProvider", RawDiscordProvider>; diff --git a/apps/api/src/features/auth/index.ts b/apps/api/src/features/auth/index.ts index 049d5326..c8d074ae 100644 --- a/apps/api/src/features/auth/index.ts +++ b/apps/api/src/features/auth/index.ts @@ -1,14 +1,14 @@ -export { toUserIdentitiesResponse } from "./adapters/presenters/user-identities.presenter"; export { toAccountLinkPreviewResponse } from "./adapters/presenters/account-link-request-preview.presenter"; export { toAnyTokenResponse } from "./adapters/presenters/token.presenter"; +export { toUserIdentitiesResponse } from "./adapters/presenters/user-identities.presenter"; export { AuthDIContainer } from "./di/container"; export { identityProvidersSchema, newIdentityProviders } from "./domain/value-objects/identity-providers"; export { - newSignupSessionToken, - newPasswordResetSessionToken, - newEmailVerificationRequestToken, newAccountLinkRequestToken, + newEmailVerificationRequestToken, + newPasswordResetSessionToken, newProviderLinkRequestToken, + newSignupSessionToken, } from "./domain/value-objects/tokens"; export type { IAuthDIContainer } from "./di/container.interface"; diff --git a/apps/api/src/features/auth/infra/hmac-signed-state/hmac-signed-state.service.test.ts b/apps/api/src/features/auth/infra/hmac-signed-state/hmac-signed-state.service.test.ts index cdadec42..09865f37 100644 --- a/apps/api/src/features/auth/infra/hmac-signed-state/hmac-signed-state.service.test.ts +++ b/apps/api/src/features/auth/infra/hmac-signed-state/hmac-signed-state.service.test.ts @@ -1,10 +1,11 @@ -import type { Static } from "@sinclair/typebox"; import { t } from "elysia"; -import { assert, afterEach, describe, expect, it, vi } from "vitest"; +import { afterEach, assert, describe, expect, it, vi } from "vitest"; import { decodeBase64URLSafe, encodeBase64URLSafe } from "../../../../core/lib/encoding"; import { HmacServiceMock } from "../../../../core/testing/mocks/system"; import { HmacSignedStateService } from "./hmac-signed-state.service"; +import type { Static } from "@sinclair/typebox"; + const payloadSchema = t.Object({ clientType: t.String(), locale: t.Optional(t.String()), diff --git a/apps/api/src/features/auth/infra/hmac-signed-state/hmac-signed-state.service.ts b/apps/api/src/features/auth/infra/hmac-signed-state/hmac-signed-state.service.ts index b215bbaf..93addea3 100644 --- a/apps/api/src/features/auth/infra/hmac-signed-state/hmac-signed-state.service.ts +++ b/apps/api/src/features/auth/infra/hmac-signed-state/hmac-signed-state.service.ts @@ -1,9 +1,11 @@ -import { type Err, type Ok, type Result, err, ok } from "@mona-ca/core/result"; -import type { Static, TIntersect, TLiteral, TObject, TString } from "@sinclair/typebox"; +import { err, ok } from "@mona-ca/core/result"; import { Value } from "@sinclair/typebox/value"; import { generateState } from "arctic"; import { t } from "elysia"; import { decodeBase64URLSafe, encodeBase64URLSafe } from "../../../../core/lib/encoding"; + +import type { Err, Ok, Result } from "@mona-ca/core/result"; +import type { Static, TIntersect, TLiteral, TObject, TString } from "@sinclair/typebox"; import type { IHmacService } from "../../../../core/ports/system"; import type { IHmacSignedStateService } from "../../application/ports/out/infra/hmac-signed-state.service.interface"; @@ -69,6 +71,7 @@ export class HmacSignedStateService

impleme return ok(rest as Static); } catch (e) { + // biome-ignore lint/suspicious/noConsole: Logging state decode errors for debugging console.error(e); return err("STATE_DECODE_FAILED"); } diff --git a/apps/api/src/features/auth/lib/redirect-url.ts b/apps/api/src/features/auth/lib/redirect-url.ts index 75bc9a75..19cb3552 100644 --- a/apps/api/src/features/auth/lib/redirect-url.ts +++ b/apps/api/src/features/auth/lib/redirect-url.ts @@ -1,4 +1,5 @@ import { getAPIBaseURL } from "@mona-ca/core/http"; + import type { RawIdentityProviders } from "../domain/value-objects/identity-providers"; export const federatedAuthRedirectURL = (production: boolean, provider: RawIdentityProviders) => { diff --git a/apps/api/src/features/auth/testing/converters/index.ts b/apps/api/src/features/auth/testing/converters/index.ts index 4ac2f1bc..435e7cfc 100644 --- a/apps/api/src/features/auth/testing/converters/index.ts +++ b/apps/api/src/features/auth/testing/converters/index.ts @@ -1,12 +1,12 @@ export { - convertUserCredentialsToRaw, - convertUserRegistrationToRaw, - convertUserRegistrationToUserCredentials, - convertSessionToRaw, - convertProviderAccountToRaw, - convertSignupSessionToRaw, + convertAccountLinkRequestToRaw, convertEmailVerificationRequestToRaw, convertPasswordResetSessionToRaw, - convertAccountLinkRequestToRaw, + convertProviderAccountToRaw, convertProviderLinkRequestToRaw, + convertSessionToRaw, + convertSignupSessionToRaw, + convertUserCredentialsToRaw, + convertUserRegistrationToRaw, + convertUserRegistrationToUserCredentials, } from "./table-raw-converters"; diff --git a/apps/api/src/features/auth/testing/converters/table-raw-converters.ts b/apps/api/src/features/auth/testing/converters/table-raw-converters.ts index e03added..1c59d9ca 100644 --- a/apps/api/src/features/auth/testing/converters/table-raw-converters.ts +++ b/apps/api/src/features/auth/testing/converters/table-raw-converters.ts @@ -1,15 +1,14 @@ -import { - type RawAccountLinkRequest, - type RawEmailVerificationRequest, - type RawPasswordResetSession, - type RawProviderAccount, - type RawProviderLinkRequest, - type RawSession, - type RawSignupSession, - type RawUser, - toRawBoolean, - toRawDate, - toRawUint8Array, +import { toRawBoolean, toRawDate, toRawUint8Array } from "../../../../core/testing/drivers"; + +import type { + RawAccountLinkRequest, + RawEmailVerificationRequest, + RawPasswordResetSession, + RawProviderAccount, + RawProviderLinkRequest, + RawSession, + RawSignupSession, + RawUser, } from "../../../../core/testing/drivers"; import type { AccountLinkRequest } from "../../domain/entities/account-link-request"; import type { EmailVerificationRequest } from "../../domain/entities/email-verification-request"; diff --git a/apps/api/src/features/auth/testing/fixtures/account-link-request.fixture.ts b/apps/api/src/features/auth/testing/fixtures/account-link-request.fixture.ts index 79125975..bf53f9fe 100644 --- a/apps/api/src/features/auth/testing/fixtures/account-link-request.fixture.ts +++ b/apps/api/src/features/auth/testing/fixtures/account-link-request.fixture.ts @@ -1,10 +1,13 @@ import { newUserId } from "../../../../core/domain/value-objects"; import { ulid } from "../../../../core/lib/id"; import { TokenSecretServiceMock } from "../../../../core/testing/mocks/system"; -import { type AccountLinkRequest, accountLinkRequestExpiresSpan } from "../../domain/entities/account-link-request"; +import { accountLinkRequestExpiresSpan } from "../../domain/entities/account-link-request"; import { newIdentityProviders, newIdentityProvidersUserId } from "../../domain/value-objects/identity-providers"; import { newAccountLinkRequestId } from "../../domain/value-objects/ids"; -import { type AccountLinkRequestToken, encodeToken } from "../../domain/value-objects/tokens"; +import { encodeToken } from "../../domain/value-objects/tokens"; + +import type { AccountLinkRequest } from "../../domain/entities/account-link-request"; +import type { AccountLinkRequestToken } from "../../domain/value-objects/tokens"; const tokenSecretService = new TokenSecretServiceMock(); diff --git a/apps/api/src/features/auth/testing/fixtures/auth-user.fixture.ts b/apps/api/src/features/auth/testing/fixtures/auth-user.fixture.ts index a9371a37..83fded46 100644 --- a/apps/api/src/features/auth/testing/fixtures/auth-user.fixture.ts +++ b/apps/api/src/features/auth/testing/fixtures/auth-user.fixture.ts @@ -1,5 +1,6 @@ import { newGender, newUserId } from "../../../../core/domain/value-objects"; import { ulid } from "../../../../core/lib/id"; + import type { UserCredentials } from "../../domain/entities/user-credentials"; import type { UserRegistration } from "../../domain/entities/user-registration"; diff --git a/apps/api/src/features/auth/testing/fixtures/email-verification-request.fixture.ts b/apps/api/src/features/auth/testing/fixtures/email-verification-request.fixture.ts index ed852ad1..5d1f9f86 100644 --- a/apps/api/src/features/auth/testing/fixtures/email-verification-request.fixture.ts +++ b/apps/api/src/features/auth/testing/fixtures/email-verification-request.fixture.ts @@ -1,12 +1,12 @@ import { newUserId } from "../../../../core/domain/value-objects"; import { ulid } from "../../../../core/lib/id"; import { TokenSecretServiceMock } from "../../../../core/testing/mocks/system"; -import { - type EmailVerificationRequest, - emailVerificationRequestExpiresSpan, -} from "../../domain/entities/email-verification-request"; +import { emailVerificationRequestExpiresSpan } from "../../domain/entities/email-verification-request"; import { newEmailVerificationRequestId } from "../../domain/value-objects/ids"; -import { type EmailVerificationRequestToken, encodeToken } from "../../domain/value-objects/tokens"; +import { encodeToken } from "../../domain/value-objects/tokens"; + +import type { EmailVerificationRequest } from "../../domain/entities/email-verification-request"; +import type { EmailVerificationRequestToken } from "../../domain/value-objects/tokens"; const tokenSecretService = new TokenSecretServiceMock(); diff --git a/apps/api/src/features/auth/testing/fixtures/index.ts b/apps/api/src/features/auth/testing/fixtures/index.ts index 8d0166ce..9019d3cf 100644 --- a/apps/api/src/features/auth/testing/fixtures/index.ts +++ b/apps/api/src/features/auth/testing/fixtures/index.ts @@ -1,8 +1,8 @@ export { createAccountLinkRequestFixture } from "./account-link-request.fixture"; -export { createProviderLinkRequestFixture } from "./provider-link-request.fixture"; +export { createAuthUserFixture } from "./auth-user.fixture"; export { createEmailVerificationRequestFixture } from "./email-verification-request.fixture"; -export { createProviderAccountFixture } from "./provider-account.fixture"; export { createPasswordResetSessionFixture } from "./password-reset-session.fixture"; +export { createProviderAccountFixture } from "./provider-account.fixture"; +export { createProviderLinkRequestFixture } from "./provider-link-request.fixture"; export { createSessionFixture } from "./session.fixture"; export { createSignupSessionFixture } from "./signup-session.fixture"; -export { createAuthUserFixture } from "./auth-user.fixture"; diff --git a/apps/api/src/features/auth/testing/fixtures/password-reset-session.fixture.ts b/apps/api/src/features/auth/testing/fixtures/password-reset-session.fixture.ts index c2fcecc3..a6c0ec00 100644 --- a/apps/api/src/features/auth/testing/fixtures/password-reset-session.fixture.ts +++ b/apps/api/src/features/auth/testing/fixtures/password-reset-session.fixture.ts @@ -1,12 +1,12 @@ import { newUserId } from "../../../../core/domain/value-objects"; import { ulid } from "../../../../core/lib/id"; import { TokenSecretServiceMock } from "../../../../core/testing/mocks/system"; -import { - type PasswordResetSession, - passwordResetSessionEmailVerificationExpiresSpan, -} from "../../domain/entities/password-reset-session"; +import { passwordResetSessionEmailVerificationExpiresSpan } from "../../domain/entities/password-reset-session"; import { newPasswordResetSessionId } from "../../domain/value-objects/ids"; -import { type PasswordResetSessionToken, encodeToken } from "../../domain/value-objects/tokens"; +import { encodeToken } from "../../domain/value-objects/tokens"; + +import type { PasswordResetSession } from "../../domain/entities/password-reset-session"; +import type { PasswordResetSessionToken } from "../../domain/value-objects/tokens"; const tokenSecretService = new TokenSecretServiceMock(); diff --git a/apps/api/src/features/auth/testing/fixtures/provider-account.fixture.ts b/apps/api/src/features/auth/testing/fixtures/provider-account.fixture.ts index f90b2417..06d5274c 100644 --- a/apps/api/src/features/auth/testing/fixtures/provider-account.fixture.ts +++ b/apps/api/src/features/auth/testing/fixtures/provider-account.fixture.ts @@ -1,8 +1,9 @@ import { newUserId } from "../../../../core/domain/value-objects"; import { ulid } from "../../../../core/lib/id"; -import type { ProviderAccount } from "../../domain/entities/provider-account"; import { newIdentityProviders, newIdentityProvidersUserId } from "../../domain/value-objects/identity-providers"; +import type { ProviderAccount } from "../../domain/entities/provider-account"; + export const createProviderAccountFixture = (override?: { providerAccount?: Partial; }): { diff --git a/apps/api/src/features/auth/testing/fixtures/provider-link-request.fixture.ts b/apps/api/src/features/auth/testing/fixtures/provider-link-request.fixture.ts index ae3af464..eba9d997 100644 --- a/apps/api/src/features/auth/testing/fixtures/provider-link-request.fixture.ts +++ b/apps/api/src/features/auth/testing/fixtures/provider-link-request.fixture.ts @@ -1,10 +1,13 @@ import { newUserId } from "../../../../core/domain/value-objects"; import { ulid } from "../../../../core/lib/id"; import { TokenSecretServiceMock } from "../../../../core/testing/mocks/system"; -import { type ProviderLinkRequest, providerLinkRequestExpiresSpan } from "../../domain/entities/provider-link-request"; +import { providerLinkRequestExpiresSpan } from "../../domain/entities/provider-link-request"; import { newIdentityProviders } from "../../domain/value-objects/identity-providers"; import { newProviderLinkRequestId } from "../../domain/value-objects/ids"; -import { type ProviderLinkRequestToken, encodeToken } from "../../domain/value-objects/tokens"; +import { encodeToken } from "../../domain/value-objects/tokens"; + +import type { ProviderLinkRequest } from "../../domain/entities/provider-link-request"; +import type { ProviderLinkRequestToken } from "../../domain/value-objects/tokens"; const tokenSecretService = new TokenSecretServiceMock(); diff --git a/apps/api/src/features/auth/testing/fixtures/session.fixture.ts b/apps/api/src/features/auth/testing/fixtures/session.fixture.ts index 7c55632d..cc4dd37f 100644 --- a/apps/api/src/features/auth/testing/fixtures/session.fixture.ts +++ b/apps/api/src/features/auth/testing/fixtures/session.fixture.ts @@ -1,9 +1,12 @@ import { newUserId } from "../../../../core/domain/value-objects"; import { ulid } from "../../../../core/lib/id"; import { TokenSecretServiceMock } from "../../../../core/testing/mocks/system"; -import { type Session, sessionExpiresSpan } from "../../domain/entities/session"; +import { sessionExpiresSpan } from "../../domain/entities/session"; import { newSessionId } from "../../domain/value-objects/ids"; -import { type SessionToken, encodeToken } from "../../domain/value-objects/tokens"; +import { encodeToken } from "../../domain/value-objects/tokens"; + +import type { Session } from "../../domain/entities/session"; +import type { SessionToken } from "../../domain/value-objects/tokens"; const tokenSecretService = new TokenSecretServiceMock(); diff --git a/apps/api/src/features/auth/testing/fixtures/signup-session.fixture.ts b/apps/api/src/features/auth/testing/fixtures/signup-session.fixture.ts index b9aee0d4..9bf87a7b 100644 --- a/apps/api/src/features/auth/testing/fixtures/signup-session.fixture.ts +++ b/apps/api/src/features/auth/testing/fixtures/signup-session.fixture.ts @@ -1,8 +1,11 @@ import { ulid } from "../../../../core/lib/id"; import { TokenSecretServiceMock } from "../../../../core/testing/mocks/system"; -import { type SignupSession, signupSessionEmailVerificationExpiresSpan } from "../../domain/entities/signup-session"; +import { signupSessionEmailVerificationExpiresSpan } from "../../domain/entities/signup-session"; import { newSignupSessionId } from "../../domain/value-objects/ids"; -import { type SignupSessionToken, encodeToken } from "../../domain/value-objects/tokens"; +import { encodeToken } from "../../domain/value-objects/tokens"; + +import type { SignupSession } from "../../domain/entities/signup-session"; +import type { SignupSessionToken } from "../../domain/value-objects/tokens"; const tokenSecretService = new TokenSecretServiceMock(); diff --git a/apps/api/src/features/auth/testing/mocks/gateways/identity-provider.gateway.mock.ts b/apps/api/src/features/auth/testing/mocks/gateways/identity-provider.gateway.mock.ts index 95f7006d..4fa5768b 100644 --- a/apps/api/src/features/auth/testing/mocks/gateways/identity-provider.gateway.mock.ts +++ b/apps/api/src/features/auth/testing/mocks/gateways/identity-provider.gateway.mock.ts @@ -1,13 +1,14 @@ import { ok } from "@mona-ca/core/result"; -import type { OAuth2Tokens } from "arctic"; import { ulid } from "../../../../../core/lib/id"; +import { newIdentityProvidersUserId } from "../../../domain/value-objects/identity-providers"; + +import type { OAuth2Tokens } from "arctic"; import type { GetTokensResult, GetUserInfoResult, IIdentityProviderGateway, UserInfo, } from "../../../application/ports/out/gateways/identity-provider.gateway.interface"; -import { newIdentityProvidersUserId } from "../../../domain/value-objects/identity-providers"; export class IdentityProviderGatewayMock implements IIdentityProviderGateway { private readonly userInfo: UserInfo = { diff --git a/apps/api/src/features/auth/testing/mocks/infra/hmac-signed-state.service.mock.ts b/apps/api/src/features/auth/testing/mocks/infra/hmac-signed-state.service.mock.ts index 015bc9e5..b22aa4d3 100644 --- a/apps/api/src/features/auth/testing/mocks/infra/hmac-signed-state.service.mock.ts +++ b/apps/api/src/features/auth/testing/mocks/infra/hmac-signed-state.service.mock.ts @@ -1,4 +1,6 @@ -import { type Err, type Ok, type Result, err, ok } from "@mona-ca/core/result"; +import { err, ok } from "@mona-ca/core/result"; + +import type { Err, Ok, Result } from "@mona-ca/core/result"; import type { Static, TObject } from "@sinclair/typebox"; import type { IHmacSignedStateService } from "../../../application/ports/out/infra/hmac-signed-state.service.interface"; diff --git a/apps/api/src/features/auth/testing/mocks/repositories/account-link-request.repository.mock.ts b/apps/api/src/features/auth/testing/mocks/repositories/account-link-request.repository.mock.ts index fd037bb7..4e4db2bd 100644 --- a/apps/api/src/features/auth/testing/mocks/repositories/account-link-request.repository.mock.ts +++ b/apps/api/src/features/auth/testing/mocks/repositories/account-link-request.repository.mock.ts @@ -1,6 +1,8 @@ +import { isExpiredAccountLinkRequest } from "../../../domain/entities/account-link-request"; + import type { UserId } from "../../../../../core/domain/value-objects"; import type { IAccountLinkRequestRepository } from "../../../application/ports/out/repositories/account-link-request.repository.interface"; -import { type AccountLinkRequest, isExpiredAccountLinkRequest } from "../../../domain/entities/account-link-request"; +import type { AccountLinkRequest } from "../../../domain/entities/account-link-request"; import type { AccountLinkRequestId } from "../../../domain/value-objects/ids"; export class AccountLinkRequestRepositoryMock implements IAccountLinkRequestRepository { diff --git a/apps/api/src/features/auth/testing/mocks/repositories/email-verification-request.repository.mock.ts b/apps/api/src/features/auth/testing/mocks/repositories/email-verification-request.repository.mock.ts index 174f8f5e..31a87a94 100644 --- a/apps/api/src/features/auth/testing/mocks/repositories/email-verification-request.repository.mock.ts +++ b/apps/api/src/features/auth/testing/mocks/repositories/email-verification-request.repository.mock.ts @@ -1,9 +1,8 @@ +import { isExpiredEmailVerificationRequest } from "../../../domain/entities/email-verification-request"; + import type { UserId } from "../../../../../core/domain/value-objects"; import type { IEmailVerificationRequestRepository } from "../../../application/ports/out/repositories/email-verification-request.repository.interface"; -import { - type EmailVerificationRequest, - isExpiredEmailVerificationRequest, -} from "../../../domain/entities/email-verification-request"; +import type { EmailVerificationRequest } from "../../../domain/entities/email-verification-request"; import type { EmailVerificationRequestId } from "../../../domain/value-objects/ids"; export class EmailVerificationRequestRepositoryMock implements IEmailVerificationRequestRepository { diff --git a/apps/api/src/features/auth/testing/mocks/repositories/index.ts b/apps/api/src/features/auth/testing/mocks/repositories/index.ts index c71f1224..d92ec98e 100644 --- a/apps/api/src/features/auth/testing/mocks/repositories/index.ts +++ b/apps/api/src/features/auth/testing/mocks/repositories/index.ts @@ -6,15 +6,14 @@ export { ProviderAccountRepositoryMock } from "./provider-account.repository.moc export { ProviderLinkRequestRepositoryMock } from "./provider-link-request.repository.mock"; export { SessionRepositoryMock } from "./session.repository.mock"; export { SignupSessionRepositoryMock } from "./signup-session.repository.mock"; - export { + createAccountLinkRequestMap, createAuthUserMap, - createSessionMap, - createPasswordResetSessionMap, createEmailVerificationRequestMap, - createAccountLinkRequestMap, - createProviderLinkRequestMap, - createProviderAccountMap, + createPasswordResetSessionMap, createProviderAccountKey, + createProviderAccountMap, + createProviderLinkRequestMap, + createSessionMap, createSignupSessionMap, } from "./table-maps"; diff --git a/apps/api/src/features/auth/testing/mocks/repositories/provider-link-request.repository.mock.ts b/apps/api/src/features/auth/testing/mocks/repositories/provider-link-request.repository.mock.ts index afe47b8c..6d9d67e2 100644 --- a/apps/api/src/features/auth/testing/mocks/repositories/provider-link-request.repository.mock.ts +++ b/apps/api/src/features/auth/testing/mocks/repositories/provider-link-request.repository.mock.ts @@ -1,6 +1,8 @@ +import { isExpiredProviderLinkRequest } from "../../../domain/entities/provider-link-request"; + import type { UserId } from "../../../../../core/domain/value-objects"; import type { IProviderLinkRequestRepository } from "../../../application/ports/out/repositories/provider-link-request.repository.interface"; -import { type ProviderLinkRequest, isExpiredProviderLinkRequest } from "../../../domain/entities/provider-link-request"; +import type { ProviderLinkRequest } from "../../../domain/entities/provider-link-request"; import type { ProviderLinkRequestId } from "../../../domain/value-objects/ids"; export class ProviderLinkRequestRepositoryMock implements IProviderLinkRequestRepository { diff --git a/apps/api/src/features/user/adapters/repositories/user-profile/tests/save.test.ts b/apps/api/src/features/user/adapters/repositories/user-profile/tests/save.test.ts index 3fc6be1b..b7398cc0 100644 --- a/apps/api/src/features/user/adapters/repositories/user-profile/tests/save.test.ts +++ b/apps/api/src/features/user/adapters/repositories/user-profile/tests/save.test.ts @@ -2,12 +2,13 @@ import { env } from "cloudflare:test"; import { afterEach, describe, expect, test } from "vitest"; import { newGender } from "../../../../../../core/domain/value-objects"; import { DrizzleService } from "../../../../../../core/infra/drizzle"; -import { UsersTableDriver, toRawBoolean, toRawDate } from "../../../../../../core/testing/drivers"; -import type { UserProfile } from "../../../../domain/entities/user-profile"; +import { toRawBoolean, toRawDate, UsersTableDriver } from "../../../../../../core/testing/drivers"; import { convertUserProfileToRaw } from "../../../../testing/converters/converters"; import { createUserProfileFixture } from "../../../../testing/fixtures/user-profile.fixture"; import { UserProfileRepository } from "../user-profile.repository"; +import type { UserProfile } from "../../../../domain/entities/user-profile"; + const { DB } = env; const drizzleService = new DrizzleService(DB); diff --git a/apps/api/src/features/user/adapters/repositories/user-profile/user-profile.repository.ts b/apps/api/src/features/user/adapters/repositories/user-profile/user-profile.repository.ts index 9a222330..09441834 100644 --- a/apps/api/src/features/user/adapters/repositories/user-profile/user-profile.repository.ts +++ b/apps/api/src/features/user/adapters/repositories/user-profile/user-profile.repository.ts @@ -1,5 +1,7 @@ import { eq } from "drizzle-orm"; -import { type Gender, type UserId, newGender, newUserId } from "../../../../../core/domain/value-objects"; +import { newGender, newUserId } from "../../../../../core/domain/value-objects"; + +import type { Gender, UserId } from "../../../../../core/domain/value-objects"; import type { DrizzleService } from "../../../../../core/infra/drizzle"; import type { IUserProfileRepository } from "../../../application/ports/out/repositories/user-profile.repository.interface"; import type { UserProfile } from "../../../domain/entities/user-profile"; diff --git a/apps/api/src/features/user/application/use-cases/user-profile/get-user-profile.usecase.ts b/apps/api/src/features/user/application/use-cases/user-profile/get-user-profile.usecase.ts index dada4d95..f4f27828 100644 --- a/apps/api/src/features/user/application/use-cases/user-profile/get-user-profile.usecase.ts +++ b/apps/api/src/features/user/application/use-cases/user-profile/get-user-profile.usecase.ts @@ -1,4 +1,5 @@ import { err, ok } from "@mona-ca/core/result"; + import type { UserId } from "../../../../../core/domain/value-objects"; import type { GetUserProfileUseCaseResult, diff --git a/apps/api/src/features/user/application/use-cases/user-profile/tests/get-user-profile.usecase.test.ts b/apps/api/src/features/user/application/use-cases/user-profile/tests/get-user-profile.usecase.test.ts index 33a25712..fe11f508 100644 --- a/apps/api/src/features/user/application/use-cases/user-profile/tests/get-user-profile.usecase.test.ts +++ b/apps/api/src/features/user/application/use-cases/user-profile/tests/get-user-profile.usecase.test.ts @@ -2,7 +2,7 @@ import { assert, beforeEach, describe, expect, it } from "vitest"; import { newGender, newUserId } from "../../../../../../core/domain/value-objects"; import { ulid } from "../../../../../../core/lib/id"; import { createUserProfileFixture } from "../../../../testing/fixtures"; -import { UserProfileRepositoryMock, createUserProfileMap } from "../../../../testing/mocks/repositories"; +import { createUserProfileMap, UserProfileRepositoryMock } from "../../../../testing/mocks/repositories"; import { GetUserProfileUseCase } from "../get-user-profile.usecase"; const userProfileMap = createUserProfileMap(); diff --git a/apps/api/src/features/user/application/use-cases/user-profile/tests/update-user-profile.usecase.test.ts b/apps/api/src/features/user/application/use-cases/user-profile/tests/update-user-profile.usecase.test.ts index ef838ad3..caf287ba 100644 --- a/apps/api/src/features/user/application/use-cases/user-profile/tests/update-user-profile.usecase.test.ts +++ b/apps/api/src/features/user/application/use-cases/user-profile/tests/update-user-profile.usecase.test.ts @@ -2,7 +2,7 @@ import { assert, beforeEach, describe, expect, it } from "vitest"; import { newGender, newUserId } from "../../../../../../core/domain/value-objects"; import { ulid } from "../../../../../../core/lib/id"; import { createUserProfileFixture } from "../../../../testing/fixtures"; -import { UserProfileRepositoryMock, createUserProfileMap } from "../../../../testing/mocks/repositories"; +import { createUserProfileMap, UserProfileRepositoryMock } from "../../../../testing/mocks/repositories"; import { UpdateUserProfileUseCase } from "../update-user-profile.usecase"; const userProfileMap = createUserProfileMap(); diff --git a/apps/api/src/features/user/application/use-cases/user-profile/update-user-profile.usecase.ts b/apps/api/src/features/user/application/use-cases/user-profile/update-user-profile.usecase.ts index 553fd56c..895d8e96 100644 --- a/apps/api/src/features/user/application/use-cases/user-profile/update-user-profile.usecase.ts +++ b/apps/api/src/features/user/application/use-cases/user-profile/update-user-profile.usecase.ts @@ -1,12 +1,12 @@ import { err, ok } from "@mona-ca/core/result"; -import type { UserId } from "../../../../../core/domain/value-objects"; import { updateUserProfile } from "../../../domain/entities/user-profile"; + +import type { UserId } from "../../../../../core/domain/value-objects"; import type { IUpdateUserProfileUseCase, UpdateUserProfileDto, UpdateUserProfileUseCaseResult, } from "../../ports/in/user-profile/update-user-profile.usecase.interface"; - import type { IUserProfileRepository } from "../../ports/out/repositories/user-profile.repository.interface"; export class UpdateUserProfileUseCase implements IUpdateUserProfileUseCase { diff --git a/apps/api/src/features/user/index.ts b/apps/api/src/features/user/index.ts index 3775fca6..e8da0c06 100644 --- a/apps/api/src/features/user/index.ts +++ b/apps/api/src/features/user/index.ts @@ -1,5 +1,5 @@ -export { UserDIContainer } from "./di/container"; export { toUserProfileResponse } from "./adapters/presenters/user-profile.presenter"; -export type { UpdateUserProfileDto } from "./application/ports/in/user-profile/update-user-profile.usecase.interface"; +export { UserDIContainer } from "./di/container"; +export type { UpdateUserProfileDto } from "./application/ports/in/user-profile/update-user-profile.usecase.interface"; export type { IUserDIContainer } from "./di/container.interface"; diff --git a/apps/api/src/features/user/testing/converters/converters.ts b/apps/api/src/features/user/testing/converters/converters.ts index 5dec4921..adc75368 100644 --- a/apps/api/src/features/user/testing/converters/converters.ts +++ b/apps/api/src/features/user/testing/converters/converters.ts @@ -1,5 +1,6 @@ -import type { RawUser } from "../../../../core/testing/drivers/users.table.driver"; import { toRawBoolean, toRawDate } from "../../../../core/testing/drivers/utils"; + +import type { RawUser } from "../../../../core/testing/drivers/users.table.driver"; import type { UserProfile } from "../../domain/entities/user-profile"; export const convertUserProfileToRaw = (userProfile: UserProfile, passwordHash?: string | null): RawUser => { diff --git a/apps/api/src/features/user/testing/fixtures/user-profile.fixture.ts b/apps/api/src/features/user/testing/fixtures/user-profile.fixture.ts index 15020b5b..685619f0 100644 --- a/apps/api/src/features/user/testing/fixtures/user-profile.fixture.ts +++ b/apps/api/src/features/user/testing/fixtures/user-profile.fixture.ts @@ -1,5 +1,6 @@ import { newGender, newUserId } from "../../../../core/domain/value-objects"; import { ulid } from "../../../../core/lib/id"; + import type { UserProfile } from "../../domain/entities/user-profile"; export const createUserProfileFixture = (override?: { diff --git a/apps/api/src/features/user/testing/mocks/repositories/index.ts b/apps/api/src/features/user/testing/mocks/repositories/index.ts index 19d26fe5..397fae87 100644 --- a/apps/api/src/features/user/testing/mocks/repositories/index.ts +++ b/apps/api/src/features/user/testing/mocks/repositories/index.ts @@ -1,2 +1,2 @@ -export { UserProfileRepositoryMock } from "./user-profile.repository.mock"; export { createUserProfileMap } from "./table-maps"; +export { UserProfileRepositoryMock } from "./user-profile.repository.mock"; diff --git a/apps/api/src/plugins/auth/auth.plugin.ts b/apps/api/src/plugins/auth/auth.plugin.ts index b6dc76c2..08fbb039 100644 --- a/apps/api/src/plugins/auth/auth.plugin.ts +++ b/apps/api/src/plugins/auth/auth.plugin.ts @@ -1,13 +1,14 @@ -import { AUTHORIZATION_HEADER_NAME, SESSION_COOKIE_NAME, readBearerToken } from "@mona-ca/core/http"; +import { AUTHORIZATION_HEADER_NAME, readBearerToken, SESSION_COOKIE_NAME } from "@mona-ca/core/http"; import { Elysia, status, t } from "elysia"; import { match } from "ts-pattern"; import { isMobilePlatform, isWebPlatform } from "../../core/domain/value-objects"; -import type { Session } from "../../features/auth/domain/entities/session"; -import type { UserCredentials } from "../../features/auth/domain/entities/user-credentials"; import { newSessionToken } from "../../features/auth/domain/value-objects/tokens"; import { clientPlatformPlugin } from "../client-platform"; import { containerPlugin } from "../container"; +import type { Session } from "../../features/auth/domain/entities/session"; +import type { UserCredentials } from "../../features/auth/domain/entities/user-credentials"; + export const unauthorizedResponse = status("Unauthorized", { code: "UNAUTHORIZED", message: "It looks like you are not authenticated. Please login again.", @@ -49,6 +50,7 @@ export const authPlugin = (options .guard({ schema: "standalone", headers: t.Object({ + // biome-ignore lint/suspicious/noTemplateCurlyInString: This is Elysia's type definition syntax, not a template string [AUTHORIZATION_HEADER_NAME]: t.Optional(t.TemplateLiteral("Bearer ${string}")), }), cookie: t.Cookie({ @@ -90,7 +92,7 @@ export const authPlugin = (options } if (withEmailVerification && !userCredentials.emailVerified) { - // biome-ignore lint/suspicious/noExplicitAny: + // biome-ignore lint/suspicious/noExplicitAny: Type narrowing limitation with conditional return types return requiredEmailVerificationResponse as any; } diff --git a/apps/api/src/plugins/auth/tests/session-cookie-refresh.test.ts b/apps/api/src/plugins/auth/tests/session-cookie-refresh.test.ts index 1830d04c..c0f555d1 100644 --- a/apps/api/src/plugins/auth/tests/session-cookie-refresh.test.ts +++ b/apps/api/src/plugins/auth/tests/session-cookie-refresh.test.ts @@ -1,7 +1,7 @@ import { env } from "cloudflare:test"; import { SESSION_COOKIE_NAME } from "@mona-ca/core/http"; import { Elysia } from "elysia"; -import { assert, afterEach, beforeEach, describe, expect, test } from "vitest"; +import { afterEach, assert, beforeEach, describe, expect, test } from "vitest"; import { TokenSecretService } from "../../../core/infra/crypto"; import { SessionsTableDriver, UsersTableDriver } from "../../../core/testing/drivers"; import { sessionRefreshSpan } from "../../../features/auth/domain/entities/session"; diff --git a/apps/api/src/plugins/container/container.plugin.ts b/apps/api/src/plugins/container/container.plugin.ts index 71f59260..a58666db 100644 --- a/apps/api/src/plugins/container/container.plugin.ts +++ b/apps/api/src/plugins/container/container.plugin.ts @@ -1,13 +1,13 @@ import Elysia from "elysia"; -import { CoreDIContainer, type ICoreDIContainer } from "../../core/di"; -import { - type CloudflareBindings, - type EnvVariables, - cloudflareBindings, - envVariables, -} from "../../core/infra/config/env"; -import { AuthDIContainer, type IAuthDIContainer } from "../../features/auth"; -import { type IUserDIContainer, UserDIContainer } from "../../features/user"; +import { CoreDIContainer } from "../../core/di"; +import { cloudflareBindings, envVariables } from "../../core/infra/config/env"; +import { AuthDIContainer } from "../../features/auth"; +import { UserDIContainer } from "../../features/user"; + +import type { ICoreDIContainer } from "../../core/di"; +import type { CloudflareBindings, EnvVariables } from "../../core/infra/config/env"; +import type { IAuthDIContainer } from "../../features/auth"; +import type { IUserDIContainer } from "../../features/user"; export type DIContainers = { core: ICoreDIContainer; diff --git a/apps/api/src/plugins/openapi/path-detail.ts b/apps/api/src/plugins/openapi/path-detail.ts index 2976f457..f0f6c1cf 100644 --- a/apps/api/src/plugins/openapi/path-detail.ts +++ b/apps/api/src/plugins/openapi/path-detail.ts @@ -1,4 +1,5 @@ import { CLIENT_PLATFORM_HEADER_NAME, SESSION_COOKIE_NAME } from "@mona-ca/core/http"; + import type { DocumentDecoration } from "elysia"; import type { Tag } from "./tag"; diff --git a/apps/api/src/plugins/openapi/security-scheme.ts b/apps/api/src/plugins/openapi/security-scheme.ts index 83b7c2fe..de62d49e 100644 --- a/apps/api/src/plugins/openapi/security-scheme.ts +++ b/apps/api/src/plugins/openapi/security-scheme.ts @@ -1,4 +1,5 @@ import { SESSION_COOKIE_NAME } from "@mona-ca/core/http"; + import type { OpenAPIV3 } from "openapi-types"; export const securitySchemes = { diff --git a/apps/api/src/plugins/ratelimit/ratelimit.plugin.ts b/apps/api/src/plugins/ratelimit/ratelimit.plugin.ts index 0d55d5d5..a73a5c36 100644 --- a/apps/api/src/plugins/ratelimit/ratelimit.plugin.ts +++ b/apps/api/src/plugins/ratelimit/ratelimit.plugin.ts @@ -1,10 +1,12 @@ -import { type Err, type Ok, type Result, err, ok } from "@mona-ca/core/result"; +import { err, ok } from "@mona-ca/core/result"; import { Ratelimit } from "@upstash/ratelimit"; import { Redis } from "@upstash/redis/cloudflare"; import Elysia from "elysia"; import { env } from "../../core/infra/config/env"; import { ipAddressPlugin } from "../ip-address"; +import type { Err, Ok, Result } from "@mona-ca/core/result"; + type LimiterConfig = { maxTokens: number; refillRate: number; diff --git a/apps/api/src/routes/auth/federated-auth/callback.route.ts b/apps/api/src/routes/auth/federated-auth/callback.route.ts index 69f57679..93713a1b 100644 --- a/apps/api/src/routes/auth/federated-auth/callback.route.ts +++ b/apps/api/src/routes/auth/federated-auth/callback.route.ts @@ -1,10 +1,10 @@ import { ACCOUNT_LINK_REQUEST_COOKIE_NAME, + normalizeRedirectableMobileScheme, OAUTH_CODE_VERIFIER_COOKIE_NAME, OAUTH_REDIRECT_URI_COOKIE_NAME, OAUTH_STATE_COOKIE_NAME, SESSION_COOKIE_NAME, - normalizeRedirectableMobileScheme, } from "@mona-ca/core/http"; import { Elysia, t } from "elysia"; import { match } from "ts-pattern"; diff --git a/apps/api/src/routes/auth/signup/register.route.ts b/apps/api/src/routes/auth/signup/register.route.ts index 3f18ead5..e1086fc2 100644 --- a/apps/api/src/routes/auth/signup/register.route.ts +++ b/apps/api/src/routes/auth/signup/register.route.ts @@ -1,8 +1,7 @@ import { SESSION_COOKIE_NAME, SIGNUP_SESSION_COOKIE_NAME } from "@mona-ca/core/http"; import { Elysia, t } from "elysia"; import { match } from "ts-pattern"; -import { genderSchema, newGender } from "../../../core/domain/value-objects"; -import { isMobilePlatform, isWebPlatform } from "../../../core/domain/value-objects"; +import { genderSchema, isMobilePlatform, isWebPlatform, newGender } from "../../../core/domain/value-objects"; import { defaultCookieOptions } from "../../../core/infra/elysia"; import { newSignupSessionToken, toAnyTokenResponse } from "../../../features/auth"; import { clientPlatformPlugin } from "../../../plugins/client-platform"; diff --git a/apps/api/src/routes/index.ts b/apps/api/src/routes/index.ts index 229b75e7..10579313 100644 --- a/apps/api/src/routes/index.ts +++ b/apps/api/src/routes/index.ts @@ -1,13 +1,12 @@ -import { cors as corsPlugin } from "@elysiajs/cors"; import { AUTHORIZATION_HEADER_NAME, CLIENT_PLATFORM_HEADER_NAME, CONTENT_TYPE_HEADER_NAME } from "@mona-ca/core/http"; +import { cors as corsPlugin } from "@elysiajs/cors"; import { Elysia } from "elysia"; import { CloudflareAdapter } from "elysia/adapter/cloudflare-worker"; import { env } from "../core/infra/config/env"; import { DEV_ORIGIN_REGEX, PROD_ORIGIN_REGEX } from "../core/lib/http"; import { containerPlugin } from "../plugins/container"; import { ipAddressPlugin } from "../plugins/ip-address"; -import { openapiPlugin } from "../plugins/openapi"; -import { pathDetail } from "../plugins/openapi"; +import { openapiPlugin, pathDetail } from "../plugins/openapi"; import { AuthRoutes } from "./auth"; import { UsersRoutes } from "./users"; diff --git a/apps/api/src/routes/users/me/email/verify.route.ts b/apps/api/src/routes/users/me/email/verify.route.ts index 73376d95..6ae2ee49 100644 --- a/apps/api/src/routes/users/me/email/verify.route.ts +++ b/apps/api/src/routes/users/me/email/verify.route.ts @@ -3,8 +3,7 @@ import { Elysia, t } from "elysia"; import { match } from "ts-pattern"; import { isMobilePlatform, isWebPlatform } from "../../../../core/domain/value-objects"; import { defaultCookieOptions, noContent } from "../../../../core/infra/elysia"; -import { toAnyTokenResponse } from "../../../../features/auth"; -import { newEmailVerificationRequestToken } from "../../../../features/auth"; +import { newEmailVerificationRequestToken, toAnyTokenResponse } from "../../../../features/auth"; import { authPlugin } from "../../../../plugins/auth"; import { containerPlugin } from "../../../../plugins/container"; import { pathDetail } from "../../../../plugins/openapi"; diff --git a/apps/api/src/routes/users/me/identities/federated/callback.route.ts b/apps/api/src/routes/users/me/identities/federated/callback.route.ts index 7429ab12..3c17d918 100644 --- a/apps/api/src/routes/users/me/identities/federated/callback.route.ts +++ b/apps/api/src/routes/users/me/identities/federated/callback.route.ts @@ -1,9 +1,9 @@ import { + normalizeRedirectableMobileScheme, OAUTH_CODE_VERIFIER_COOKIE_NAME, OAUTH_REDIRECT_URI_COOKIE_NAME, OAUTH_STATE_COOKIE_NAME, SESSION_COOKIE_NAME, - normalizeRedirectableMobileScheme, } from "@mona-ca/core/http"; import { Elysia, t } from "elysia"; import { match } from "ts-pattern"; diff --git a/apps/api/src/routes/users/me/profile/update.route.ts b/apps/api/src/routes/users/me/profile/update.route.ts index b134bc76..1b93bac2 100644 --- a/apps/api/src/routes/users/me/profile/update.route.ts +++ b/apps/api/src/routes/users/me/profile/update.route.ts @@ -1,11 +1,13 @@ import { Elysia, t } from "elysia"; import { match } from "ts-pattern"; import { genderSchema, newGender } from "../../../../core/domain/value-objects"; -import { type UpdateUserProfileDto, toUserProfileResponse } from "../../../../features/user"; +import { toUserProfileResponse } from "../../../../features/user"; import { authPlugin, unauthorizedResponse } from "../../../../plugins/auth"; import { containerPlugin } from "../../../../plugins/container"; import { pathDetail } from "../../../../plugins/openapi"; +import type { UpdateUserProfileDto } from "../../../../features/user"; + export const ProfileUpdateRoute = new Elysia() // Local Middleware & Plugin .use(containerPlugin()) From 7516c165d3f88179dcc99af56ba500831f5158b5 Mon Sep 17 00:00:00 2001 From: koutyuke Date: Thu, 1 Jan 2026 00:52:35 +0900 Subject: [PATCH 07/21] =?UTF-8?q?=F0=9F=94=A7=20chore(web):=20update=20bio?= =?UTF-8?q?me.json=20includes=20path,=20enhance=20tailwind.config.ts=20wit?= =?UTF-8?q?h=20import=20spacing,=20and=20refactor=20layout.tsx=20and=20pag?= =?UTF-8?q?e.tsx=20for=20improved=20readability=20and=20consistency=20in?= =?UTF-8?q?=20button=20type=20attributes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/biome.json | 4 +--- apps/web/src/app/layout.tsx | 10 ++++------ apps/web/src/app/page.tsx | 8 ++++---- apps/web/src/styles/global.css | 2 +- apps/web/tailwind.config.ts | 1 + 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/apps/web/biome.json b/apps/web/biome.json index 0e1c04e8..e6a4af00 100644 --- a/apps/web/biome.json +++ b/apps/web/biome.json @@ -3,9 +3,7 @@ "extends": "//", "overrides": [ { - "includes": [ - "src/apps/**/*" - ], + "includes": ["src/app/**/*"], "linter": { "rules": { "style": { diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index 688412b2..7e063875 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -1,6 +1,8 @@ -import type { Metadata } from "next"; import { Inter } from "next/font/google"; + +import type { Metadata } from "next"; import "../styles/global.css"; + import type { JSX } from "react"; const inter = Inter({ subsets: ["latin"] }); @@ -10,11 +12,7 @@ export const metadata: Metadata = { // description: "Generated by create turbo", }; -export default function RootLayout({ - children, -}: { - children: React.ReactNode; -}): JSX.Element { +export default function RootLayout({ children }: { children: React.ReactNode }): JSX.Element { return ( {children} diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx index 80d125e3..3dc72c2c 100644 --- a/apps/web/src/app/page.tsx +++ b/apps/web/src/app/page.tsx @@ -27,7 +27,6 @@ export default function Page(): JSX.Element { auth with discord auth with google diff --git a/apps/web/src/styles/global.css b/apps/web/src/styles/global.css index 70212051..cd233ad9 100644 --- a/apps/web/src/styles/global.css +++ b/apps/web/src/styles/global.css @@ -1 +1 @@ -@import '@mona-ca/tailwind-config/global.css'; +@import "@mona-ca/tailwind-config/global.css"; diff --git a/apps/web/tailwind.config.ts b/apps/web/tailwind.config.ts index 82b9d2d5..d37b580b 100644 --- a/apps/web/tailwind.config.ts +++ b/apps/web/tailwind.config.ts @@ -1,4 +1,5 @@ import { baseConfig } from "@mona-ca/tailwind-config"; + import type { Config } from "tailwindcss"; const config = { From e75ee97e37d84e5a1ebd1269de8c1ac67a81b1e7 Mon Sep 17 00:00:00 2001 From: koutyuke Date: Thu, 1 Jan 2026 00:54:59 +0900 Subject: [PATCH 08/21] =?UTF-8?q?=F0=9F=94=A7=20chore(mobile):=20update=20?= =?UTF-8?q?various=20components=20for=20improved=20clarity=20and=20functio?= =?UTF-8?q?nality,=20including=20adjustments=20to=20biome.json,=20tailwind?= =?UTF-8?q?.config.ts,=20layout.tsx,=20and=20user-related=20exports?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/mobile/biome.json | 4 +- apps/mobile/src/app/(auth)/_layout.tsx | 2 +- apps/mobile/src/app/+html.tsx | 10 ++--- apps/mobile/src/app/+not-found.tsx | 4 +- apps/mobile/src/app/_layout.tsx | 2 + .../app/providers/auth-reset-provider.tsx | 11 +++-- apps/mobile/src/layers/app/providers/index.ts | 2 +- .../providers/resettable-jotai-provider.tsx | 6 ++- .../layers/app/providers/theme-provider.tsx | 3 +- apps/mobile/src/layers/app/styles/global.css | 2 +- .../src/layers/entities/session/index.ts | 2 +- .../mobile/src/layers/entities/theme/index.ts | 2 +- .../entities/user/api/get-user-profile.ts | 6 ++- .../entities/user/api/update-user-profile.ts | 6 ++- apps/mobile/src/layers/entities/user/index.ts | 3 +- .../user/model/user-atom/query-atom.ts | 4 +- .../user/model/user-atom/storage-atom.ts | 7 ++-- .../user/model/user-atom/user-atom.ts | 3 +- .../features/auth/api/federated-auth.ts | 5 ++- .../src/layers/features/auth/api/login.ts | 6 ++- .../src/layers/features/auth/api/logout.ts | 5 ++- .../features/auth/api/signup-register.ts | 8 ++-- .../features/auth/api/signup-request.ts | 5 ++- .../layers/features/auth/api/signup-verify.ts | 6 ++- apps/mobile/src/layers/features/auth/index.ts | 24 +++++------ .../features/auth/lib/federated-auth-url.ts | 1 + .../features/auth/model/use-federated-auth.ts | 1 + .../layers/features/auth/model/use-login.ts | 1 + .../layers/features/auth/model/use-signup.ts | 1 + .../agreement-notice/agreement-notice.dev.tsx | 3 +- .../agreement-notice.story.tsx | 3 +- .../agreement-notice/agreement-notice.ui.tsx | 6 +-- .../auth-with-social/auth-with-social.dev.tsx | 3 +- .../auth-with-social.story.tsx | 3 +- .../auth-with-social/auth-with-social.ui.tsx | 3 +- .../ui/auth-with-social/login-with-social.tsx | 7 ++-- .../last-login-method.dev.tsx | 3 +- .../last-login-method.story.tsx | 3 +- .../last-login-method.ui.tsx | 3 +- .../login-with-email/login-with-email.dev.ts | 3 +- .../login-with-email.story.tsx | 3 +- .../ui/login-with-email/login-with-email.tsx | 10 ++--- .../login-with-email/login-with-email.ui.tsx | 42 ++++++++++--------- .../signup-with-email.dev.ts | 3 +- .../signup-with-email.story.tsx | 3 +- .../signup-with-email/signup-with-email.tsx | 10 ++--- .../signup-with-email.ui.tsx | 42 ++++++++++--------- .../ui/turnstile/turnstile-form.story.tsx | 5 ++- .../auth/ui/turnstile/turnstile-form.ui.tsx | 5 ++- .../auth/ui/turnstile/turnstile-modal.ui.tsx | 11 ++--- .../auth/ui/turnstile/turnstile.dev.tsx | 3 +- apps/mobile/src/layers/pages/login/index.ts | 2 +- .../login-page-header/login-page-header.tsx | 2 +- .../login/ui/login-page/login-page.story.tsx | 5 ++- .../pages/login/ui/login-page/login-page.tsx | 3 +- .../login/ui/login-page/login-page.ui.tsx | 11 ++--- .../card-icon/feature-card-icon.story.tsx | 3 +- .../card-icon/feature-card-icon.ui.tsx | 3 +- .../card/feature-card.story.tsx | 3 +- .../feature-carousel/card/feature-card.ui.tsx | 7 ++-- .../feature-carousel.story.tsx | 3 +- .../feature-carousel/feature-carousel.ui.tsx | 20 ++++----- .../onboarding-page/onboading-page.story.tsx | 5 ++- .../ui/onboarding-page/onboarding-page.ui.tsx | 10 ++--- apps/mobile/src/layers/pages/signup/index.ts | 2 +- .../signup-page-header/signup-page-header.tsx | 2 +- .../ui/signup-page/signup-page.story.tsx | 5 ++- .../signup/ui/signup-page/signup-page.ui.tsx | 11 ++--- .../signup-with-email-page-header.tsx | 2 +- .../signup-with-email-page.story.tsx | 5 ++- .../signup-with-email-page.ui.tsx | 5 ++- apps/mobile/src/layers/shared/api/index.ts | 6 +-- .../src/layers/shared/api/tanstack-query.ts | 19 +++++---- .../shared/lib/auth/auth-reset-event-bus.ts | 4 +- .../src/layers/shared/lib/auth/index.ts | 2 +- .../src/layers/shared/lib/storage/atom.ts | 6 +-- .../src/layers/shared/lib/storage/index.ts | 14 +++---- .../layers/shared/lib/storage/json-storage.ts | 1 + .../src/layers/shared/lib/view/index.ts | 2 +- .../discord.story.tsx | 3 +- .../continue-with-method-button/discord.tsx | 7 ++-- .../email.story.tsx | 3 +- .../ui/continue-with-method-button/email.tsx | 7 ++-- .../google.story.tsx | 3 +- .../ui/continue-with-method-button/google.tsx | 7 ++-- .../ui/continue-with-method-button/index.ts | 2 +- .../shared/ui/page-title/page-title.story.tsx | 3 +- .../shared/ui/page-title/page-title.tsx | 3 +- .../src/layers/shared/ui/wave/wave.story.tsx | 3 +- .../mobile/src/layers/shared/ui/wave/wave.tsx | 3 +- .../mobile/src/layers/widgets/layout/index.ts | 4 +- .../layout/ui/page-frame/page-frame.tsx | 7 ++-- .../ui/wave-header/wave-header.story.tsx | 3 +- .../layout/ui/wave-header/wave-header.tsx | 11 ++--- .../layout/ui/wave-header/wave-header.ui.tsx | 11 ++--- apps/mobile/tailwind.config.ts | 1 + apps/mobile/types/declarations.d.ts | 1 - 97 files changed, 319 insertions(+), 245 deletions(-) diff --git a/apps/mobile/biome.json b/apps/mobile/biome.json index 0e1c04e8..416f0f28 100644 --- a/apps/mobile/biome.json +++ b/apps/mobile/biome.json @@ -3,9 +3,7 @@ "extends": "//", "overrides": [ { - "includes": [ - "src/apps/**/*" - ], + "includes": ["src/app/**/*", "**/*.d.ts"], "linter": { "rules": { "style": { diff --git a/apps/mobile/src/app/(auth)/_layout.tsx b/apps/mobile/src/app/(auth)/_layout.tsx index f547c130..51655ead 100644 --- a/apps/mobile/src/app/(auth)/_layout.tsx +++ b/apps/mobile/src/app/(auth)/_layout.tsx @@ -24,7 +24,7 @@ const AuthLayout = () => { }} + options={{ header: () => }} /> diff --git a/apps/mobile/src/app/+html.tsx b/apps/mobile/src/app/+html.tsx index 3573c19a..b57a2b6b 100644 --- a/apps/mobile/src/app/+html.tsx +++ b/apps/mobile/src/app/+html.tsx @@ -9,17 +9,17 @@ export default function Root({ children }: { children: React.ReactNode }) { - - + + - {/* - Disable body scrolling on web. This makes ScrollView components work closer to how they do on native. + {/* + Disable body scrolling on web. This makes ScrollView components work closer to how they do on native. However, body scrolling is often nice to have for mobile web. If you want to enable it, remove this line. */} {/* Using raw CSS styles as an escape-hatch to ensure the background color never flickers in dark-mode. */} - {/* biome-ignore lint/security/noDangerouslySetInnerHtml: */} + {/* biome-ignore lint/security/noDangerouslySetInnerHtml: Required to inject critical CSS for dark mode initialization */}