From a4d81dbfba7982d78dc3e425b5cfa2f6d4a262c8 Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Wed, 25 Mar 2026 22:52:35 +0700 Subject: [PATCH 01/20] chore(vscode): update deprecated typescript settings --- .vscode/settings.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 844b21b..8825ce2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -20,11 +20,11 @@ "**/routeTree.gen.ts": true }, - // Typescript - "typescript.tsdk": "node_modules/typescript/lib", - "typescript.updateImportsOnFileMove.enabled": "prompt", - "typescript.preferences.importModuleSpecifier": "non-relative", - "typescript.preferences.preferTypeOnlyAutoImports": true, + // Javascript/Typescript + "js/ts.tsdk.path": "node_modules/typescript/lib", + "js/ts.updateImportsOnFileMove.enabled": "prompt", + "js/ts.preferences.importModuleSpecifier": "non-relative", + "js/ts.preferences.preferTypeOnlyAutoImports": true, // Extension - Oxc "oxc.enable": true, From e01273b16841701ed306ebe84ef10b2171ef1f2a Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Wed, 25 Mar 2026 22:54:50 +0700 Subject: [PATCH 02/20] chore(oxc): use stable sort config from experimental --- .oxfmtrc.json => .oxfmtrc.jsonc | 18 +- .oxlintrc.json => .oxlintrc.jsonc | 22 +- package.json | 4 +- pnpm-lock.yaml | 387 +++++++++++++++--------------- 4 files changed, 220 insertions(+), 211 deletions(-) rename .oxfmtrc.json => .oxfmtrc.jsonc (81%) rename .oxlintrc.json => .oxlintrc.jsonc (92%) diff --git a/.oxfmtrc.json b/.oxfmtrc.jsonc similarity index 81% rename from .oxfmtrc.json rename to .oxfmtrc.jsonc index 8c46383..647b25f 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.jsonc @@ -8,7 +8,7 @@ "src/lib/database/migrations/", ".agents/", "skills-lock.json", - "CHANGELOG.md" + "CHANGELOG.md", ], "printWidth": 80, "tabWidth": 2, @@ -23,9 +23,11 @@ "bracketSameLine": false, "singleAttributePerLine": false, "arrowParens": "always", - "experimentalSortPackageJson": true, - "experimentalSortImports": { + "sortPackageJson": true, + "sortImports": { "order": "asc", + "newlinesBetween": true, + "sortSideEffects": true, "internalPattern": ["~/"], "groups": [ ["side_effect"], @@ -33,14 +35,14 @@ ["external"], ["internal"], ["parent", "sibling", "index"], - ["style"] - ] + ["style"], + ], }, - "experimentalTailwindcss": { + "sortTailwindcss": { "stylesheet": "./src/ui/styles/app.css", "attributes": ["class", "className", "classNames"], "functions": ["clsx", "twMerge", "cn", "cva"], "preserveDuplicates": false, - "preserveWhitespace": false - } + "preserveWhitespace": false, + }, } diff --git a/.oxlintrc.json b/.oxlintrc.jsonc similarity index 92% rename from .oxlintrc.json rename to .oxlintrc.jsonc index 20be329..83abc80 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.jsonc @@ -6,15 +6,15 @@ "public/", "src/lib/i18n/", "src/lib/database/migrations/", - ".agents/" + ".agents/", ], "env": { "browser": true, - "node": true + "node": true, }, "categories": { "correctness": "error", - "suspicious": "error" + "suspicious": "error", }, "plugins": [ "oxc", @@ -25,7 +25,7 @@ "react", "jsx-a11y", "react-perf", - "import" + "import", ], "rules": { // Correctness @@ -87,7 +87,7 @@ "unicorn/filename-case": ["error", { "case": "kebabCase" }], "react/self-closing-comp": "warn", "import/no-duplicates": "error", - "eslint/func-style": ["error", "declaration"] + "eslint/func-style": ["error", "declaration"], }, "overrides": [ { @@ -96,8 +96,8 @@ "plugins": ["import"], "rules": { "import/no-default-export": "error", - "import/prefer-default-export": "off" - } + "import/prefer-default-export": "off", + }, }, { // Only allow default export in reserved files @@ -105,8 +105,8 @@ "plugins": ["import"], "rules": { "import/no-default-export": "off", - "import/prefer-default-export": "error" - } - } - ] + "import/prefer-default-export": "error", + }, + }, + ], } diff --git a/package.json b/package.json index c9e5b13..f68b1e8 100644 --- a/package.json +++ b/package.json @@ -115,8 +115,8 @@ "drizzle-kit": "^0.31.10", "husky": "^9.1.7", "lint-staged": "^16.4.0", - "oxfmt": "^0.41.0", - "oxlint": "^1.56.0", + "oxfmt": "^0.42.0", + "oxlint": "^1.57.0", "release-it": "^19.2.4", "skills": "^1.4.5", "storybook": "^10.3.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3e0f3d..3bcd149 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,25 +34,25 @@ importers: version: 4.2.2(vite@8.0.2) '@tanstack/react-form': specifier: ^1.28.5 - version: 1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.12))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-form-devtools': specifier: ^0.2.19 version: 0.2.19(@types/react@19.2.14)(csstype@3.2.3)(preact@10.29.0)(react@19.2.4)(solid-js@1.9.10)(vue@3.5.30(typescript@6.0.2)) '@tanstack/react-form-start': specifier: ^1.28.5 - version: 1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.12))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-router': specifier: ^1.168.3 version: 1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-start': specifier: ^1.167.5 - version: 1.167.5(crossws@0.4.1(srvx@0.11.12))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) + version: 1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) '@tanstack/zod-adapter': specifier: ^1.166.9 version: 1.166.9(@tanstack/react-router@1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(zod@4.3.6) better-auth: specifier: ^1.5.6 - version: 1.5.6(0b01dc45a13b6e9cf78d5c2991b2aa38) + version: 1.5.6(49384272fc1f6bfc35ef9ee3d81a244f) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -214,11 +214,11 @@ importers: specifier: ^16.4.0 version: 16.4.0 oxfmt: - specifier: ^0.41.0 - version: 0.41.0 + specifier: ^0.42.0 + version: 0.42.0 oxlint: - specifier: ^1.56.0 - version: 1.56.0 + specifier: ^1.57.0 + version: 1.57.0 release-it: specifier: ^19.2.4 version: 19.2.4(@types/node@25.5.0) @@ -2034,246 +2034,246 @@ packages: '@oxc-project/types@0.122.0': resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} - '@oxfmt/binding-android-arm-eabi@0.41.0': - resolution: {integrity: sha512-REfrqeMKGkfMP+m/ScX4f5jJBSmVNYcpoDF8vP8f8eYPDuPGZmzp56NIUsYmx3h7f6NzC6cE3gqh8GDWrJHCKw==} + '@oxfmt/binding-android-arm-eabi@0.42.0': + resolution: {integrity: sha512-dsqPTYsozeokRjlrt/b4E7Pj0z3eS3Eg74TWQuuKbjY4VttBmA88rB7d50Xrd+TZ986qdXCNeZRPEzZHAe+jow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.41.0': - resolution: {integrity: sha512-s0b1dxNgb2KomspFV2LfogC2XtSJB42POXF4bMCLJyvQmAGos4ZtjGPfQreToQEaY0FQFjz3030ggI36rF1q5g==} + '@oxfmt/binding-android-arm64@0.42.0': + resolution: {integrity: sha512-t+aAjHxcr5eOBphFHdg1ouQU9qmZZoRxnX7UOJSaTwSoKsb6TYezNKO0YbWytGXCECObRqNcUxPoPr0KaraAIg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.41.0': - resolution: {integrity: sha512-EGXGualADbv/ZmamE7/2DbsrYmjoPlAmHEpTL4vapLF4EfVD6fr8/uQDFnPJkUBjiSWFJZtFNsGeN1B6V3owmA==} + '@oxfmt/binding-darwin-arm64@0.42.0': + resolution: {integrity: sha512-ulpSEYMKg61C5bRMZinFHrKJYRoKGVbvMEXA5zM1puX3O9T6Q4XXDbft20yrDijpYWeuG59z3Nabt+npeTsM1A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.41.0': - resolution: {integrity: sha512-WxySJEvdQQYMmyvISH3qDpTvoS0ebnIP63IMxLLWowJyPp/AAH0hdWtlo+iGNK5y3eVfa5jZguwNaQkDKWpGSw==} + '@oxfmt/binding-darwin-x64@0.42.0': + resolution: {integrity: sha512-ttxLKhQYPdFiM8I/Ri37cvqChE4Xa562nNOsZFcv1CKTVLeEozXjKuYClNvxkXmNlcF55nzM80P+CQkdFBu+uQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.41.0': - resolution: {integrity: sha512-Y2kzMkv3U3oyuYaR4wTfGjOTYTXiFC/hXmG0yVASKkbh02BJkvD98Ij8bIevr45hNZ0DmZEgqiXF+9buD4yMYQ==} + '@oxfmt/binding-freebsd-x64@0.42.0': + resolution: {integrity: sha512-Og7QS3yI3tdIKYZ58SXik0rADxIk2jmd+/YvuHRyKULWpG4V2fR5V4hvKm624Mc0cQET35waPXiCQWvjQEjwYQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.41.0': - resolution: {integrity: sha512-ptazDjdUyhket01IjPTT6ULS1KFuBfTUU97osTP96X5y/0oso+AgAaJzuH81oP0+XXyrWIHbRzozSAuQm4p48g==} + '@oxfmt/binding-linux-arm-gnueabihf@0.42.0': + resolution: {integrity: sha512-jwLOw/3CW4H6Vxcry4/buQHk7zm9Ne2YsidzTL1kpiMe4qqrRCwev3dkyWe2YkFmP+iZCQ7zku4KwjcLRoh8ew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.41.0': - resolution: {integrity: sha512-UkoL2OKxFD+56bPEBcdGn+4juTW4HRv/T6w1dIDLnvKKWr6DbarB/mtHXlADKlFiJubJz8pRkttOR7qjYR6lTA==} + '@oxfmt/binding-linux-arm-musleabihf@0.42.0': + resolution: {integrity: sha512-XwXu2vkMtiq2h7tfvN+WA/9/5/1IoGAVCFPiiQUvcAuG3efR97KNcRGM8BetmbYouFotQ2bDal3yyjUx6IPsTg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.41.0': - resolution: {integrity: sha512-gofu0PuumSOHYczD8p62CPY4UF6ee+rSLZJdUXkpwxg6pILiwSDBIouPskjF/5nF3A7QZTz2O9KFNkNxxFN9tA==} + '@oxfmt/binding-linux-arm64-gnu@0.42.0': + resolution: {integrity: sha512-ea7s/XUJoT7ENAtUQDudFe3nkSM3e3Qpz4nJFRdzO2wbgXEcjnchKLEsV3+t4ev3r8nWxIYr9NRjPWtnyIFJVA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.41.0': - resolution: {integrity: sha512-VfVZxL0+6RU86T8F8vKiDBa+iHsr8PAjQmKGBzSCAX70b6x+UOMFl+2dNihmKmUwqkCazCPfYjt6SuAPOeQJ3g==} + '@oxfmt/binding-linux-arm64-musl@0.42.0': + resolution: {integrity: sha512-+JA0YMlSdDqmacygGi2REp57c3fN+tzARD8nwsukx9pkCHK+6DkbAA9ojS4lNKsiBjIW8WWa0pBrBWhdZEqfuw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.41.0': - resolution: {integrity: sha512-bwzokz2eGvdfJbc0i+zXMJ4BBjQPqg13jyWpEEZDOrBCQ91r8KeY2Mi2kUeuMTZNFXju+jcAbAbpyJxRGla0eg==} + '@oxfmt/binding-linux-ppc64-gnu@0.42.0': + resolution: {integrity: sha512-VfnET0j4Y5mdfCzh5gBt0NK28lgn5DKx+8WgSMLYYeSooHhohdbzwAStLki9pNuGy51y4I7IoW8bqwAaCMiJQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.41.0': - resolution: {integrity: sha512-POLM//PCH9uqDeNDwWL3b3DkMmI3oI2cU6hwc2lnztD1o7dzrQs3R9nq555BZ6wI7t2lyhT9CS+CRaz5X0XqLA==} + '@oxfmt/binding-linux-riscv64-gnu@0.42.0': + resolution: {integrity: sha512-gVlCbmBkB0fxBWbhBj9rcxezPydsQHf4MFKeHoTSPicOQ+8oGeTQgQ8EeesSybWeiFPVRx3bgdt4IJnH6nOjAA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.41.0': - resolution: {integrity: sha512-NNK7PzhFqLUwx/G12Xtm6scGv7UITvyGdAR5Y+TlqsG+essnuRWR4jRNODWRjzLZod0T3SayRbnkSIWMBov33w==} + '@oxfmt/binding-linux-riscv64-musl@0.42.0': + resolution: {integrity: sha512-zN5OfstL0avgt/IgvRu0zjQzVh/EPkcLzs33E9LMAzpqlLWiPWeMDZyMGFlSRGOdDjuNmlZBCgj0pFnK5u32TQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.41.0': - resolution: {integrity: sha512-qVf/zDC5cN9eKe4qI/O/m445er1IRl6swsSl7jHkqmOSVfknwCe5JXitYjZca+V/cNJSU/xPlC5EFMabMMFDpw==} + '@oxfmt/binding-linux-s390x-gnu@0.42.0': + resolution: {integrity: sha512-9X6+H2L0qMc2sCAgO9HS03bkGLMKvOFjmEdchaFlany3vNZOjnVui//D8k/xZAtQv2vaCs1reD5KAgPoIU4msA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.41.0': - resolution: {integrity: sha512-ojxYWu7vUb6ysYqVCPHuAPVZHAI40gfZ0PDtZAMwVmh2f0V8ExpPIKoAKr7/8sNbAXJBBpZhs2coypIo2jJX4w==} + '@oxfmt/binding-linux-x64-gnu@0.42.0': + resolution: {integrity: sha512-BajxJ6KQvMMdpXGPWhBGyjb2Jvx4uec0w+wi6TJZ6Tv7+MzPwe0pO8g5h1U0jyFgoaF7mDl6yKPW3ykWcbUJRw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.41.0': - resolution: {integrity: sha512-O2exZLBxoCMIv2vlvcbkdedazJPTdG0VSup+0QUCfYQtx751zCZNboX2ZUOiQ/gDTdhtXvSiot0h6GEGkOyalA==} + '@oxfmt/binding-linux-x64-musl@0.42.0': + resolution: {integrity: sha512-0wV284I6vc5f0AqAhgAbHU2935B4bVpncPoe5n/WzVZY/KnHgqxC8iSFGeSyLWEgstFboIcWkOPck7tqbdHkzA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.41.0': - resolution: {integrity: sha512-N+31/VoL+z+NNBt8viy3I4NaIdPbiYeOnB884LKqvXldaE2dRztdPv3q5ipfZYv0RwFp7JfqS4I27K/DSHCakg==} + '@oxfmt/binding-openharmony-arm64@0.42.0': + resolution: {integrity: sha512-p4BG6HpGnhfgHk1rzZfyR6zcWkE7iLrWxyehHfXUy4Qa5j3e0roglFOdP/Nj5cJJ58MA3isQ5dlfkW2nNEpolw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.41.0': - resolution: {integrity: sha512-Z7NAtu/RN8kjCQ1y5oDD0nTAeRswh3GJ93qwcW51srmidP7XPBmZbLlwERu1W5veCevQJtPS9xmkpcDTYsGIwQ==} + '@oxfmt/binding-win32-arm64-msvc@0.42.0': + resolution: {integrity: sha512-mn//WV60A+IetORDxYieYGAoQso4KnVRRjORDewMcod4irlRe0OSC7YPhhwaexYNPQz/GCFk+v9iUcZ2W22yxQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.41.0': - resolution: {integrity: sha512-uNxxP3l4bJ6VyzIeRqCmBU2Q0SkCFgIhvx9/9dJ9V8t/v+jP1IBsuaLwCXGR8JPHtkj4tFp+RHtUmU2ZYAUpMA==} + '@oxfmt/binding-win32-ia32-msvc@0.42.0': + resolution: {integrity: sha512-3gWltUrvuz4LPJXWivoAxZ28Of2O4N7OGuM5/X3ubPXCEV8hmgECLZzjz7UYvSDUS3grfdccQwmjynm+51EFpw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.41.0': - resolution: {integrity: sha512-49ZSpbZ1noozyPapE8SUOSm3IN0Ze4b5nkO+4+7fq6oEYQQJFhE0saj5k/Gg4oewVPdjn0L3ZFeWk2Vehjcw7A==} + '@oxfmt/binding-win32-x64-msvc@0.42.0': + resolution: {integrity: sha512-Wg4TMAfQRL9J9AZevJ/ZNy3uyyDztDYQtGr4P8UyyzIhLhFrdSmz1J/9JT+rv0fiCDLaFOBQnj3f3K3+a5PzDQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.56.0': - resolution: {integrity: sha512-IyfYPthZyiSKwAv/dLjeO18SaK8MxLI9Yss2JrRDyweQAkuL3LhEy7pwIwI7uA3KQc1Vdn20kdmj3q0oUIQL6A==} + '@oxlint/binding-android-arm-eabi@1.57.0': + resolution: {integrity: sha512-C7EiyfAJG4B70496eV543nKiq5cH0o/xIh/ufbjQz3SIvHhlDDsyn+mRFh+aW8KskTyUpyH2LGWL8p2oN6bl1A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.56.0': - resolution: {integrity: sha512-Ga5zYrzH6vc/VFxhn6MmyUnYEfy9vRpwTIks99mY3j6Nz30yYpIkWryI0QKPCgvGUtDSXVLEaMum5nA+WrNOSg==} + '@oxlint/binding-android-arm64@1.57.0': + resolution: {integrity: sha512-9i80AresjZ/FZf5xK8tKFbhQnijD4s1eOZw6/FHUwD59HEZbVLRc2C88ADYJfLZrF5XofWDiRX/Ja9KefCLy7w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.56.0': - resolution: {integrity: sha512-ogmbdJysnw/D4bDcpf1sPLpFThZ48lYp4aKYm10Z/6Nh1SON6NtnNhTNOlhEY296tDFItsZUz+2tgcSYqh8Eyw==} + '@oxlint/binding-darwin-arm64@1.57.0': + resolution: {integrity: sha512-0eUfhRz5L2yKa9I8k3qpyl37XK3oBS5BvrgdVIx599WZK63P8sMbg+0s4IuxmIiZuBK68Ek+Z+gcKgeYf0otsg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.56.0': - resolution: {integrity: sha512-x8QE1h+RAtQ2g+3KPsP6Fk/tdz6zJQUv5c7fTrJxXV3GHOo+Ry5p/PsogU4U+iUZg0rj6hS+E4xi+mnwwlDCWQ==} + '@oxlint/binding-darwin-x64@1.57.0': + resolution: {integrity: sha512-UvrSuzBaYOue+QMAcuDITe0k/Vhj6KZGjfnI6x+NkxBTke/VoM7ZisaxgNY0LWuBkTnd1OmeQfEQdQ48fRjkQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.56.0': - resolution: {integrity: sha512-6G+WMZvwJpMvY7my+/SHEjb7BTk/PFbePqLpmVmUJRIsJMy/UlyYqjpuh0RCgYYkPLcnXm1rUM04kbTk8yS1Yg==} + '@oxlint/binding-freebsd-x64@1.57.0': + resolution: {integrity: sha512-wtQq0dCoiw4bUwlsNVDJJ3pxJA218fOezpgtLKrbQqUtQJcM9yP8z+I9fu14aHg0uyAxIY+99toL6uBa2r7nxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.56.0': - resolution: {integrity: sha512-YYHBsk/sl7fYwQOok+6W5lBPeUEvisznV/HZD2IfZmF3Bns6cPC3Z0vCtSEOaAWTjYWN3jVsdu55jMxKlsdlhg==} + '@oxlint/binding-linux-arm-gnueabihf@1.57.0': + resolution: {integrity: sha512-qxFWl2BBBFcT4djKa+OtMdnLgoHEJXpqjyGwz8OhW35ImoCwR5qtAGqApNYce5260FQqoAHW8S8eZTjiX67Tsg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.56.0': - resolution: {integrity: sha512-+AZK8rOUr78y8WT6XkDb04IbMRqauNV+vgT6f8ZLOH8wnpQ9i7Nol0XLxAu+Cq7Sb+J9wC0j6Km5hG8rj47/yQ==} + '@oxlint/binding-linux-arm-musleabihf@1.57.0': + resolution: {integrity: sha512-SQoIsBU7J0bDW15/f0/RvxHfY3Y0+eB/caKBQtNFbuerTiA6JCYx9P1MrrFTwY2dTm/lMgTSgskvCEYk2AtG/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.56.0': - resolution: {integrity: sha512-urse2SnugwJRojUkGSSeH2LPMaje5Q50yQtvtL9HFckiyeqXzoFwOAZqD5TR29R2lq7UHidfFDM9EGcchcbb8A==} + '@oxlint/binding-linux-arm64-gnu@1.57.0': + resolution: {integrity: sha512-jqxYd1W6WMeozsCmqe9Rzbu3SRrGTyGDAipRlRggetyYbUksJqJKvUNTQtZR/KFoJPb+grnSm5SHhdWrywv3RQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.56.0': - resolution: {integrity: sha512-rkTZkBfJ4TYLjansjSzL6mgZOdN5IvUnSq3oNJSLwBcNvy3dlgQtpHPrRxrCEbbcp7oQ6If0tkNaqfOsphYZ9g==} + '@oxlint/binding-linux-arm64-musl@1.57.0': + resolution: {integrity: sha512-i66WyEPVEvq9bxRUCJ/MP5EBfnTDN3nhwEdFZFTO5MmLLvzngfWEG3NSdXQzTT3vk5B9i6C2XSIYBh+aG6uqyg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.56.0': - resolution: {integrity: sha512-uqL1kMH3u69/e1CH2EJhP3CP28jw2ExLsku4o8RVAZ7fySo9zOyI2fy9pVlTAp4voBLVgzndXi3SgtdyCTa2aA==} + '@oxlint/binding-linux-ppc64-gnu@1.57.0': + resolution: {integrity: sha512-oMZDCwz4NobclZU3pH+V1/upVlJZiZvne4jQP+zhJwt+lmio4XXr4qG47CehvrW1Lx2YZiIHuxM2D4YpkG3KVA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.56.0': - resolution: {integrity: sha512-j0CcMBOgV6KsRaBdsebIeiy7hCjEvq2KdEsiULf2LZqAq0v1M1lWjelhCV57LxsqaIGChXFuFJ0RiFrSRHPhSg==} + '@oxlint/binding-linux-riscv64-gnu@1.57.0': + resolution: {integrity: sha512-uoBnjJ3MMEBbfnWC1jSFr7/nSCkcQYa72NYoNtLl1imshDnWSolYCjzb8LVCwYCCfLJXD+0gBLD7fyC14c0+0g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.56.0': - resolution: {integrity: sha512-7VDOiL8cDG3DQ/CY3yKjbV1c4YPvc4vH8qW09Vv+5ukq3l/Kcyr6XGCd5NvxUmxqDb2vjMpM+eW/4JrEEsUetA==} + '@oxlint/binding-linux-riscv64-musl@1.57.0': + resolution: {integrity: sha512-BdrwD7haPZ8a9KrZhKJRSj6jwCor+Z8tHFZ3PT89Y3Jq5v3LfMfEePeAmD0LOTWpiTmzSzdmyw9ijneapiVHKQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.56.0': - resolution: {integrity: sha512-JGRpX0M+ikD3WpwJ7vKcHKV6Kg0dT52BW2Eu2BupXotYeqGXBrbY+QPkAyKO6MNgKozyTNaRh3r7g+VWgyAQYQ==} + '@oxlint/binding-linux-s390x-gnu@1.57.0': + resolution: {integrity: sha512-BNs+7ZNsRstVg2tpNxAXfMX/Iv5oZh204dVyb8Z37+/gCh+yZqNTlg6YwCLIMPSk5wLWIGOaQjT0GUOahKYImw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.56.0': - resolution: {integrity: sha512-dNaICPvtmuxFP/VbqdofrLqdS3bM/AKJN3LMJD52si44ea7Be1cBk6NpfIahaysG9Uo+L98QKddU9CD5L8UHnQ==} + '@oxlint/binding-linux-x64-gnu@1.57.0': + resolution: {integrity: sha512-AghS18w+XcENcAX0+BQGLiqjpqpaxKJa4cWWP0OWNLacs27vHBxu7TYkv9LUSGe5w8lOJHeMxcYfZNOAPqw2bg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.56.0': - resolution: {integrity: sha512-pF1vOtM+GuXmbklM1hV8WMsn6tCNPvkUzklj/Ej98JhlanbmA2RB1BILgOpwSuCTRTIYx2MXssmEyQQ90QF5aA==} + '@oxlint/binding-linux-x64-musl@1.57.0': + resolution: {integrity: sha512-E/FV3GB8phu/Rpkhz5T96hAiJlGzn91qX5yj5gU754P5cmVGXY1Jw/VSjDSlZBCY3VHjsVLdzgdkJaomEmcNOg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.56.0': - resolution: {integrity: sha512-bp8NQ4RE6fDIFLa4bdBiOA+TAvkNkg+rslR+AvvjlLTYXLy9/uKAYLQudaQouWihLD/hgkrXIKKzXi5IXOewwg==} + '@oxlint/binding-openharmony-arm64@1.57.0': + resolution: {integrity: sha512-xvZ2yZt0nUVfU14iuGv3V25jpr9pov5N0Wr28RXnHFxHCRxNDMtYPHV61gGLhN9IlXM96gI4pyYpLSJC5ClLCQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.56.0': - resolution: {integrity: sha512-PxT4OJDfMOQBzo3OlzFb9gkoSD+n8qSBxyVq2wQSZIHFQYGEqIRTo9M0ZStvZm5fdhMqaVYpOnJvH2hUMEDk/g==} + '@oxlint/binding-win32-arm64-msvc@1.57.0': + resolution: {integrity: sha512-Z4D8Pd0AyHBKeazhdIXeUUy5sIS3Mo0veOlzlDECg6PhRRKgEsBJCCV1n+keUZtQ04OP+i7+itS3kOykUyNhDg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.56.0': - resolution: {integrity: sha512-PTRy6sIEPqy2x8PTP1baBNReN/BNEFmde0L+mYeHmjXE1Vlcc9+I5nsqENsB2yAm5wLkzPoTNCMY/7AnabT4/A==} + '@oxlint/binding-win32-ia32-msvc@1.57.0': + resolution: {integrity: sha512-StOZ9nFMVKvevicbQfql6Pouu9pgbeQnu60Fvhz2S6yfMaii+wnueLnqQ5I1JPgNF0Syew4voBlAaHD13wH6tw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.56.0': - resolution: {integrity: sha512-ZHa0clocjLmIDr+1LwoWtxRcoYniAvERotvwKUYKhH41NVfl0Y4LNbyQkwMZzwDvKklKGvGZ5+DAG58/Ik47tQ==} + '@oxlint/binding-win32-x64-msvc@1.57.0': + resolution: {integrity: sha512-6PuxhYgth8TuW0+ABPOIkGdBYw+qYGxgIdXPHSVpiCDm+hqTTWCmC739St1Xni0DJBt8HnSHTG67i1y6gr8qrA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -6251,13 +6251,13 @@ packages: resolution: {integrity: sha512-zBd1G8HkewNd2A8oQ8c6BN/f/c9EId7rSUueOLGu28govmUctXmM+3765GwsByv9nYUdrLqHphXlYIc86saYsg==} engines: {node: '>=18'} - oxfmt@0.41.0: - resolution: {integrity: sha512-sKLdJZdQ3bw6x9qKiT7+eID4MNEXlDHf5ZacfIircrq6Qwjk0L6t2/JQlZZrVHTXJawK3KaMuBoJnEJPcqCEdg==} + oxfmt@0.42.0: + resolution: {integrity: sha512-QhejGErLSMReNuZ6vxgFHDyGoPbjTRNi6uGHjy0cvIjOQFqD6xmr/T+3L41ixR3NIgzcNiJ6ylQKpvShTgDfqg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - oxlint@1.56.0: - resolution: {integrity: sha512-Q+5Mj5PVaH/R6/fhMMFzw4dT+KPB+kQW4kaL8FOIq7tfhlnEVp6+3lcWqFruuTNlUo9srZUW3qH7Id4pskeR6g==} + oxlint@1.57.0: + resolution: {integrity: sha512-DGFsuBX5MFZX9yiDdtKjTrYPq45CZ8Fft6qCltJITYZxfwYjVdGf/6wycGYTACloauwIPxUnYhBVeZbHvleGhw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -6859,6 +6859,11 @@ packages: engines: {node: '>=20.16.0'} hasBin: true + srvx@0.11.13: + resolution: {integrity: sha512-oknN6qduuMPafxKtHucUeG32Q963pjriA5g3/Bl05cwEsUe5VVbIU4qR9LrALHbipSCyBe+VmfDGGydqazDRkw==} + engines: {node: '>=20.16.0'} + hasBin: true + std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} @@ -9242,118 +9247,118 @@ snapshots: '@oxc-project/types@0.122.0': {} - '@oxfmt/binding-android-arm-eabi@0.41.0': + '@oxfmt/binding-android-arm-eabi@0.42.0': optional: true - '@oxfmt/binding-android-arm64@0.41.0': + '@oxfmt/binding-android-arm64@0.42.0': optional: true - '@oxfmt/binding-darwin-arm64@0.41.0': + '@oxfmt/binding-darwin-arm64@0.42.0': optional: true - '@oxfmt/binding-darwin-x64@0.41.0': + '@oxfmt/binding-darwin-x64@0.42.0': optional: true - '@oxfmt/binding-freebsd-x64@0.41.0': + '@oxfmt/binding-freebsd-x64@0.42.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.41.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.42.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.41.0': + '@oxfmt/binding-linux-arm-musleabihf@0.42.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.41.0': + '@oxfmt/binding-linux-arm64-gnu@0.42.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.41.0': + '@oxfmt/binding-linux-arm64-musl@0.42.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.41.0': + '@oxfmt/binding-linux-ppc64-gnu@0.42.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.41.0': + '@oxfmt/binding-linux-riscv64-gnu@0.42.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.41.0': + '@oxfmt/binding-linux-riscv64-musl@0.42.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.41.0': + '@oxfmt/binding-linux-s390x-gnu@0.42.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.41.0': + '@oxfmt/binding-linux-x64-gnu@0.42.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.41.0': + '@oxfmt/binding-linux-x64-musl@0.42.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.41.0': + '@oxfmt/binding-openharmony-arm64@0.42.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.41.0': + '@oxfmt/binding-win32-arm64-msvc@0.42.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.41.0': + '@oxfmt/binding-win32-ia32-msvc@0.42.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.41.0': + '@oxfmt/binding-win32-x64-msvc@0.42.0': optional: true - '@oxlint/binding-android-arm-eabi@1.56.0': + '@oxlint/binding-android-arm-eabi@1.57.0': optional: true - '@oxlint/binding-android-arm64@1.56.0': + '@oxlint/binding-android-arm64@1.57.0': optional: true - '@oxlint/binding-darwin-arm64@1.56.0': + '@oxlint/binding-darwin-arm64@1.57.0': optional: true - '@oxlint/binding-darwin-x64@1.56.0': + '@oxlint/binding-darwin-x64@1.57.0': optional: true - '@oxlint/binding-freebsd-x64@1.56.0': + '@oxlint/binding-freebsd-x64@1.57.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.56.0': + '@oxlint/binding-linux-arm-gnueabihf@1.57.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.56.0': + '@oxlint/binding-linux-arm-musleabihf@1.57.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.56.0': + '@oxlint/binding-linux-arm64-gnu@1.57.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.56.0': + '@oxlint/binding-linux-arm64-musl@1.57.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.56.0': + '@oxlint/binding-linux-ppc64-gnu@1.57.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.56.0': + '@oxlint/binding-linux-riscv64-gnu@1.57.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.56.0': + '@oxlint/binding-linux-riscv64-musl@1.57.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.56.0': + '@oxlint/binding-linux-s390x-gnu@1.57.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.56.0': + '@oxlint/binding-linux-x64-gnu@1.57.0': optional: true - '@oxlint/binding-linux-x64-musl@1.56.0': + '@oxlint/binding-linux-x64-musl@1.57.0': optional: true - '@oxlint/binding-openharmony-arm64@1.56.0': + '@oxlint/binding-openharmony-arm64@1.57.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.56.0': + '@oxlint/binding-win32-arm64-msvc@1.57.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.56.0': + '@oxlint/binding-win32-ia32-msvc@1.57.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.56.0': + '@oxlint/binding-win32-x64-msvc@1.57.0': optional: true '@phun-ky/typeof@2.0.3': {} @@ -11136,24 +11141,24 @@ snapshots: - solid-js - vue - '@tanstack/react-form-start@1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.12))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-form-start@1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@tanstack/react-form': 1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.12))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/react-form': 1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) decode-formdata: 0.9.0 devalue: 5.6.4 react: 19.2.4 optionalDependencies: - '@tanstack/react-start': 1.167.5(crossws@0.4.1(srvx@0.11.12))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) + '@tanstack/react-start': 1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) transitivePeerDependencies: - react-dom - '@tanstack/react-form@1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.12))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-form@1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@tanstack/form-core': 1.28.5 '@tanstack/react-store': 0.9.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 optionalDependencies: - '@tanstack/react-start': 1.167.5(crossws@0.4.1(srvx@0.11.12))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) + '@tanstack/react-start': 1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) transitivePeerDependencies: - react-dom @@ -11185,27 +11190,27 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@tanstack/react-start-server@1.166.18(crossws@0.4.1(srvx@0.11.12))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-start-server@1.166.18(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@tanstack/history': 1.161.6 '@tanstack/react-router': 1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/router-core': 1.168.3 '@tanstack/start-client-core': 1.167.3 - '@tanstack/start-server-core': 1.167.3(crossws@0.4.1(srvx@0.11.12)) + '@tanstack/start-server-core': 1.167.3(crossws@0.4.1(srvx@0.11.13)) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.12))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2)': + '@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2)': dependencies: '@tanstack/react-router': 1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-start-client': 1.166.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/react-start-server': 1.166.18(crossws@0.4.1(srvx@0.11.12))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/react-start-server': 1.166.18(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.3 - '@tanstack/start-plugin-core': 1.167.8(@tanstack/react-router@1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(crossws@0.4.1(srvx@0.11.12))(vite@8.0.2) - '@tanstack/start-server-core': 1.167.3(crossws@0.4.1(srvx@0.11.12)) + '@tanstack/start-plugin-core': 1.167.8(@tanstack/react-router@1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(crossws@0.4.1(srvx@0.11.13))(vite@8.0.2) + '@tanstack/start-server-core': 1.167.3(crossws@0.4.1(srvx@0.11.13)) pathe: 2.0.3 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -11296,7 +11301,7 @@ snapshots: '@tanstack/start-fn-stubs@1.161.6': {} - '@tanstack/start-plugin-core@1.167.8(@tanstack/react-router@1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(crossws@0.4.1(srvx@0.11.12))(vite@8.0.2)': + '@tanstack/start-plugin-core@1.167.8(@tanstack/react-router@1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(crossws@0.4.1(srvx@0.11.13))(vite@8.0.2)': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 @@ -11307,7 +11312,7 @@ snapshots: '@tanstack/router-plugin': 1.167.4(@tanstack/react-router@1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.2) '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.3 - '@tanstack/start-server-core': 1.167.3(crossws@0.4.1(srvx@0.11.12)) + '@tanstack/start-server-core': 1.167.3(crossws@0.4.1(srvx@0.11.13)) cheerio: 1.2.0 exsolve: 1.0.8 pathe: 2.0.3 @@ -11328,13 +11333,13 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-server-core@1.167.3(crossws@0.4.1(srvx@0.11.12))': + '@tanstack/start-server-core@1.167.3(crossws@0.4.1(srvx@0.11.13))': dependencies: '@tanstack/history': 1.161.6 '@tanstack/router-core': 1.168.3 '@tanstack/start-client-core': 1.167.3 '@tanstack/start-storage-context': 1.166.17 - h3-v2: h3@2.0.1-rc.16(crossws@0.4.1(srvx@0.11.12)) + h3-v2: h3@2.0.1-rc.16(crossws@0.4.1(srvx@0.11.13)) seroval: 1.5.1 transitivePeerDependencies: - crossws @@ -11863,7 +11868,7 @@ snapshots: before-after-hook@4.0.0: {} - better-auth@1.5.6(0b01dc45a13b6e9cf78d5c2991b2aa38): + better-auth@1.5.6(49384272fc1f6bfc35ef9ee3d81a244f): dependencies: '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) '@better-auth/drizzle-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260317.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))) @@ -11884,7 +11889,7 @@ snapshots: zod: 4.3.6 optionalDependencies: '@prisma/client': 7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2) - '@tanstack/react-start': 1.167.5(crossws@0.4.1(srvx@0.11.12))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) + '@tanstack/react-start': 1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) drizzle-kit: 0.31.10 drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260317.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) mongodb: 7.1.0(@aws-sdk/credential-providers@3.1014.0)(socks@2.8.7) @@ -12250,9 +12255,9 @@ snapshots: dependencies: uncrypto: 0.1.3 - crossws@0.4.1(srvx@0.11.12): + crossws@0.4.1(srvx@0.11.13): optionalDependencies: - srvx: 0.11.12 + srvx: 0.11.13 optional: true css-select@5.2.2: @@ -12894,12 +12899,12 @@ snapshots: ufo: 1.6.3 uncrypto: 0.1.3 - h3@2.0.1-rc.16(crossws@0.4.1(srvx@0.11.12)): + h3@2.0.1-rc.16(crossws@0.4.1(srvx@0.11.13)): dependencies: rou3: 0.8.1 - srvx: 0.11.12 + srvx: 0.11.13 optionalDependencies: - crossws: 0.4.1(srvx@0.11.12) + crossws: 0.4.1(srvx@0.11.13) handlebars@4.7.8: dependencies: @@ -13532,51 +13537,51 @@ snapshots: macos-release: 3.4.0 windows-release: 6.1.0 - oxfmt@0.41.0: + oxfmt@0.42.0: dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.41.0 - '@oxfmt/binding-android-arm64': 0.41.0 - '@oxfmt/binding-darwin-arm64': 0.41.0 - '@oxfmt/binding-darwin-x64': 0.41.0 - '@oxfmt/binding-freebsd-x64': 0.41.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.41.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.41.0 - '@oxfmt/binding-linux-arm64-gnu': 0.41.0 - '@oxfmt/binding-linux-arm64-musl': 0.41.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.41.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.41.0 - '@oxfmt/binding-linux-riscv64-musl': 0.41.0 - '@oxfmt/binding-linux-s390x-gnu': 0.41.0 - '@oxfmt/binding-linux-x64-gnu': 0.41.0 - '@oxfmt/binding-linux-x64-musl': 0.41.0 - '@oxfmt/binding-openharmony-arm64': 0.41.0 - '@oxfmt/binding-win32-arm64-msvc': 0.41.0 - '@oxfmt/binding-win32-ia32-msvc': 0.41.0 - '@oxfmt/binding-win32-x64-msvc': 0.41.0 - - oxlint@1.56.0: - optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.56.0 - '@oxlint/binding-android-arm64': 1.56.0 - '@oxlint/binding-darwin-arm64': 1.56.0 - '@oxlint/binding-darwin-x64': 1.56.0 - '@oxlint/binding-freebsd-x64': 1.56.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.56.0 - '@oxlint/binding-linux-arm-musleabihf': 1.56.0 - '@oxlint/binding-linux-arm64-gnu': 1.56.0 - '@oxlint/binding-linux-arm64-musl': 1.56.0 - '@oxlint/binding-linux-ppc64-gnu': 1.56.0 - '@oxlint/binding-linux-riscv64-gnu': 1.56.0 - '@oxlint/binding-linux-riscv64-musl': 1.56.0 - '@oxlint/binding-linux-s390x-gnu': 1.56.0 - '@oxlint/binding-linux-x64-gnu': 1.56.0 - '@oxlint/binding-linux-x64-musl': 1.56.0 - '@oxlint/binding-openharmony-arm64': 1.56.0 - '@oxlint/binding-win32-arm64-msvc': 1.56.0 - '@oxlint/binding-win32-ia32-msvc': 1.56.0 - '@oxlint/binding-win32-x64-msvc': 1.56.0 + '@oxfmt/binding-android-arm-eabi': 0.42.0 + '@oxfmt/binding-android-arm64': 0.42.0 + '@oxfmt/binding-darwin-arm64': 0.42.0 + '@oxfmt/binding-darwin-x64': 0.42.0 + '@oxfmt/binding-freebsd-x64': 0.42.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.42.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.42.0 + '@oxfmt/binding-linux-arm64-gnu': 0.42.0 + '@oxfmt/binding-linux-arm64-musl': 0.42.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.42.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.42.0 + '@oxfmt/binding-linux-riscv64-musl': 0.42.0 + '@oxfmt/binding-linux-s390x-gnu': 0.42.0 + '@oxfmt/binding-linux-x64-gnu': 0.42.0 + '@oxfmt/binding-linux-x64-musl': 0.42.0 + '@oxfmt/binding-openharmony-arm64': 0.42.0 + '@oxfmt/binding-win32-arm64-msvc': 0.42.0 + '@oxfmt/binding-win32-ia32-msvc': 0.42.0 + '@oxfmt/binding-win32-x64-msvc': 0.42.0 + + oxlint@1.57.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.57.0 + '@oxlint/binding-android-arm64': 1.57.0 + '@oxlint/binding-darwin-arm64': 1.57.0 + '@oxlint/binding-darwin-x64': 1.57.0 + '@oxlint/binding-freebsd-x64': 1.57.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.57.0 + '@oxlint/binding-linux-arm-musleabihf': 1.57.0 + '@oxlint/binding-linux-arm64-gnu': 1.57.0 + '@oxlint/binding-linux-arm64-musl': 1.57.0 + '@oxlint/binding-linux-ppc64-gnu': 1.57.0 + '@oxlint/binding-linux-riscv64-gnu': 1.57.0 + '@oxlint/binding-linux-riscv64-musl': 1.57.0 + '@oxlint/binding-linux-s390x-gnu': 1.57.0 + '@oxlint/binding-linux-x64-gnu': 1.57.0 + '@oxlint/binding-linux-x64-musl': 1.57.0 + '@oxlint/binding-openharmony-arm64': 1.57.0 + '@oxlint/binding-win32-arm64-msvc': 1.57.0 + '@oxlint/binding-win32-ia32-msvc': 1.57.0 + '@oxlint/binding-win32-x64-msvc': 1.57.0 p-limit@7.3.0: dependencies: @@ -14327,6 +14332,8 @@ snapshots: srvx@0.11.12: {} + srvx@0.11.13: {} + std-env@3.10.0: optional: true From ffa6585cf9ab0748359967377ab99849723ae50b Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Fri, 27 Mar 2026 21:25:34 +0700 Subject: [PATCH 03/20] chore(vscode): invalid oxc fmt config path --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 8825ce2..991a4d8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -28,7 +28,7 @@ // Extension - Oxc "oxc.enable": true, - "oxc.fmt.configPath": ".oxfmtrc.json", + "oxc.fmt.configPath": ".oxfmtrc.jsonc", // Extension - Tailwind CSS "tailwindCSS.classAttributes": ["class", "className", "classNames"], From ccf1afd73b970cc63517f9f211d39aaf65fcb31b Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Fri, 27 Mar 2026 21:34:51 +0700 Subject: [PATCH 04/20] build(storybook): use build-in tsconfig path resolve --- vite.storybook.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/vite.storybook.ts b/vite.storybook.ts index 42f4e65..64f7d5b 100644 --- a/vite.storybook.ts +++ b/vite.storybook.ts @@ -1,7 +1,9 @@ import tailwindcss from '@tailwindcss/vite'; import { defineConfig } from 'vite'; -import tsConfigPaths from 'vite-tsconfig-paths'; export default defineConfig({ - plugins: [tsConfigPaths({ projects: ['./tsconfig.json'] }), tailwindcss()], + resolve: { + tsconfigPaths: true, + }, + plugins: [tailwindcss()], }); From 330c7291ff97cc8abff707943bb4f5530d964423 Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Sat, 4 Apr 2026 09:09:35 +0700 Subject: [PATCH 05/20] ci(github): using workflow_dispatch to trigger release (#84) --- .github/workflows/deployment-production.yaml | 35 --------------- .github/workflows/release.yaml | 45 ++++++++++++++++++++ 2 files changed, 45 insertions(+), 35 deletions(-) create mode 100644 .github/workflows/release.yaml diff --git a/.github/workflows/deployment-production.yaml b/.github/workflows/deployment-production.yaml index 2b1e3b7..7c7f040 100644 --- a/.github/workflows/deployment-production.yaml +++ b/.github/workflows/deployment-production.yaml @@ -59,38 +59,3 @@ jobs: AUTH_GITHUB_CLIENT_SECRET: ${{ secrets.AUTH_GITHUB_CLIENT_SECRET }} AUTH_GOOGLE_CLIENT_ID: ${{ secrets.AUTH_GOOGLE_CLIENT_ID }} AUTH_GOOGLE_CLIENT_SECRET: ${{ secrets.AUTH_GOOGLE_CLIENT_SECRET }} - release: - needs: - - deploy - permissions: - contents: write - id-token: write - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v6.0.1 - with: - fetch-depth: 0 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: ${{ env.PNPM_VERSION }} - run_install: false - cache: true - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: ${{ env.NODE_VERSION }} - cache: pnpm - - name: Install Dependencies - run: pnpm install --prefer-offline --frozen-lockfile - env: - HUSKY: 0 - - name: Initialize Git - run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "github-actions[bot]@users.noreply.github.com" - - name: Create Release - run: pnpm release --ci - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..af41504 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,45 @@ +# This workflow is triggered manually via the "Release" workflow dispatch or by a repository dispatch event with the type "webhook_release". +# It uses the release-it tool to automate the release process, including generating changelogs and creating GitHub releases. + +name: Release +on: + workflow_dispatch: + repository_dispatch: + types: [webhook_release] +permissions: + contents: write + id-token: write +env: + NODE_VERSION: '24.14.0' + PNPM_VERSION: '10.32.1' +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + with: + fetch-depth: 0 + - name: Setup pnpm + uses: pnpm/action-setup@v5.0.0 + with: + version: ${{ env.PNPM_VERSION }} + run_install: false + cache: true + # Install only release-it and its dependencies to minimize install time + - name: Install Dependencies + env: + HUSKY: 0 + run: | + pnpm add --global \ + release-it@19.2.4 \ + @release-it/conventional-changelog@10.0.6 \ + conventional-changelog-conventionalcommits@9.3.0 + - name: Initialize Git + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + - name: Create Release + run: release-it --ci --config .release-it.json + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From ae0de25b699c311a53b7e2e25076f8caf6ea8330 Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Sun, 5 Apr 2026 15:34:20 +0700 Subject: [PATCH 06/20] chore(bump): upgrade cloudflare infra deps (#86) --- package.json | 8 +- pnpm-lock.yaml | 710 ++++++++++++++++++++++---------------------- pnpm-workspace.yaml | 2 + 3 files changed, 355 insertions(+), 365 deletions(-) diff --git a/package.json b/package.json index f68b1e8..b280ef6 100644 --- a/package.json +++ b/package.json @@ -86,8 +86,8 @@ }, "devDependencies": { "@babel/core": "^7.29.0", - "@cloudflare/vite-plugin": "^1.30.0", - "@cloudflare/workers-types": "^4.20260317.1", + "@cloudflare/vite-plugin": "^1.31.0", + "@cloudflare/workers-types": "^4.20260405.1", "@commitlint/cli": "^20.5.0", "@commitlint/config-conventional": "^20.5.0", "@commitlint/types": "^20.5.0", @@ -108,7 +108,7 @@ "@types/react-dom": "^19.2.3", "@vitejs/devtools": "^0.1.8", "@vitejs/plugin-react": "^6.0.1", - "alchemy": "^0.90.0", + "alchemy": "^0.90.1", "babel-plugin-react-compiler": "^1.0.0", "conventional-changelog-conventionalcommits": "^9.3.0", "dotenv": "^17.3.1", @@ -123,7 +123,7 @@ "tw-animate-css": "^1.4.0", "typescript": "^6.0.2", "vite": "^8.0.2", - "wrangler": "^4.76.0" + "wrangler": "^4.80.0" }, "engines": { "node": ">=24.14.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3bcd149..790ce28 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,13 +4,16 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + undici: 7.18.2 + importers: .: dependencies: '@better-auth/drizzle-adapter': specifier: ^1.5.6 - version: 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260317.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))) + version: 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))) '@devsantara/head': specifier: ^0.4.1 version: 0.4.1(@types/react@19.2.14)(react@19.2.4) @@ -34,25 +37,25 @@ importers: version: 4.2.2(vite@8.0.2) '@tanstack/react-form': specifier: ^1.28.5 - version: 1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.15))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-form-devtools': specifier: ^0.2.19 version: 0.2.19(@types/react@19.2.14)(csstype@3.2.3)(preact@10.29.0)(react@19.2.4)(solid-js@1.9.10)(vue@3.5.30(typescript@6.0.2)) '@tanstack/react-form-start': specifier: ^1.28.5 - version: 1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.15))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-router': specifier: ^1.168.3 version: 1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-start': specifier: ^1.167.5 - version: 1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) + version: 1.167.5(crossws@0.4.1(srvx@0.11.15))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) '@tanstack/zod-adapter': specifier: ^1.166.9 version: 1.166.9(@tanstack/react-router@1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(zod@4.3.6) better-auth: specifier: ^1.5.6 - version: 1.5.6(49384272fc1f6bfc35ef9ee3d81a244f) + version: 1.5.6(cda3b31c0637fd6775df146cf0d5df72) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -67,7 +70,7 @@ importers: version: 4.1.0 drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@cloudflare/workers-types@4.20260317.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) + version: 0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) embla-carousel-react: specifier: ^8.6.0 version: 8.6.0(react@19.2.4) @@ -127,11 +130,11 @@ importers: specifier: ^7.29.0 version: 7.29.0 '@cloudflare/vite-plugin': - specifier: ^1.30.0 - version: 1.30.0(vite@8.0.2)(workerd@1.20260317.1)(wrangler@4.76.0(@cloudflare/workers-types@4.20260317.1)) + specifier: ^1.31.0 + version: 1.31.0(vite@8.0.2)(workerd@1.20260401.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)) '@cloudflare/workers-types': - specifier: ^4.20260317.1 - version: 4.20260317.1 + specifier: ^4.20260405.1 + version: 4.20260405.1 '@commitlint/cli': specifier: ^20.5.0 version: 20.5.0(@types/node@25.5.0)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0)(typescript@6.0.2) @@ -193,8 +196,8 @@ importers: specifier: ^6.0.1 version: 6.0.1(@rolldown/plugin-babel@0.2.2(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.11)(vite@8.0.2))(babel-plugin-react-compiler@1.0.0)(vite@8.0.2) alchemy: - specifier: ^0.90.0 - version: 0.90.0(@cloudflare/vite-plugin@1.30.0(vite@8.0.2)(workerd@1.20260317.1)(wrangler@4.76.0(@cloudflare/workers-types@4.20260317.1)))(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(vite@8.0.2)(workerd@1.20260317.1)(wrangler@4.76.0(@cloudflare/workers-types@4.20260317.1)) + specifier: ^0.90.1 + version: 0.90.1(@cloudflare/vite-plugin@1.31.0(vite@8.0.2)(workerd@1.20260401.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)))(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(vite@8.0.2)(workerd@1.20260401.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)) babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 @@ -238,8 +241,8 @@ importers: specifier: ^8.0.2 version: 8.0.2(@types/node@25.5.0)(@vitejs/devtools@0.1.8)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) wrangler: - specifier: ^4.76.0 - version: 4.76.0(@cloudflare/workers-types@4.20260317.1) + specifier: ^4.80.0 + version: 4.80.0(@cloudflare/workers-types@4.20260405.1) packages: @@ -259,52 +262,52 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-cognito-identity@3.1014.0': - resolution: {integrity: sha512-NvNThzNvdKigwy9gNQnipeefydZ1HGU1kReXl5FPMxclzNgYB0IzwmJSW0mXICdd7PWARUblcfz72LeoOyXs0A==} + '@aws-sdk/client-cognito-identity@3.1024.0': + resolution: {integrity: sha512-PhbZl7TT+SBAsNxeC4vjRCqnkKYadRPKpsX4s0CtsVZz3QJ6UWBO7nBCHV5Pdv1f+YJD+UbCxGBj389vOPLmsw==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.973.23': - resolution: {integrity: sha512-aoJncvD1XvloZ9JLnKqTRL9dBy+Szkryoag9VT+V1TqsuUgIxV9cnBVM/hrDi2vE8bDqLiDR8nirdRcCdtJu0w==} + '@aws-sdk/core@3.973.26': + resolution: {integrity: sha512-A/E6n2W42ruU+sfWk+mMUOyVXbsSgGrY3MJ9/0Az5qUdG67y8I6HYzzoAa+e/lzxxl1uCYmEL6BTMi9ZiZnplQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-cognito-identity@3.972.16': - resolution: {integrity: sha512-WLdg4ErAu1Zkf9uPKQFC+UryHjaLTXji5SyBF3pTtqbbYOQHIfmf9Gsvn5zFol1T4SOWE4nDc8entfBAkAVHYQ==} + '@aws-sdk/credential-provider-cognito-identity@3.972.21': + resolution: {integrity: sha512-3ooy5gLnMLgWtkxz53P9R0RiSSCCHn576kyfy/L88QXOqS/G4wYTsqoNJBGZ0Kg46FlQ9jZHuZThbyeEeXgW/g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.21': - resolution: {integrity: sha512-BkAfKq8Bd4shCtec1usNz//urPJF/SZy14qJyxkSaRJQ/Vv1gVh0VZSTmS7aE6aLMELkFV5wHHrS9ZcdG8Kxsg==} + '@aws-sdk/credential-provider-env@3.972.24': + resolution: {integrity: sha512-FWg8uFmT6vQM7VuzELzwVo5bzExGaKHdubn0StjgrcU5FvuLExUe+k06kn/40uKv59rYzhez8eFNM4yYE/Yb/w==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.23': - resolution: {integrity: sha512-4XZ3+Gu5DY8/n8zQFHBgcKTF7hWQl42G6CY9xfXVo2d25FM/lYkpmuzhYopYoPL1ITWkJ2OSBQfYEu5JRfHOhA==} + '@aws-sdk/credential-provider-http@3.972.26': + resolution: {integrity: sha512-CY4ppZ+qHYqcXqBVi//sdHST1QK3KzOEiLtpLsc9W2k2vfZPKExGaQIsOwcyvjpjUEolotitmd3mUNY56IwDEA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.23': - resolution: {integrity: sha512-PZLSmU0JFpNCDFReidBezsgL5ji9jOBry8CnZdw4Jj6d0K2z3Ftnp44NXgADqYx5BLMu/ZHujfeJReaDoV+IwQ==} + '@aws-sdk/credential-provider-ini@3.972.28': + resolution: {integrity: sha512-wXYvq3+uQcZV7k+bE4yDXCTBdzWTU9x/nMiKBfzInmv6yYK1veMK0AKvRfRBd72nGWYKcL6AxwiPg9z/pYlgpw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.23': - resolution: {integrity: sha512-OmE/pSkbMM3dCj1HdOnZ5kXnKK+R/Yz+kbBugraBecp0pGAs21eEURfQRz+1N2gzIHLVyGIP1MEjk/uSrFsngg==} + '@aws-sdk/credential-provider-login@3.972.28': + resolution: {integrity: sha512-ZSTfO6jqUTCysbdBPtEX5OUR//3rbD0lN7jO3sQeS2Gjr/Y+DT6SbIJ0oT2cemNw3UzKu97sNONd1CwNMthuZQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.24': - resolution: {integrity: sha512-9Jwi7aps3AfUicJyF5udYadPypPpCwUZ6BSKr/QjRbVCpRVS1wc+1Q6AEZ/qz8J4JraeRd247pSzyMQSIHVebw==} + '@aws-sdk/credential-provider-node@3.972.29': + resolution: {integrity: sha512-clSzDcvndpFJAggLDnDb36sPdlZYyEs5Zm6zgZjjUhwsJgSWiWKwFIXUVBcbruidNyBdbpOv2tNDL9sX8y3/0g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.21': - resolution: {integrity: sha512-nRxbeOJ1E1gVA0lNQezuMVndx+ZcuyaW/RB05pUsznN5BxykSlH6KkZ/7Ca/ubJf3i5N3p0gwNO5zgPSCzj+ww==} + '@aws-sdk/credential-provider-process@3.972.24': + resolution: {integrity: sha512-Q2k/XLrFXhEztPHqj4SLCNID3hEPdlhh1CDLBpNnM+1L8fq7P+yON9/9M1IGN/dA5W45v44ylERfXtDAlmMNmw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.23': - resolution: {integrity: sha512-APUccADuYPLL0f2htpM8Z4czabSmHOdo4r41W6lKEZdy++cNJ42Radqy6x4TopENzr3hR6WYMyhiuiqtbf/nAA==} + '@aws-sdk/credential-provider-sso@3.972.28': + resolution: {integrity: sha512-IoUlmKMLEITFn1SiCTjPfR6KrE799FBo5baWyk/5Ppar2yXZoUdaRqZzJzK6TcJxx450M8m8DbpddRVYlp5R/A==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.23': - resolution: {integrity: sha512-H5JNqtIwOu/feInmMMWcK0dL5r897ReEn7n2m16Dd0DPD9gA2Hg8Cq4UDzZ/9OzaLh/uqBM6seixz0U6Fi2Eag==} + '@aws-sdk/credential-provider-web-identity@3.972.28': + resolution: {integrity: sha512-d+6h0SD8GGERzKe27v5rOzNGKOl0D+l0bWJdqrxH8WSQzHzjsQFIAPgIeOTUwBHVsKKwtSxc91K/SWax6XgswQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-providers@3.1014.0': - resolution: {integrity: sha512-2GM4JBB08RTwHPEVa9+AE+Q3mtyZyv+XS93rdlw5o/Emfu0nseDU6I72cbmKXcMnHXYEN+DdxEF/RvfnB0/GXw==} + '@aws-sdk/credential-providers@3.1024.0': + resolution: {integrity: sha512-5aVZ74iKJ3InT/s4H2tVzAjH48SdegJU0Y0RaAYToQbmrS1R17tipw0jVQrFzajX6W5sbG6xfLcTNIGL33ODMQ==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-host-header@3.972.8': @@ -315,24 +318,24 @@ packages: resolution: {integrity: sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-recursion-detection@3.972.8': - resolution: {integrity: sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==} + '@aws-sdk/middleware-recursion-detection@3.972.9': + resolution: {integrity: sha512-/Wt5+CT8dpTFQxEJ9iGy/UGrXr7p2wlIOEHvIr/YcHYByzoLjrqkYqXdJjd9UIgWjv7eqV2HnFJen93UTuwfTQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.972.24': - resolution: {integrity: sha512-dLTWy6IfAMhNiSEvMr07g/qZ54be6pLqlxVblbF6AzafmmGAzMMj8qMoY9B4+YgT+gY9IcuxZslNh03L6PyMCQ==} + '@aws-sdk/middleware-user-agent@3.972.28': + resolution: {integrity: sha512-cfWZFlVh7Va9lRay4PN2A9ARFzaBYcA097InT5M2CdRS05ECF5yaz86jET8Wsl2WcyKYEvVr/QNmKtYtafUHtQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.996.13': - resolution: {integrity: sha512-ptZ1HF4yYHNJX8cgFF+8NdYO69XJKZn7ft0/ynV3c0hCbN+89fAbrLS+fqniU2tW8o9Kfqhj8FUh+IPXb2Qsuw==} + '@aws-sdk/nested-clients@3.996.18': + resolution: {integrity: sha512-c7ZSIXrESxHKx2Mcopgd8AlzZgoXMr20fkx5ViPWPOLBvmyhw9VwJx/Govg8Ef/IhEon5R9l53Z8fdYSEmp6VA==} engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.972.9': - resolution: {integrity: sha512-eQ+dFU05ZRC/lC2XpYlYSPlXtX3VT8sn5toxN2Fv7EXlMoA2p9V7vUBKqHunfD4TRLpxUq8Y8Ol/nCqiv327Ng==} + '@aws-sdk/region-config-resolver@3.972.10': + resolution: {integrity: sha512-1dq9ToC6e070QvnVhhbAs3bb5r6cQ10gTVc6cyRV5uvQe7P138TV2uG2i6+Yok4bAkVAcx5AqkTEBUvWEtBlsQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1014.0': - resolution: {integrity: sha512-gHTHNUoaOGNrSWkl32A7wFsU78jlNTlqMccLu0byUk5CysYYXaxNMIonIVr4YcykC7vgtDS5ABuz83giy6fzJA==} + '@aws-sdk/token-providers@3.1021.0': + resolution: {integrity: sha512-TKY6h9spUk3OLs5v1oAgW9mAeBE3LAGNBwJokLy96wwmd4W2v/tYlXseProyed9ValDj2u1jK/4Rg1T+1NXyJA==} engines: {node: '>=20.0.0'} '@aws-sdk/types@3.973.6': @@ -350,8 +353,8 @@ packages: '@aws-sdk/util-user-agent-browser@3.972.8': resolution: {integrity: sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==} - '@aws-sdk/util-user-agent-node@3.973.10': - resolution: {integrity: sha512-E99zeTscCc+pTMfsvnfi6foPpKmdD1cZfOC7/P8UUrjsoQdg9VEWPRD+xdFduKnfPXwcvby58AlO9jwwF6U96g==} + '@aws-sdk/util-user-agent-node@3.973.14': + resolution: {integrity: sha512-vNSB/DYaPOyujVZBg/zUznH9QC142MaTHVmaFlF7uzzfg3CgT9f/l4C0Yi+vU/tbBhxVcXVB90Oohk5+o+ZbWw==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -359,8 +362,8 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.972.15': - resolution: {integrity: sha512-PxMRlCFNiQnke9YR29vjFQwz4jq+6Q04rOVFeTDR2K7Qpv9h9FOWOxG+zJjageimYbWqE3bTuLjmryWHAWbvaA==} + '@aws-sdk/xml-builder@3.972.16': + resolution: {integrity: sha512-iu2pyvaqmeatIJLURLqx9D+4jKAdTH20ntzB6BFwjyN7V960r4jK32mx0Zf7YbtOYAbmbtQfDNuL60ONinyw7A==} engines: {node: '>=20.0.0'} '@aws/lambda-invoke-store@0.2.4': @@ -567,11 +570,11 @@ packages: workerd: optional: true - '@cloudflare/vite-plugin@1.30.0': - resolution: {integrity: sha512-7E521lowup0TL6J7ete0TrjW/UJkS+NrwOZ9fXDkwPIUi+u1CaRqeoDihJtaJkoBMHF3qjvZpNf2424Hr6g95A==} + '@cloudflare/vite-plugin@1.31.0': + resolution: {integrity: sha512-wkIoqOTVltHMsl8Zpt2bcndbdf+w7czICJ8SbxQq+VzvGprf8glJt5y7iyMCj9YeofkUdsR6AlyTZvZ8kpx0FQ==} peerDependencies: vite: ^6.1.0 || ^7.0.0 || ^8.0.0 - wrangler: ^4.76.0 + wrangler: ^4.80.0 '@cloudflare/workerd-darwin-64@1.20260310.1': resolution: {integrity: sha512-hF2VpoWaMb1fiGCQJqCY6M8I+2QQqjkyY4LiDYdTL5D/w6C1l5v1zhc0/jrjdD1DXfpJtpcSMSmEPjHse4p9Ig==} @@ -579,8 +582,8 @@ packages: cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-64@1.20260317.1': - resolution: {integrity: sha512-8hjh3sPMwY8M/zedq3/sXoA2Q4BedlGufn3KOOleIG+5a4ReQKLlUah140D7J6zlKmYZAFMJ4tWC7hCuI/s79g==} + '@cloudflare/workerd-darwin-64@1.20260401.1': + resolution: {integrity: sha512-ZSmceM70jH6k+/62VkEcmMNzrpr4kSctkX5Lsgqv38KktfhPY/hsh75y1lRoPWS3H3kgMa4p2pUSlidZR1u2hw==} engines: {node: '>=16'} cpu: [x64] os: [darwin] @@ -591,8 +594,8 @@ packages: cpu: [arm64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20260317.1': - resolution: {integrity: sha512-M/MnNyvO5HMgoIdr3QHjdCj2T1ki9gt0vIUnxYxBu9ISXS/jgtMl6chUVPJ7zHYBn9MyYr8ByeN6frjYxj0MGg==} + '@cloudflare/workerd-darwin-arm64@1.20260401.1': + resolution: {integrity: sha512-7UKWF+IUZ3NXMVPsDg8Cjg0r58b+uYlfvs5Yt8bvtU+geCtW4P2MxRHmRSEo8SryckXOJjb/b8tcncgCykFu8g==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] @@ -603,8 +606,8 @@ packages: cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-64@1.20260317.1': - resolution: {integrity: sha512-1ltuEjkRcS3fsVF7CxsKlWiRmzq2ZqMfqDN0qUOgbUwkpXsLVJsXmoblaLf5OP00ELlcgF0QsN0p2xPEua4Uug==} + '@cloudflare/workerd-linux-64@1.20260401.1': + resolution: {integrity: sha512-MDWUH/0bvL/l9aauN8zEddyYOXId1OueqrUCXXENNJ95R/lSmF6OgGVuXaYhoIhxQkNiEJ/0NOlnVYj9mJq4dw==} engines: {node: '>=16'} cpu: [x64] os: [linux] @@ -615,8 +618,8 @@ packages: cpu: [arm64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20260317.1': - resolution: {integrity: sha512-3QrNnPF1xlaNwkHpasvRvAMidOvQs2NhXQmALJrEfpIJ/IDL2la8g499yXp3eqhG3hVMCB07XVY149GTs42Xtw==} + '@cloudflare/workerd-linux-arm64@1.20260401.1': + resolution: {integrity: sha512-UgkzpMzVWM/bwbo3vjCTg2aoKfGcUhiEoQoDdo6RGWvbHRJyLVZ4VQCG9ZcISiztkiS2ICCoYOtPy6M/lV6Gcw==} engines: {node: '>=16'} cpu: [arm64] os: [linux] @@ -627,14 +630,14 @@ packages: cpu: [x64] os: [win32] - '@cloudflare/workerd-windows-64@1.20260317.1': - resolution: {integrity: sha512-MfZTz+7LfuIpMGTa3RLXHX8Z/pnycZLItn94WRdHr8LPVet+C5/1Nzei399w/jr3+kzT4pDKk26JF/tlI5elpQ==} + '@cloudflare/workerd-windows-64@1.20260401.1': + resolution: {integrity: sha512-HBLzcQF5iF4Qv20tQ++pG7xs3OsCnaIbc+GAi6fmhUKZhvmzvml/jwrQzLJ+MPm0cQo41K5OO/U3T4S8tvJetQ==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20260317.1': - resolution: {integrity: sha512-+G4eVwyCpm8Au1ex8vQBCuA9wnwqetz4tPNRoB/53qvktERWBRMQnrtvC1k584yRE3emMThtuY0gWshvSJ++PQ==} + '@cloudflare/workers-types@4.20260405.1': + resolution: {integrity: sha512-PokTmySa+D6MY01R1UfYH48korsN462NK/fl3aw47Hg7XuLuSo/RTpjT0vtWaJhJoFY5tHGOBBIbDcIc8wltLg==} '@commitlint/cli@20.5.0': resolution: {integrity: sha512-yNkyN/tuKTJS3wdVfsZ2tXDM4G4Gi7z+jW54Cki8N8tZqwKBltbIvUUrSbT4hz1bhW/h0CdR+5sCSpXD+wMKaQ==} @@ -753,6 +756,9 @@ packages: '@emnapi/runtime@1.9.1': resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + '@emnapi/runtime@1.9.2': + resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + '@emnapi/wasi-threads@1.2.0': resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} @@ -3427,8 +3433,8 @@ packages: os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.60.0': - resolution: {integrity: sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==} + '@rollup/rollup-linux-x64-gnu@4.60.1': + resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==} cpu: [x64] os: [linux] libc: [glibc] @@ -3495,16 +3501,12 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@smithy/abort-controller@4.2.12': - resolution: {integrity: sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q==} - engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.4.13': resolution: {integrity: sha512-iIzMC5NmOUP6WL6o8iPBjFhUhBZ9pPjpUpQYWMUFQqKyXXzOftbfK8zcQCz/jFV1Psmf05BK5ypx4K2r4Tnwdg==} engines: {node: '>=18.0.0'} - '@smithy/core@3.23.12': - resolution: {integrity: sha512-o9VycsYNtgC+Dy3I0yrwCqv9CWicDnke0L7EVOrZtJpjb2t0EjaEofmMrYc0T1Kn3yk32zm6cspxF9u9Bj7e5w==} + '@smithy/core@3.23.13': + resolution: {integrity: sha512-J+2TT9D6oGsUVXVEMvz8h2EmdVnkBiy2auCie4aSJMvKlzUtO5hqjEzXhoCUkIMo7gAYjbQcN0g/MMSXEhDs1Q==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.2.12': @@ -3535,16 +3537,16 @@ packages: resolution: {integrity: sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.27': - resolution: {integrity: sha512-T3TFfUgXQlpcg+UdzcAISdZpj4Z+XECZ/cefgA6wLBd6V4lRi0svN2hBouN/be9dXQ31X4sLWz3fAQDf+nt6BA==} + '@smithy/middleware-endpoint@4.4.28': + resolution: {integrity: sha512-p1gfYpi91CHcs5cBq982UlGlDrxoYUX6XdHSo91cQ2KFuz6QloHosO7Jc60pJiVmkWrKOV8kFYlGFFbQ2WUKKQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.44': - resolution: {integrity: sha512-Y1Rav7m5CFRPQyM4CI0koD/bXjyjJu3EQxZZhtLGD88WIrBrQ7kqXM96ncd6rYnojwOo/u9MXu57JrEvu/nLrA==} + '@smithy/middleware-retry@4.4.46': + resolution: {integrity: sha512-SpvWNNOPOrKQGUqZbEPO+es+FRXMWvIyzUKUOYdDgdlA6BdZj/R58p4umoQ76c2oJC44PiM7mKizyyex1IJzow==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.2.15': - resolution: {integrity: sha512-ExYhcltZSli0pgAKOpQQe1DLFBLryeZ22605y/YS+mQpdNWekum9Ujb/jMKfJKgjtz1AZldtwA/wCYuKJgjjlg==} + '@smithy/middleware-serde@4.2.16': + resolution: {integrity: sha512-beqfV+RZ9RSv+sQqor3xroUUYgRFCGRw6niGstPG8zO9LgTl0B0MCucxjmrH/2WwksQN7UUgI7KNANoZv+KALA==} engines: {node: '>=18.0.0'} '@smithy/middleware-stack@4.2.12': @@ -3555,8 +3557,8 @@ packages: resolution: {integrity: sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.5.0': - resolution: {integrity: sha512-Rnq9vQWiR1+/I6NZZMNzJHV6pZYyEHt2ZnuV3MG8z2NNenC4i/8Kzttz7CjZiHSmsN5frhXhg17z3Zqjjhmz1A==} + '@smithy/node-http-handler@4.5.1': + resolution: {integrity: sha512-ejjxdAXjkPIs9lyYyVutOGNOraqUE9v/NjGMKwwFrfOM354wfSD8lmlj8hVwUzQmlLLF4+udhfCX9Exnbmvfzw==} engines: {node: '>=18.0.0'} '@smithy/property-provider@4.2.12': @@ -3587,8 +3589,8 @@ packages: resolution: {integrity: sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.12.7': - resolution: {integrity: sha512-q3gqnwml60G44FECaEEsdQMplYhDMZYCtYhMCzadCnRnnHIobZJjegmdoUo6ieLQlPUzvrMdIJUpx6DoPmzANQ==} + '@smithy/smithy-client@4.12.8': + resolution: {integrity: sha512-aJaAX7vHe5i66smoSSID7t4rKY08PbD8EBU7DOloixvhOozfYWdcSYE4l6/tjkZ0vBZhGjheWzB2mh31sLgCMA==} engines: {node: '>=18.0.0'} '@smithy/types@4.13.1': @@ -3623,12 +3625,12 @@ packages: resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.43': - resolution: {integrity: sha512-Qd/0wCKMaXxev/z00TvNzGCH2jlKKKxXP1aDxB6oKwSQthe3Og2dMhSayGCnsma1bK/kQX1+X7SMP99t6FgiiQ==} + '@smithy/util-defaults-mode-browser@4.3.44': + resolution: {integrity: sha512-eZg6XzaCbVr2S5cAErU5eGBDaOVTuTo1I65i4tQcHENRcZ8rMWhQy1DaIYUSLyZjsfXvmCqZrstSMYyGFocvHA==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.47': - resolution: {integrity: sha512-qSRbYp1EQ7th+sPFuVcVO05AE0QH635hycdEXlpzIahqHHf2Fyd/Zl+8v0XYMJ3cgDVPa0lkMefU7oNUjAP+DQ==} + '@smithy/util-defaults-mode-node@4.2.48': + resolution: {integrity: sha512-FqOKTlqSaoV3nzO55pMs5NBnZX8EhoI0DGmn9kbYeXWppgHD6dchyuj2HLqp4INJDJbSrj6OFYJkAh/WhSzZPg==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.3.3': @@ -3643,12 +3645,12 @@ packages: resolution: {integrity: sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.2.12': - resolution: {integrity: sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==} + '@smithy/util-retry@4.2.13': + resolution: {integrity: sha512-qQQsIvL0MGIbUjeSrg0/VlQ3jGNKyM3/2iU3FPNgy01z+Sp4OvcaxbgIoFOTvB61ZoohtutuOvOcgmhbD0katQ==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.5.20': - resolution: {integrity: sha512-4yXLm5n/B5SRBR2p8cZ90Sbv4zL4NKsgxdzCzp/83cXw2KxLEumt5p+GAVyRNZgQOSrzXn9ARpO0lUe8XSlSDw==} + '@smithy/util-stream@4.5.21': + resolution: {integrity: sha512-KzSg+7KKywLnkoKejRtIBXDmwBfjGvg1U1i/etkC7XSWUyFCoLno1IohV2c74IzQqdhX5y3uE44r/8/wuK+A7Q==} engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.2.2': @@ -4325,8 +4327,8 @@ packages: ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} - alchemy@0.90.0: - resolution: {integrity: sha512-bIImN1RQFhSyM93OJJA+w/+Rf4EH8P+uETSpuMkUc234mNpR3nRRtEqpdlcjlDyF8pnF4ySEjICtkov0R3+Pag==} + alchemy@0.90.1: + resolution: {integrity: sha512-JqtwqIEM1sSmu+PJx+de/AUuGmievnG7n2p0z/kgcjTdjo2SwDB4sNUP3nTWOqHUVulibObTDTzWOe04KREuZQ==} hasBin: true peerDependencies: '@astrojs/cloudflare': ^12.6.4 @@ -4583,8 +4585,8 @@ packages: bowser@2.14.1: resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@2.0.3: + resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==} brace-expansion@5.0.4: resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} @@ -4993,6 +4995,9 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + defu@6.1.6: + resolution: {integrity: sha512-f8mefEW4WIVg4LckePx3mALjQSPQgFlg9U8yaPdlsbdYcHQyj9n2zL2LJEA52smeYxOvmd/nB7TpMtHGMTHcug==} + degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} @@ -5355,12 +5360,12 @@ packages: fast-xml-builder@1.1.4: resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} - fast-xml-parser@5.5.8: - resolution: {integrity: sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==} + fast-xml-parser@5.5.10: + resolution: {integrity: sha512-go2J2xODMc32hT+4Xr/bBGXMaIoiCwrwp2mMtAvKyvEFW6S/v5Gn2pBmE4nvbwNjGhpcAiOwEv7R6/GZ6XRa9w==} hasBin: true - fast-xml-parser@5.5.9: - resolution: {integrity: sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g==} + fast-xml-parser@5.5.8: + resolution: {integrity: sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==} hasBin: true fd-package-json@2.0.0: @@ -6054,8 +6059,8 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - miniflare@4.20260317.1: - resolution: {integrity: sha512-A3csI1HXEIfqe3oscgpoRMHdYlkReQKPH/g5JE53vFSjoM6YIAOGAzyDNeYffwd9oQkPWDj9xER8+vpxei8klA==} + miniflare@4.20260401.0: + resolution: {integrity: sha512-lngHPzZFN9sxYG/mhzvnWiBMNVAN5MsO/7g32ttJ07rymtiK/ZBalODTKb8Od+BQdlU5DOR4CjVt9NydjnUyYg==} engines: {node: '>=18.0.0'} hasBin: true @@ -6315,8 +6320,8 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - path-expression-matcher@1.2.0: - resolution: {integrity: sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==} + path-expression-matcher@1.2.1: + resolution: {integrity: sha512-d7gQQmLvAKXKXE2GeP9apIGbMYKz88zWdsn/BN2HRWVQsDFdUY36WSLTY0Jvd4HWi7Fb30gQ62oAOzdgJA6fZw==} engines: {node: '>=14.0.0'} path-key@3.1.1: @@ -6859,8 +6864,8 @@ packages: engines: {node: '>=20.16.0'} hasBin: true - srvx@0.11.13: - resolution: {integrity: sha512-oknN6qduuMPafxKtHucUeG32Q963pjriA5g3/Bl05cwEsUe5VVbIU4qR9LrALHbipSCyBe+VmfDGGydqazDRkw==} + srvx@0.11.15: + resolution: {integrity: sha512-iXsux0UcOjdvs0LCMa2Ws3WwcDUozA3JN3BquNXkaFPP7TpRqgunKdEgoZ/uwb1J6xaYHfxtz9Twlh6yzwM6Tg==} engines: {node: '>=20.16.0'} hasBin: true @@ -7066,22 +7071,10 @@ packages: undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici@6.23.0: - resolution: {integrity: sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==} - engines: {node: '>=18.17'} - undici@7.18.2: resolution: {integrity: sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==} engines: {node: '>=20.18.1'} - undici@7.24.4: - resolution: {integrity: sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==} - engines: {node: '>=20.18.1'} - - undici@7.24.5: - resolution: {integrity: sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q==} - engines: {node: '>=20.18.1'} - unenv@2.0.0-rc.21: resolution: {integrity: sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==} @@ -7362,17 +7355,17 @@ packages: engines: {node: '>=16'} hasBin: true - workerd@1.20260317.1: - resolution: {integrity: sha512-ZuEq1OdrJBS+NV+L5HMYPCzVn49a2O60slQiiLpG44jqtlOo+S167fWC76kEXteXLLLydeuRrluRel7WdOUa4g==} + workerd@1.20260401.1: + resolution: {integrity: sha512-mUYCd+ohaWJWF5nhDzxugWaAD/DM8Dw0ze3B7bu8JaA7S70+XQJXcvcvwE8C4qGcxSdCyqjsrFzqxKubECDwzg==} engines: {node: '>=16'} hasBin: true - wrangler@4.76.0: - resolution: {integrity: sha512-Wan+CU5a0tu4HIxGOrzjNbkmxCT27HUmzrMj6kc7aoAnjSLv50Ggcn2Ant7wNQrD6xW3g31phKupZJgTZ8wZfQ==} - engines: {node: '>=20.0.0'} + wrangler@4.80.0: + resolution: {integrity: sha512-2ZKF7uPeOZy65BGk3YfvqBCPo/xH1MrAlMmH9mVP+tCNBrTUMnwOHSj1HrZHgR8LttkAqhko0fGz+I4ax1rzyQ==} + engines: {node: '>=20.3.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20260317.1 + '@cloudflare/workers-types': ^4.20260401.1 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -7514,69 +7507,69 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-cognito-identity@3.1014.0': + '@aws-sdk/client-cognito-identity@3.1024.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.23 - '@aws-sdk/credential-provider-node': 3.972.24 + '@aws-sdk/core': 3.973.26 + '@aws-sdk/credential-provider-node': 3.972.29 '@aws-sdk/middleware-host-header': 3.972.8 '@aws-sdk/middleware-logger': 3.972.8 - '@aws-sdk/middleware-recursion-detection': 3.972.8 - '@aws-sdk/middleware-user-agent': 3.972.24 - '@aws-sdk/region-config-resolver': 3.972.9 + '@aws-sdk/middleware-recursion-detection': 3.972.9 + '@aws-sdk/middleware-user-agent': 3.972.28 + '@aws-sdk/region-config-resolver': 3.972.10 '@aws-sdk/types': 3.973.6 '@aws-sdk/util-endpoints': 3.996.5 '@aws-sdk/util-user-agent-browser': 3.972.8 - '@aws-sdk/util-user-agent-node': 3.973.10 + '@aws-sdk/util-user-agent-node': 3.973.14 '@smithy/config-resolver': 4.4.13 - '@smithy/core': 3.23.12 + '@smithy/core': 3.23.13 '@smithy/fetch-http-handler': 5.3.15 '@smithy/hash-node': 4.2.12 '@smithy/invalid-dependency': 4.2.12 '@smithy/middleware-content-length': 4.2.12 - '@smithy/middleware-endpoint': 4.4.27 - '@smithy/middleware-retry': 4.4.44 - '@smithy/middleware-serde': 4.2.15 + '@smithy/middleware-endpoint': 4.4.28 + '@smithy/middleware-retry': 4.4.46 + '@smithy/middleware-serde': 4.2.16 '@smithy/middleware-stack': 4.2.12 '@smithy/node-config-provider': 4.3.12 - '@smithy/node-http-handler': 4.5.0 + '@smithy/node-http-handler': 4.5.1 '@smithy/protocol-http': 5.3.12 - '@smithy/smithy-client': 4.12.7 + '@smithy/smithy-client': 4.12.8 '@smithy/types': 4.13.1 '@smithy/url-parser': 4.2.12 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.43 - '@smithy/util-defaults-mode-node': 4.2.47 + '@smithy/util-defaults-mode-browser': 4.3.44 + '@smithy/util-defaults-mode-node': 4.2.48 '@smithy/util-endpoints': 3.3.3 '@smithy/util-middleware': 4.2.12 - '@smithy/util-retry': 4.2.12 + '@smithy/util-retry': 4.2.13 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.973.23': + '@aws-sdk/core@3.973.26': dependencies: '@aws-sdk/types': 3.973.6 - '@aws-sdk/xml-builder': 3.972.15 - '@smithy/core': 3.23.12 + '@aws-sdk/xml-builder': 3.972.16 + '@smithy/core': 3.23.13 '@smithy/node-config-provider': 4.3.12 '@smithy/property-provider': 4.2.12 '@smithy/protocol-http': 5.3.12 '@smithy/signature-v4': 5.3.12 - '@smithy/smithy-client': 4.12.7 + '@smithy/smithy-client': 4.12.8 '@smithy/types': 4.13.1 '@smithy/util-base64': 4.3.2 '@smithy/util-middleware': 4.2.12 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-cognito-identity@3.972.16': + '@aws-sdk/credential-provider-cognito-identity@3.972.21': dependencies: - '@aws-sdk/nested-clients': 3.996.13 + '@aws-sdk/nested-clients': 3.996.18 '@aws-sdk/types': 3.973.6 '@smithy/property-provider': 4.2.12 '@smithy/types': 4.13.1 @@ -7584,37 +7577,37 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-env@3.972.21': + '@aws-sdk/credential-provider-env@3.972.24': dependencies: - '@aws-sdk/core': 3.973.23 + '@aws-sdk/core': 3.973.26 '@aws-sdk/types': 3.973.6 '@smithy/property-provider': 4.2.12 '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.23': + '@aws-sdk/credential-provider-http@3.972.26': dependencies: - '@aws-sdk/core': 3.973.23 + '@aws-sdk/core': 3.973.26 '@aws-sdk/types': 3.973.6 '@smithy/fetch-http-handler': 5.3.15 - '@smithy/node-http-handler': 4.5.0 + '@smithy/node-http-handler': 4.5.1 '@smithy/property-provider': 4.2.12 '@smithy/protocol-http': 5.3.12 - '@smithy/smithy-client': 4.12.7 + '@smithy/smithy-client': 4.12.8 '@smithy/types': 4.13.1 - '@smithy/util-stream': 4.5.20 + '@smithy/util-stream': 4.5.21 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.972.23': + '@aws-sdk/credential-provider-ini@3.972.28': dependencies: - '@aws-sdk/core': 3.973.23 - '@aws-sdk/credential-provider-env': 3.972.21 - '@aws-sdk/credential-provider-http': 3.972.23 - '@aws-sdk/credential-provider-login': 3.972.23 - '@aws-sdk/credential-provider-process': 3.972.21 - '@aws-sdk/credential-provider-sso': 3.972.23 - '@aws-sdk/credential-provider-web-identity': 3.972.23 - '@aws-sdk/nested-clients': 3.996.13 + '@aws-sdk/core': 3.973.26 + '@aws-sdk/credential-provider-env': 3.972.24 + '@aws-sdk/credential-provider-http': 3.972.26 + '@aws-sdk/credential-provider-login': 3.972.28 + '@aws-sdk/credential-provider-process': 3.972.24 + '@aws-sdk/credential-provider-sso': 3.972.28 + '@aws-sdk/credential-provider-web-identity': 3.972.28 + '@aws-sdk/nested-clients': 3.996.18 '@aws-sdk/types': 3.973.6 '@smithy/credential-provider-imds': 4.2.12 '@smithy/property-provider': 4.2.12 @@ -7624,10 +7617,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.972.23': + '@aws-sdk/credential-provider-login@3.972.28': dependencies: - '@aws-sdk/core': 3.973.23 - '@aws-sdk/nested-clients': 3.996.13 + '@aws-sdk/core': 3.973.26 + '@aws-sdk/nested-clients': 3.996.18 '@aws-sdk/types': 3.973.6 '@smithy/property-provider': 4.2.12 '@smithy/protocol-http': 5.3.12 @@ -7637,14 +7630,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.972.24': + '@aws-sdk/credential-provider-node@3.972.29': dependencies: - '@aws-sdk/credential-provider-env': 3.972.21 - '@aws-sdk/credential-provider-http': 3.972.23 - '@aws-sdk/credential-provider-ini': 3.972.23 - '@aws-sdk/credential-provider-process': 3.972.21 - '@aws-sdk/credential-provider-sso': 3.972.23 - '@aws-sdk/credential-provider-web-identity': 3.972.23 + '@aws-sdk/credential-provider-env': 3.972.24 + '@aws-sdk/credential-provider-http': 3.972.26 + '@aws-sdk/credential-provider-ini': 3.972.28 + '@aws-sdk/credential-provider-process': 3.972.24 + '@aws-sdk/credential-provider-sso': 3.972.28 + '@aws-sdk/credential-provider-web-identity': 3.972.28 '@aws-sdk/types': 3.973.6 '@smithy/credential-provider-imds': 4.2.12 '@smithy/property-provider': 4.2.12 @@ -7654,20 +7647,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.972.21': + '@aws-sdk/credential-provider-process@3.972.24': dependencies: - '@aws-sdk/core': 3.973.23 + '@aws-sdk/core': 3.973.26 '@aws-sdk/types': 3.973.6 '@smithy/property-provider': 4.2.12 '@smithy/shared-ini-file-loader': 4.4.7 '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.972.23': + '@aws-sdk/credential-provider-sso@3.972.28': dependencies: - '@aws-sdk/core': 3.973.23 - '@aws-sdk/nested-clients': 3.996.13 - '@aws-sdk/token-providers': 3.1014.0 + '@aws-sdk/core': 3.973.26 + '@aws-sdk/nested-clients': 3.996.18 + '@aws-sdk/token-providers': 3.1021.0 '@aws-sdk/types': 3.973.6 '@smithy/property-provider': 4.2.12 '@smithy/shared-ini-file-loader': 4.4.7 @@ -7676,10 +7669,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.23': + '@aws-sdk/credential-provider-web-identity@3.972.28': dependencies: - '@aws-sdk/core': 3.973.23 - '@aws-sdk/nested-clients': 3.996.13 + '@aws-sdk/core': 3.973.26 + '@aws-sdk/nested-clients': 3.996.18 '@aws-sdk/types': 3.973.6 '@smithy/property-provider': 4.2.12 '@smithy/shared-ini-file-loader': 4.4.7 @@ -7688,23 +7681,23 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-providers@3.1014.0': - dependencies: - '@aws-sdk/client-cognito-identity': 3.1014.0 - '@aws-sdk/core': 3.973.23 - '@aws-sdk/credential-provider-cognito-identity': 3.972.16 - '@aws-sdk/credential-provider-env': 3.972.21 - '@aws-sdk/credential-provider-http': 3.972.23 - '@aws-sdk/credential-provider-ini': 3.972.23 - '@aws-sdk/credential-provider-login': 3.972.23 - '@aws-sdk/credential-provider-node': 3.972.24 - '@aws-sdk/credential-provider-process': 3.972.21 - '@aws-sdk/credential-provider-sso': 3.972.23 - '@aws-sdk/credential-provider-web-identity': 3.972.23 - '@aws-sdk/nested-clients': 3.996.13 + '@aws-sdk/credential-providers@3.1024.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.1024.0 + '@aws-sdk/core': 3.973.26 + '@aws-sdk/credential-provider-cognito-identity': 3.972.21 + '@aws-sdk/credential-provider-env': 3.972.24 + '@aws-sdk/credential-provider-http': 3.972.26 + '@aws-sdk/credential-provider-ini': 3.972.28 + '@aws-sdk/credential-provider-login': 3.972.28 + '@aws-sdk/credential-provider-node': 3.972.29 + '@aws-sdk/credential-provider-process': 3.972.24 + '@aws-sdk/credential-provider-sso': 3.972.28 + '@aws-sdk/credential-provider-web-identity': 3.972.28 + '@aws-sdk/nested-clients': 3.996.18 '@aws-sdk/types': 3.973.6 '@smithy/config-resolver': 4.4.13 - '@smithy/core': 3.23.12 + '@smithy/core': 3.23.13 '@smithy/credential-provider-imds': 4.2.12 '@smithy/node-config-provider': 4.3.12 '@smithy/property-provider': 4.2.12 @@ -7726,7 +7719,7 @@ snapshots: '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.972.8': + '@aws-sdk/middleware-recursion-detection@3.972.9': dependencies: '@aws-sdk/types': 3.973.6 '@aws/lambda-invoke-store': 0.2.4 @@ -7734,61 +7727,61 @@ snapshots: '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.972.24': + '@aws-sdk/middleware-user-agent@3.972.28': dependencies: - '@aws-sdk/core': 3.973.23 + '@aws-sdk/core': 3.973.26 '@aws-sdk/types': 3.973.6 '@aws-sdk/util-endpoints': 3.996.5 - '@smithy/core': 3.23.12 + '@smithy/core': 3.23.13 '@smithy/protocol-http': 5.3.12 '@smithy/types': 4.13.1 - '@smithy/util-retry': 4.2.12 + '@smithy/util-retry': 4.2.13 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.996.13': + '@aws-sdk/nested-clients@3.996.18': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.23 + '@aws-sdk/core': 3.973.26 '@aws-sdk/middleware-host-header': 3.972.8 '@aws-sdk/middleware-logger': 3.972.8 - '@aws-sdk/middleware-recursion-detection': 3.972.8 - '@aws-sdk/middleware-user-agent': 3.972.24 - '@aws-sdk/region-config-resolver': 3.972.9 + '@aws-sdk/middleware-recursion-detection': 3.972.9 + '@aws-sdk/middleware-user-agent': 3.972.28 + '@aws-sdk/region-config-resolver': 3.972.10 '@aws-sdk/types': 3.973.6 '@aws-sdk/util-endpoints': 3.996.5 '@aws-sdk/util-user-agent-browser': 3.972.8 - '@aws-sdk/util-user-agent-node': 3.973.10 + '@aws-sdk/util-user-agent-node': 3.973.14 '@smithy/config-resolver': 4.4.13 - '@smithy/core': 3.23.12 + '@smithy/core': 3.23.13 '@smithy/fetch-http-handler': 5.3.15 '@smithy/hash-node': 4.2.12 '@smithy/invalid-dependency': 4.2.12 '@smithy/middleware-content-length': 4.2.12 - '@smithy/middleware-endpoint': 4.4.27 - '@smithy/middleware-retry': 4.4.44 - '@smithy/middleware-serde': 4.2.15 + '@smithy/middleware-endpoint': 4.4.28 + '@smithy/middleware-retry': 4.4.46 + '@smithy/middleware-serde': 4.2.16 '@smithy/middleware-stack': 4.2.12 '@smithy/node-config-provider': 4.3.12 - '@smithy/node-http-handler': 4.5.0 + '@smithy/node-http-handler': 4.5.1 '@smithy/protocol-http': 5.3.12 - '@smithy/smithy-client': 4.12.7 + '@smithy/smithy-client': 4.12.8 '@smithy/types': 4.13.1 '@smithy/url-parser': 4.2.12 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.43 - '@smithy/util-defaults-mode-node': 4.2.47 + '@smithy/util-defaults-mode-browser': 4.3.44 + '@smithy/util-defaults-mode-node': 4.2.48 '@smithy/util-endpoints': 3.3.3 '@smithy/util-middleware': 4.2.12 - '@smithy/util-retry': 4.2.12 + '@smithy/util-retry': 4.2.13 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.972.9': + '@aws-sdk/region-config-resolver@3.972.10': dependencies: '@aws-sdk/types': 3.973.6 '@smithy/config-resolver': 4.4.13 @@ -7796,10 +7789,10 @@ snapshots: '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/token-providers@3.1014.0': + '@aws-sdk/token-providers@3.1021.0': dependencies: - '@aws-sdk/core': 3.973.23 - '@aws-sdk/nested-clients': 3.996.13 + '@aws-sdk/core': 3.973.26 + '@aws-sdk/nested-clients': 3.996.18 '@aws-sdk/types': 3.973.6 '@smithy/property-provider': 4.2.12 '@smithy/shared-ini-file-loader': 4.4.7 @@ -7832,16 +7825,16 @@ snapshots: bowser: 2.14.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.973.10': + '@aws-sdk/util-user-agent-node@3.973.14': dependencies: - '@aws-sdk/middleware-user-agent': 3.972.24 + '@aws-sdk/middleware-user-agent': 3.972.28 '@aws-sdk/types': 3.973.6 '@smithy/node-config-provider': 4.3.12 '@smithy/types': 4.13.1 '@smithy/util-config-provider': 4.2.2 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.15': + '@aws-sdk/xml-builder@3.972.16': dependencies: '@smithy/types': 4.13.1 fast-xml-parser: 5.5.8 @@ -7969,7 +7962,7 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0)': + '@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0)': dependencies: '@better-auth/utils': 0.3.1 '@better-fetch/fetch': 1.1.21 @@ -7982,45 +7975,45 @@ snapshots: nanostores: 1.2.0 zod: 4.3.6 optionalDependencies: - '@cloudflare/workers-types': 4.20260317.1 + '@cloudflare/workers-types': 4.20260405.1 - '@better-auth/drizzle-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260317.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)))': + '@better-auth/drizzle-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)))': dependencies: - '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) + '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) '@better-auth/utils': 0.3.1 optionalDependencies: - drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260317.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) + drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) - '@better-auth/kysely-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.14)': + '@better-auth/kysely-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.14)': dependencies: - '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) + '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) '@better-auth/utils': 0.3.1 optionalDependencies: kysely: 0.28.14 - '@better-auth/memory-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)': + '@better-auth/memory-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)': dependencies: - '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) + '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) '@better-auth/utils': 0.3.1 - '@better-auth/mongo-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(mongodb@7.1.0(@aws-sdk/credential-providers@3.1014.0)(socks@2.8.7))': + '@better-auth/mongo-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(mongodb@7.1.0(@aws-sdk/credential-providers@3.1024.0)(socks@2.8.7))': dependencies: - '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) + '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) '@better-auth/utils': 0.3.1 optionalDependencies: - mongodb: 7.1.0(@aws-sdk/credential-providers@3.1014.0)(socks@2.8.7) + mongodb: 7.1.0(@aws-sdk/credential-providers@3.1024.0)(socks@2.8.7) - '@better-auth/prisma-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))': + '@better-auth/prisma-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))': dependencies: - '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) + '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) '@better-auth/utils': 0.3.1 optionalDependencies: '@prisma/client': 7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2) prisma: 7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2) - '@better-auth/telemetry@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))': + '@better-auth/telemetry@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))': dependencies: - '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) + '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) '@better-auth/utils': 0.3.1 '@better-fetch/fetch': 1.1.21 @@ -8049,25 +8042,25 @@ snapshots: '@cloudflare/kv-asset-handler@0.4.2': {} - '@cloudflare/unenv-preset@2.16.0(unenv@2.0.0-rc.24)(workerd@1.20260317.1)': + '@cloudflare/unenv-preset@2.16.0(unenv@2.0.0-rc.24)(workerd@1.20260401.1)': dependencies: unenv: 2.0.0-rc.24 optionalDependencies: - workerd: 1.20260317.1 + workerd: 1.20260401.1 - '@cloudflare/unenv-preset@2.7.7(unenv@2.0.0-rc.21)(workerd@1.20260317.1)': + '@cloudflare/unenv-preset@2.7.7(unenv@2.0.0-rc.21)(workerd@1.20260401.1)': dependencies: unenv: 2.0.0-rc.21 optionalDependencies: - workerd: 1.20260317.1 + workerd: 1.20260401.1 - '@cloudflare/vite-plugin@1.30.0(vite@8.0.2)(workerd@1.20260317.1)(wrangler@4.76.0(@cloudflare/workers-types@4.20260317.1))': + '@cloudflare/vite-plugin@1.31.0(vite@8.0.2)(workerd@1.20260401.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1))': dependencies: - '@cloudflare/unenv-preset': 2.16.0(unenv@2.0.0-rc.24)(workerd@1.20260317.1) - miniflare: 4.20260317.1 + '@cloudflare/unenv-preset': 2.16.0(unenv@2.0.0-rc.24)(workerd@1.20260401.1) + miniflare: 4.20260401.0 unenv: 2.0.0-rc.24 vite: 8.0.2(@types/node@25.5.0)(@vitejs/devtools@0.1.8)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) - wrangler: 4.76.0(@cloudflare/workers-types@4.20260317.1) + wrangler: 4.80.0(@cloudflare/workers-types@4.20260405.1) ws: 8.18.0 transitivePeerDependencies: - bufferutil @@ -8077,34 +8070,34 @@ snapshots: '@cloudflare/workerd-darwin-64@1.20260310.1': optional: true - '@cloudflare/workerd-darwin-64@1.20260317.1': + '@cloudflare/workerd-darwin-64@1.20260401.1': optional: true '@cloudflare/workerd-darwin-arm64@1.20260310.1': optional: true - '@cloudflare/workerd-darwin-arm64@1.20260317.1': + '@cloudflare/workerd-darwin-arm64@1.20260401.1': optional: true '@cloudflare/workerd-linux-64@1.20260310.1': optional: true - '@cloudflare/workerd-linux-64@1.20260317.1': + '@cloudflare/workerd-linux-64@1.20260401.1': optional: true '@cloudflare/workerd-linux-arm64@1.20260310.1': optional: true - '@cloudflare/workerd-linux-arm64@1.20260317.1': + '@cloudflare/workerd-linux-arm64@1.20260401.1': optional: true '@cloudflare/workerd-windows-64@1.20260310.1': optional: true - '@cloudflare/workerd-windows-64@1.20260317.1': + '@cloudflare/workerd-windows-64@1.20260401.1': optional: true - '@cloudflare/workers-types@4.20260317.1': {} + '@cloudflare/workers-types@4.20260405.1': {} '@commitlint/cli@20.5.0(@types/node@25.5.0)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0)(typescript@6.0.2)': dependencies: @@ -8266,6 +8259,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.9.2': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.0': dependencies: tslib: 2.8.1 @@ -8695,7 +8693,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.9.1 + '@emnapi/runtime': 1.9.2 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -10507,7 +10505,7 @@ snapshots: '@rollup/rollup-linux-x64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.0': + '@rollup/rollup-linux-x64-gnu@4.60.1': optional: true '@rollup/rollup-linux-x64-musl@4.59.0': @@ -10547,11 +10545,6 @@ snapshots: '@sindresorhus/merge-streams@4.0.0': {} - '@smithy/abort-controller@4.2.12': - dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 - '@smithy/config-resolver@4.4.13': dependencies: '@smithy/node-config-provider': 4.3.12 @@ -10561,7 +10554,7 @@ snapshots: '@smithy/util-middleware': 4.2.12 tslib: 2.8.1 - '@smithy/core@3.23.12': + '@smithy/core@3.23.13': dependencies: '@smithy/protocol-http': 5.3.12 '@smithy/types': 4.13.1 @@ -10569,7 +10562,7 @@ snapshots: '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 '@smithy/util-middleware': 4.2.12 - '@smithy/util-stream': 4.5.20 + '@smithy/util-stream': 4.5.21 '@smithy/util-utf8': 4.2.2 '@smithy/uuid': 1.1.2 tslib: 2.8.1 @@ -10616,10 +10609,10 @@ snapshots: '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.27': + '@smithy/middleware-endpoint@4.4.28': dependencies: - '@smithy/core': 3.23.12 - '@smithy/middleware-serde': 4.2.15 + '@smithy/core': 3.23.13 + '@smithy/middleware-serde': 4.2.16 '@smithy/node-config-provider': 4.3.12 '@smithy/shared-ini-file-loader': 4.4.7 '@smithy/types': 4.13.1 @@ -10627,21 +10620,21 @@ snapshots: '@smithy/util-middleware': 4.2.12 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.44': + '@smithy/middleware-retry@4.4.46': dependencies: '@smithy/node-config-provider': 4.3.12 '@smithy/protocol-http': 5.3.12 '@smithy/service-error-classification': 4.2.12 - '@smithy/smithy-client': 4.12.7 + '@smithy/smithy-client': 4.12.8 '@smithy/types': 4.13.1 '@smithy/util-middleware': 4.2.12 - '@smithy/util-retry': 4.2.12 + '@smithy/util-retry': 4.2.13 '@smithy/uuid': 1.1.2 tslib: 2.8.1 - '@smithy/middleware-serde@4.2.15': + '@smithy/middleware-serde@4.2.16': dependencies: - '@smithy/core': 3.23.12 + '@smithy/core': 3.23.13 '@smithy/protocol-http': 5.3.12 '@smithy/types': 4.13.1 tslib: 2.8.1 @@ -10658,9 +10651,8 @@ snapshots: '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/node-http-handler@4.5.0': + '@smithy/node-http-handler@4.5.1': dependencies: - '@smithy/abort-controller': 4.2.12 '@smithy/protocol-http': 5.3.12 '@smithy/querystring-builder': 4.2.12 '@smithy/types': 4.13.1 @@ -10707,14 +10699,14 @@ snapshots: '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/smithy-client@4.12.7': + '@smithy/smithy-client@4.12.8': dependencies: - '@smithy/core': 3.23.12 - '@smithy/middleware-endpoint': 4.4.27 + '@smithy/core': 3.23.13 + '@smithy/middleware-endpoint': 4.4.28 '@smithy/middleware-stack': 4.2.12 '@smithy/protocol-http': 5.3.12 '@smithy/types': 4.13.1 - '@smithy/util-stream': 4.5.20 + '@smithy/util-stream': 4.5.21 tslib: 2.8.1 '@smithy/types@4.13.1': @@ -10755,20 +10747,20 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.43': + '@smithy/util-defaults-mode-browser@4.3.44': dependencies: '@smithy/property-provider': 4.2.12 - '@smithy/smithy-client': 4.12.7 + '@smithy/smithy-client': 4.12.8 '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.47': + '@smithy/util-defaults-mode-node@4.2.48': dependencies: '@smithy/config-resolver': 4.4.13 '@smithy/credential-provider-imds': 4.2.12 '@smithy/node-config-provider': 4.3.12 '@smithy/property-provider': 4.2.12 - '@smithy/smithy-client': 4.12.7 + '@smithy/smithy-client': 4.12.8 '@smithy/types': 4.13.1 tslib: 2.8.1 @@ -10787,16 +10779,16 @@ snapshots: '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-retry@4.2.12': + '@smithy/util-retry@4.2.13': dependencies: '@smithy/service-error-classification': 4.2.12 '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-stream@4.5.20': + '@smithy/util-stream@4.5.21': dependencies: '@smithy/fetch-http-handler': 5.3.15 - '@smithy/node-http-handler': 4.5.0 + '@smithy/node-http-handler': 4.5.1 '@smithy/types': 4.13.1 '@smithy/util-base64': 4.3.2 '@smithy/util-buffer-from': 4.2.2 @@ -11141,24 +11133,24 @@ snapshots: - solid-js - vue - '@tanstack/react-form-start@1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-form-start@1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.15))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@tanstack/react-form': 1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/react-form': 1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.15))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) decode-formdata: 0.9.0 devalue: 5.6.4 react: 19.2.4 optionalDependencies: - '@tanstack/react-start': 1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) + '@tanstack/react-start': 1.167.5(crossws@0.4.1(srvx@0.11.15))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) transitivePeerDependencies: - react-dom - '@tanstack/react-form@1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-form@1.28.5(@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.15))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@tanstack/form-core': 1.28.5 '@tanstack/react-store': 0.9.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 optionalDependencies: - '@tanstack/react-start': 1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) + '@tanstack/react-start': 1.167.5(crossws@0.4.1(srvx@0.11.15))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) transitivePeerDependencies: - react-dom @@ -11190,27 +11182,27 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@tanstack/react-start-server@1.166.18(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-start-server@1.166.18(crossws@0.4.1(srvx@0.11.15))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@tanstack/history': 1.161.6 '@tanstack/react-router': 1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/router-core': 1.168.3 '@tanstack/start-client-core': 1.167.3 - '@tanstack/start-server-core': 1.167.3(crossws@0.4.1(srvx@0.11.13)) + '@tanstack/start-server-core': 1.167.3(crossws@0.4.1(srvx@0.11.15)) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2)': + '@tanstack/react-start@1.167.5(crossws@0.4.1(srvx@0.11.15))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2)': dependencies: '@tanstack/react-router': 1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-start-client': 1.166.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/react-start-server': 1.166.18(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/react-start-server': 1.166.18(crossws@0.4.1(srvx@0.11.15))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.3 - '@tanstack/start-plugin-core': 1.167.8(@tanstack/react-router@1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(crossws@0.4.1(srvx@0.11.13))(vite@8.0.2) - '@tanstack/start-server-core': 1.167.3(crossws@0.4.1(srvx@0.11.13)) + '@tanstack/start-plugin-core': 1.167.8(@tanstack/react-router@1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(crossws@0.4.1(srvx@0.11.15))(vite@8.0.2) + '@tanstack/start-server-core': 1.167.3(crossws@0.4.1(srvx@0.11.15)) pathe: 2.0.3 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -11301,7 +11293,7 @@ snapshots: '@tanstack/start-fn-stubs@1.161.6': {} - '@tanstack/start-plugin-core@1.167.8(@tanstack/react-router@1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(crossws@0.4.1(srvx@0.11.13))(vite@8.0.2)': + '@tanstack/start-plugin-core@1.167.8(@tanstack/react-router@1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(crossws@0.4.1(srvx@0.11.15))(vite@8.0.2)': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 @@ -11312,7 +11304,7 @@ snapshots: '@tanstack/router-plugin': 1.167.4(@tanstack/react-router@1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.2) '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.3 - '@tanstack/start-server-core': 1.167.3(crossws@0.4.1(srvx@0.11.13)) + '@tanstack/start-server-core': 1.167.3(crossws@0.4.1(srvx@0.11.15)) cheerio: 1.2.0 exsolve: 1.0.8 pathe: 2.0.3 @@ -11333,13 +11325,13 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-server-core@1.167.3(crossws@0.4.1(srvx@0.11.13))': + '@tanstack/start-server-core@1.167.3(crossws@0.4.1(srvx@0.11.15))': dependencies: '@tanstack/history': 1.161.6 '@tanstack/router-core': 1.168.3 '@tanstack/start-client-core': 1.167.3 '@tanstack/start-storage-context': 1.166.17 - h3-v2: h3@2.0.1-rc.16(crossws@0.4.1(srvx@0.11.13)) + h3-v2: h3@2.0.1-rc.16(crossws@0.4.1(srvx@0.11.15)) seroval: 1.5.1 transitivePeerDependencies: - crossws @@ -11702,22 +11694,22 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - alchemy@0.90.0(@cloudflare/vite-plugin@1.30.0(vite@8.0.2)(workerd@1.20260317.1)(wrangler@4.76.0(@cloudflare/workers-types@4.20260317.1)))(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(vite@8.0.2)(workerd@1.20260317.1)(wrangler@4.76.0(@cloudflare/workers-types@4.20260317.1)): + alchemy@0.90.1(@cloudflare/vite-plugin@1.31.0(vite@8.0.2)(workerd@1.20260401.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)))(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(vite@8.0.2)(workerd@1.20260401.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)): dependencies: - '@aws-sdk/credential-providers': 3.1014.0 - '@cloudflare/unenv-preset': 2.7.7(unenv@2.0.0-rc.21)(workerd@1.20260317.1) - '@cloudflare/workers-types': 4.20260317.1 + '@aws-sdk/credential-providers': 3.1024.0 + '@cloudflare/unenv-preset': 2.7.7(unenv@2.0.0-rc.21)(workerd@1.20260401.1) + '@cloudflare/workers-types': 4.20260405.1 '@iarna/toml': 2.2.5 '@octokit/rest': 21.1.1 '@smithy/node-config-provider': 4.3.12 '@smithy/types': 4.13.1 aws4fetch: 1.0.20 - drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260317.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) + drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) env-paths: 3.0.0 esbuild: 0.25.12 execa: 9.6.1 fast-json-patch: 3.1.1 - fast-xml-parser: 5.5.9 + fast-xml-parser: 5.5.10 find-process: 2.1.1 glob: 10.5.0 jszip: 3.10.1 @@ -11731,11 +11723,11 @@ snapshots: proper-lockfile: 4.1.2 signal-exit: 4.1.0 unenv: 2.0.0-rc.21 - wrangler: 4.76.0(@cloudflare/workers-types@4.20260317.1) + wrangler: 4.80.0(@cloudflare/workers-types@4.20260405.1) ws: 8.20.0 yaml: 2.8.3 optionalDependencies: - '@cloudflare/vite-plugin': 1.30.0(vite@8.0.2)(workerd@1.20260317.1)(wrangler@4.76.0(@cloudflare/workers-types@4.20260317.1)) + '@cloudflare/vite-plugin': 1.31.0(vite@8.0.2)(workerd@1.20260401.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)) '@libsql/client': 0.17.2 vite: 8.0.2(@types/node@25.5.0)(@vitejs/devtools@0.1.8)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: @@ -11868,15 +11860,15 @@ snapshots: before-after-hook@4.0.0: {} - better-auth@1.5.6(49384272fc1f6bfc35ef9ee3d81a244f): + better-auth@1.5.6(cda3b31c0637fd6775df146cf0d5df72): dependencies: - '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) - '@better-auth/drizzle-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260317.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))) - '@better-auth/kysely-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.14) - '@better-auth/memory-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1) - '@better-auth/mongo-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(mongodb@7.1.0(@aws-sdk/credential-providers@3.1014.0)(socks@2.8.7)) - '@better-auth/prisma-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) - '@better-auth/telemetry': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0)) + '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) + '@better-auth/drizzle-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))) + '@better-auth/kysely-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.14) + '@better-auth/memory-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1) + '@better-auth/mongo-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(mongodb@7.1.0(@aws-sdk/credential-providers@3.1024.0)(socks@2.8.7)) + '@better-auth/prisma-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) + '@better-auth/telemetry': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0)) '@better-auth/utils': 0.3.1 '@better-fetch/fetch': 1.1.21 '@noble/ciphers': 2.1.1 @@ -11889,10 +11881,10 @@ snapshots: zod: 4.3.6 optionalDependencies: '@prisma/client': 7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2) - '@tanstack/react-start': 1.167.5(crossws@0.4.1(srvx@0.11.13))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) + '@tanstack/react-start': 1.167.5(crossws@0.4.1(srvx@0.11.15))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) drizzle-kit: 0.31.10 - drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260317.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) - mongodb: 7.1.0(@aws-sdk/credential-providers@3.1014.0)(socks@2.8.7) + drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) + mongodb: 7.1.0(@aws-sdk/credential-providers@3.1024.0)(socks@2.8.7) mysql2: 3.15.3 prisma: 7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2) react: 19.2.4 @@ -11927,7 +11919,7 @@ snapshots: bowser@2.14.1: {} - brace-expansion@2.0.2: + brace-expansion@2.0.3: dependencies: balanced-match: 1.0.2 @@ -11960,7 +11952,7 @@ snapshots: dependencies: chokidar: 4.0.3 confbox: 0.2.4 - defu: 6.1.4 + defu: 6.1.6 dotenv: 16.6.1 exsolve: 1.0.8 giget: 2.0.0 @@ -12037,7 +12029,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.24.5 + undici: 7.18.2 whatwg-mimetype: 4.0.0 chevrotain@10.5.0: @@ -12255,9 +12247,9 @@ snapshots: dependencies: uncrypto: 0.1.3 - crossws@0.4.1(srvx@0.11.13): + crossws@0.4.1(srvx@0.11.15): optionalDependencies: - srvx: 0.11.13 + srvx: 0.11.15 optional: true css-select@5.2.2: @@ -12353,6 +12345,8 @@ snapshots: defu@6.1.4: {} + defu@6.1.6: {} + degenerator@5.0.1: dependencies: ast-types: 0.13.4 @@ -12424,9 +12418,9 @@ snapshots: esbuild: 0.25.12 tsx: 4.21.0 - drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260317.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)): + drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)): optionalDependencies: - '@cloudflare/workers-types': 4.20260317.1 + '@cloudflare/workers-types': 4.20260405.1 '@electric-sql/pglite': 0.3.15 '@libsql/client': 0.17.2 '@opentelemetry/api': 1.9.0 @@ -12705,18 +12699,18 @@ snapshots: fast-xml-builder@1.1.4: dependencies: - path-expression-matcher: 1.2.0 + path-expression-matcher: 1.2.1 - fast-xml-parser@5.5.8: + fast-xml-parser@5.5.10: dependencies: fast-xml-builder: 1.1.4 - path-expression-matcher: 1.2.0 + path-expression-matcher: 1.2.1 strnum: 2.2.2 - fast-xml-parser@5.5.9: + fast-xml-parser@5.5.8: dependencies: fast-xml-builder: 1.1.4 - path-expression-matcher: 1.2.0 + path-expression-matcher: 1.2.1 strnum: 2.2.2 fd-package-json@2.0.0: @@ -12899,12 +12893,12 @@ snapshots: ufo: 1.6.3 uncrypto: 0.1.3 - h3@2.0.1-rc.16(crossws@0.4.1(srvx@0.11.13)): + h3@2.0.1-rc.16(crossws@0.4.1(srvx@0.11.15)): dependencies: rou3: 0.8.1 - srvx: 0.11.13 + srvx: 0.11.15 optionalDependencies: - crossws: 0.4.1(srvx@0.11.13) + crossws: 0.4.1(srvx@0.11.15) handlebars@4.7.8: dependencies: @@ -13343,12 +13337,12 @@ snapshots: - bufferutil - utf-8-validate - miniflare@4.20260317.1: + miniflare@4.20260401.0: dependencies: '@cspotcode/source-map-support': 0.8.1 sharp: 0.34.5 - undici: 7.24.4 - workerd: 1.20260317.1 + undici: 7.18.2 + workerd: 1.20260401.1 ws: 8.18.0 youch: 4.1.0-beta.10 transitivePeerDependencies: @@ -13361,7 +13355,7 @@ snapshots: minimatch@9.0.9: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.0.3 minimist@1.2.8: {} @@ -13382,13 +13376,13 @@ snapshots: whatwg-url: 14.2.0 optional: true - mongodb@7.1.0(@aws-sdk/credential-providers@3.1014.0)(socks@2.8.7): + mongodb@7.1.0(@aws-sdk/credential-providers@3.1024.0)(socks@2.8.7): dependencies: '@mongodb-js/saslprep': 1.4.6 bson: 7.2.0 mongodb-connection-string-url: 7.0.1 optionalDependencies: - '@aws-sdk/credential-providers': 3.1014.0 + '@aws-sdk/credential-providers': 3.1024.0 socks: 2.8.7 optional: true @@ -13428,7 +13422,7 @@ snapshots: neverthrow@8.2.0: optionalDependencies: - '@rollup/rollup-linux-x64-gnu': 4.60.0 + '@rollup/rollup-linux-x64-gnu': 4.60.1 new-github-release-url@2.0.0: dependencies: @@ -13646,7 +13640,7 @@ snapshots: dependencies: entities: 6.0.1 - path-expression-matcher@1.2.0: {} + path-expression-matcher@1.2.1: {} path-key@3.1.1: {} @@ -14058,7 +14052,7 @@ snapshots: proxy-agent: 6.5.0 semver: 7.7.3 tinyglobby: 0.2.15 - undici: 6.23.0 + undici: 7.18.2 url-join: 5.0.0 wildcard-match: 5.1.4 yargs-parser: 21.1.1 @@ -14332,7 +14326,7 @@ snapshots: srvx@0.11.12: {} - srvx@0.11.13: {} + srvx@0.11.15: {} std-env@3.10.0: optional: true @@ -14516,17 +14510,11 @@ snapshots: undici-types@7.18.2: {} - undici@6.23.0: {} - undici@7.18.2: {} - undici@7.24.4: {} - - undici@7.24.5: {} - unenv@2.0.0-rc.21: dependencies: - defu: 6.1.4 + defu: 6.1.6 exsolve: 1.0.8 ohash: 2.0.11 pathe: 2.0.3 @@ -14725,26 +14713,26 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20260310.1 '@cloudflare/workerd-windows-64': 1.20260310.1 - workerd@1.20260317.1: + workerd@1.20260401.1: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20260317.1 - '@cloudflare/workerd-darwin-arm64': 1.20260317.1 - '@cloudflare/workerd-linux-64': 1.20260317.1 - '@cloudflare/workerd-linux-arm64': 1.20260317.1 - '@cloudflare/workerd-windows-64': 1.20260317.1 + '@cloudflare/workerd-darwin-64': 1.20260401.1 + '@cloudflare/workerd-darwin-arm64': 1.20260401.1 + '@cloudflare/workerd-linux-64': 1.20260401.1 + '@cloudflare/workerd-linux-arm64': 1.20260401.1 + '@cloudflare/workerd-windows-64': 1.20260401.1 - wrangler@4.76.0(@cloudflare/workers-types@4.20260317.1): + wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 - '@cloudflare/unenv-preset': 2.16.0(unenv@2.0.0-rc.24)(workerd@1.20260317.1) + '@cloudflare/unenv-preset': 2.16.0(unenv@2.0.0-rc.24)(workerd@1.20260401.1) blake3-wasm: 2.1.5 esbuild: 0.27.3 - miniflare: 4.20260317.1 + miniflare: 4.20260401.0 path-to-regexp: 6.3.0 unenv: 2.0.0-rc.24 - workerd: 1.20260317.1 + workerd: 1.20260401.1 optionalDependencies: - '@cloudflare/workers-types': 4.20260317.1 + '@cloudflare/workers-types': 4.20260405.1 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5ba62b2..7c828dc 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,3 +2,5 @@ onlyBuiltDependencies: - esbuild - sharp - workerd +overrides: + undici: 7.18.2 From 492745874267cc270c6dc318c4ab3f5392955b8b Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Sun, 5 Apr 2026 15:34:39 +0700 Subject: [PATCH 07/20] refactor(search): add search params schema file (#85) --- src/modules/auth/{auth.schema.ts => auth.search.ts} | 1 + src/routes/auth/layout.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) rename src/modules/auth/{auth.schema.ts => auth.search.ts} (93%) diff --git a/src/modules/auth/auth.schema.ts b/src/modules/auth/auth.search.ts similarity index 93% rename from src/modules/auth/auth.schema.ts rename to src/modules/auth/auth.search.ts index 9c46126..b21a9ad 100644 --- a/src/modules/auth/auth.schema.ts +++ b/src/modules/auth/auth.search.ts @@ -1,5 +1,6 @@ import * as z from 'zod/v4'; +/** Search params for `/auth`. */ export const authSearchParamsSchema = z.object({ /** * Path of the protected page the user was trying to access before being redirected to auth. diff --git a/src/routes/auth/layout.tsx b/src/routes/auth/layout.tsx index 5430a60..7589491 100644 --- a/src/routes/auth/layout.tsx +++ b/src/routes/auth/layout.tsx @@ -1,7 +1,7 @@ import { createFileRoute, Outlet } from '@tanstack/react-router'; import { zodValidator } from '@tanstack/zod-adapter'; -import { authSearchParamsSchema } from '~/modules/auth/auth.schema'; +import { authSearchParamsSchema } from '~/modules/auth/auth.search'; import { authGuestGuard } from '~/modules/auth/auth.utils'; export const Route = createFileRoute('/auth')({ From 960dd18ab9d9a1ada41e421b499ac792e26ba996 Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Sun, 5 Apr 2026 15:59:45 +0700 Subject: [PATCH 08/20] chore(bettter-auth): update deps lock file (#87) --- pnpm-lock.yaml | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 790ce28..9f8d9c1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5814,6 +5814,10 @@ packages: resolution: {integrity: sha512-SU3lgh0rPvq7upc6vvdVrCsSMUG1h3ChvHVOY7wJ2fw4C9QEB7X3d5eyYEyULUX7UQtxZJtZXGuT6U2US72UYA==} engines: {node: '>=20.0.0'} + kysely@0.28.15: + resolution: {integrity: sha512-r2clcf7HLWvDXaVUEvQymXJY4i3bSOIV3xsL/Upy3ZfSv5HeKsk9tsqbBptLvth5qHEIhxeHTA2jNLyQABkLBA==} + engines: {node: '>=20.0.0'} + launch-editor@2.13.2: resolution: {integrity: sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg==} @@ -7977,6 +7981,21 @@ snapshots: optionalDependencies: '@cloudflare/workers-types': 4.20260405.1 + '@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0)': + dependencies: + '@better-auth/utils': 0.3.1 + '@better-fetch/fetch': 1.1.21 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.40.0 + '@standard-schema/spec': 1.1.0 + better-call: 1.3.2(zod@4.3.6) + jose: 6.2.2 + kysely: 0.28.15 + nanostores: 1.2.0 + zod: 4.3.6 + optionalDependencies: + '@cloudflare/workers-types': 4.20260405.1 + '@better-auth/drizzle-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)))': dependencies: '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) @@ -7984,12 +8003,12 @@ snapshots: optionalDependencies: drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) - '@better-auth/kysely-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.14)': + '@better-auth/kysely-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.15)': dependencies: '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) '@better-auth/utils': 0.3.1 optionalDependencies: - kysely: 0.28.14 + kysely: 0.28.15 '@better-auth/memory-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)': dependencies: @@ -11862,9 +11881,9 @@ snapshots: better-auth@1.5.6(cda3b31c0637fd6775df146cf0d5df72): dependencies: - '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) + '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0) '@better-auth/drizzle-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))) - '@better-auth/kysely-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.14) + '@better-auth/kysely-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.15) '@better-auth/memory-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1) '@better-auth/mongo-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(mongodb@7.1.0(@aws-sdk/credential-providers@3.1024.0)(socks@2.8.7)) '@better-auth/prisma-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) @@ -11874,9 +11893,9 @@ snapshots: '@noble/ciphers': 2.1.1 '@noble/hashes': 2.0.1 better-call: 1.3.2(zod@4.3.6) - defu: 6.1.4 + defu: 6.1.6 jose: 6.2.2 - kysely: 0.28.14 + kysely: 0.28.15 nanostores: 1.2.0 zod: 4.3.6 optionalDependencies: @@ -13126,6 +13145,8 @@ snapshots: kysely@0.28.14: {} + kysely@0.28.15: {} + launch-editor@2.13.2: dependencies: picocolors: 1.1.1 From 6ad248031e9fa9359a6078311cc196f1d32c6e21 Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Sun, 5 Apr 2026 16:23:08 +0700 Subject: [PATCH 09/20] fix(favicon): image size is too small (#88) --- public/apple-touch-icon.png | Bin 10743 -> 8177 bytes public/favicon-96x96.png | Bin 5314 -> 3139 bytes public/favicon.ico | Bin 15086 -> 15086 bytes public/favicon.svg | 4 ++-- public/web-app-manifest-192x192.png | Bin 11473 -> 8789 bytes public/web-app-manifest-512x512.png | Bin 30483 -> 26612 bytes 6 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png index 82f342818e26ae4c4ff928c1080f1dac043da8e1..86af1e35729f6aee33ffc281fd1a9e518bab9618 100644 GIT binary patch literal 8177 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 XTFc?m=vq^700000NkvXXu0mjf*uk@q literal 10743 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 NWd(KlU$0HR{y(e8I~f1~ diff --git a/public/favicon-96x96.png b/public/favicon-96x96.png index e70ee8662e53aa6db6d9c9d4789662a0ee5f678c..ac40fffbcfb788bac7ac6fb4f2def10784712461 100644 GIT binary patch delta 3135 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 Z;%_pvlQ2t1Q*HnN002ovPDHLkV1nRP-k<;g literal 5314 zcmV;z6g}&SP)}`Y(m`oT;qRjZ< zgQS}o#*$3Wq8n)~rt~Bd8QlqEiIRw2p=_n7n&)@b`Pcowb?mT^?%P*grnwq*RtT|`S zoH;*;a_=a&iSlcG@gaaOeEJ(chOaBb=ljF=zY~LSaB;v;*Dwi~ABs;1_*H1UD~!7^ z;7Ro1>e?m zO+^xZ7%}=~#Oe|;>*9RhK*oZz%er;z{w0L{ZNMG@-(KYiSe&nnnEkWZm043NC1A>M zipA!U5OQ?DqJVF&ZV?cxVJPiS7peZ7BqkU{0fJb0Y7|ZQiscQr8fMydDupF)}hV^zGPhkmfsb_kb7`jzs3X@ zI-&IEF{dpLn8T1L+hkPuSQ}C(tLi=?`zeND`t;LJXTTRBZOCX@scG=Qr)nSkv{+Y^Ta8@5hZ-?uMUTnK^wjwPqqsme*Llx zr8Yb|P=`aypbd`>)Zx&TfDiEKfRB6?V7|lkf>8sv(Z)GZUluZcF1AsharGu(VJJU0 zIF1OIzCQZsqqKJI+Ud56WKaYc`rdo*Rd+nv77rsB81YGb=`o^+DV{p!Kr K^|Ni^wlTSWLF|=BFzv%?N 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 NG4_ZHu1ttQ?0-7W2Fd^c literal 15086 zcmd^`Nr)Fo7RFP$VZgN%#jUGLY{WSTwuqk88E`wepyyju_pPx8NDgw5bB!->@S|!k9{+#eN5e z-%#bsGIbU=}hPkJMacj(43+!!#wPGKj@qPRDZD>=seQjcafr~h3 zFB)GsbGCBE7H6dLgOe}yDuI{w3Hc}z+10lF^x<14;txjSH+Y6es12P4TPxhicdSRK;P8aIBI#{`hK+>S8GNt5>hwn>TON zY}CZm+L9+FP5kjmal@8ayHtu`d-39h+p=YgTfKU9aW++g6CG8#Qru$q6ozeHk7~$5gUF)7ceOl*|?2B_Z?f=yLCj&PaiL-a_ zUI%yf5c=rRqn+0vPSZ61L&aPF6DLl%apT4X{)}Pj)T!>$rArplSnoQYF}`WN>Ij@Y zd)7^vGNs_p7#1yBDp5 z-@m`pc>rfg(|pGKxu3L^=g*(JGiT1Y?c2AzS+iypd!Ko?W#-J8?#h)bZNr9pn!ru` z!7&DDyLQ1?^Uu0<>)fPClPY=JF)Urmt7<#3oW;$0az>>J?@pY9^tCzvSFBjkiu?HS z~X3({A$Q$pgkPapJ_#2XD*A`d8I0hc^7X;NzTd+qG+#8#QWF zX$;&4u3x_%!yDVF`Al5{Re=~w7d&xZzkcmDZ{9rMS~z#^TveJ%JGt$ARs!>muK22W z_wL{wEM) zZgYMXN%IPR$BrFyW5$dLV_-eH$Y7qIiJ#i1A>3uJ`wkdI8795`-!PBQ~}8!%|G1v4X#m$t$8O`-8dVA zMF3(E6R~+BSgHwkegiEeF~)Fyio1YXtGcr_KELHFtur#3(=diOuJXw@*Kp@I=;9^E z&MiJFkzdhdyy6*SdG57h`|+t;Lt)W~U86iEob`RR^!-A7I<94rgIxG>=Gc90=O*V+ zt89MOLu1LE^!!HLGmYu z?yKCJ;86MZGoKj5AF}Knx-ZM_qJNiV7t!DRru%6(t{kBMZ|P_Fex5F(&HUY^?dMhV zta<0}w5Iv;M_;=9ot9tI?|u2RFaPkRc3*Kewh&?vYo9N@o=#GHALr!HzSO@^cz~p3 ze!iNt<7oTxS6>R@+~jO02Rc>fc_w9#@j9Q2;J@Z7IC%TdV7QOq%l#SMByGoU zW9r^UP8P!JUSGlkA-McrR-0P)6g?}dUF+mKHNG6jIf=qHD>YP5d2hrwY2|Ne&|?CuHyPm z?Ip#C{oA&y{8PCMrx2cYio0^(zklEL_xCqmC&Wm_Rvc-I(Hg2RrTO;E@AyZK97%PT zY;Z7ZK7bEkJ15jFz7#BP+`W4@>brq-D!^gij0kiH#^1b+}MC%dNH;aFSK4RuyBmxkrv1>9%g& zDp*OA+s0NdY!cP&JgLv>$B!So88c>-IILW`(%ram!@>sCZCvHDAdOdCZC_l!eEG8D zo3+NjZ(nf>i=joEoWw?ytLThuseX&4e*F0HBLAjMo8s;PZ5z|p1+;TwxvD?bjD_z} z%)!Ei3*+umJDyXUOF+vBy!NX4Q<`sL^XAP9e-DxBmo2`gY%XD98|^k6Zr{Eg{w79o zVoi)x>=>7t6MWlnh-0Z;dxUFo>QFQ@QYA-iV8)t>@KLpJJlv*BmNG-p|3oGjMq4sTyaFEfn!6U7o+i z!ORQK{Na7fYuQd;KMHO4;wUU{Vd zon>P#`d<|K{m%px+5cBsc`o{#1m<#kGX9+}2;V0+d${9y}QS#_Yj^2c@n!7i}94Fn^CZ zXU?4P9I<8%KWY9Z7EhgZiqGZ^8#V-A{wDJ9;lqV9T)}E>=}7T^`SPWkJ$rWe8_L2t zuaFZTiTGF>eb=sC3(us&p_L0CiRy7&`t9?pe6h>NS6`@(wlORp`C2T#z7+dcc*W5i esqL{b|8O07zd>I=x(4ClOXusie+VZNzW)We5#5LY diff --git a/public/favicon.svg b/public/favicon.svg index 03dc6a2..37f9068 100644 --- a/public/favicon.svg +++ b/public/favicon.svg @@ -1,4 +1,4 @@ - \ No newline at end of file diff --git a/public/web-app-manifest-192x192.png b/public/web-app-manifest-192x192.png index b5e66c6831511dadcc8a2fdc515749097e21f9f9..006e69409e4eebaa84bd1f1dd2ffd4450e33a7c3 100644 GIT binary patch literal 8789 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 literal 30483 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

6NX%5xOVaE>| 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 W;Z1L;jR0p4L8gY524#A Date: Sat, 11 Apr 2026 17:19:22 +0700 Subject: [PATCH 10/20] chore(lint): use oxlint type aware (#89) * chore(lint): use oxlint type aware * fix(lint): some code cause lint error * revert(lint): previous code * chore(oxlint): manually setup rules * chore(oxlint): remove unused disable rule comment --- .oxlintrc.jsonc | 319 +++++++++--- @types/react.d.ts | 8 + drizzle.config.ts | 12 +- lint-staged.config.js | 15 +- package.json | 6 +- pnpm-lock.yaml | 476 ++++++++++-------- src/lib/auth/server.ts | 10 +- src/lib/auth/types.ts | 8 +- src/lib/env/drizzle.ts | 11 + .../form/components/form-checkbox-single.tsx | 2 +- src/lib/form/components/form-reset.tsx | 2 +- src/lib/form/components/form-root.tsx | 4 +- src/lib/form/form.utils.ts | 2 +- src/routes/api/auth.$.ts | 4 +- src/routes/app/index.tsx | 2 +- src/routes/auth/layout.tsx | 2 +- src/server.ts | 4 +- src/start.ts | 4 +- src/ui/components/core/carousel.tsx | 39 +- src/ui/components/core/chart.tsx | 12 +- src/ui/components/core/field.tsx | 8 +- src/ui/components/core/input-group.tsx | 4 +- src/ui/components/core/input-otp.tsx | 2 +- src/ui/components/core/sidebar.tsx | 18 +- src/ui/components/core/sonner.tsx | 3 +- src/ui/components/core/toggle-group.tsx | 9 +- src/ui/hooks/use-media-query.ts | 10 +- src/ui/styles/theme.tsx | 2 + tsconfig.json | 3 +- 29 files changed, 635 insertions(+), 366 deletions(-) create mode 100644 @types/react.d.ts create mode 100644 src/lib/env/drizzle.ts diff --git a/.oxlintrc.jsonc b/.oxlintrc.jsonc index 83abc80..0a96e27 100644 --- a/.oxlintrc.jsonc +++ b/.oxlintrc.jsonc @@ -12,82 +12,275 @@ "browser": true, "node": true, }, - "categories": { - "correctness": "error", - "suspicious": "error", + "options": { + "typeAware": true, + "typeCheck": true, }, "plugins": [ - "oxc", "eslint", - "unicorn", - "typescript", + "import", + "jsx-a11y", + "oxc", "promise", "react", - "jsx-a11y", - "react-perf", - "import", + "typescript", + "unicorn", ], "rules": { - // Correctness - "react/no-children-prop": ["off"], + // Eslint + "array-callback-return": "error", + "constructor-super": "error", + "for-direction": "error", + "func-names": ["warn", "as-needed", { "generators": "as-needed" }], + "func-style": ["warn", "declaration"], + "max-params": ["warn", { "max": 3 }], + "no-async-promise-executor": "error", + "no-caller": "error", + "no-class-assign": "error", + "no-compare-neg-zero": "error", + "no-cond-assign": "error", + "no-console": ["warn", { "allow": ["error", "error", "info"] }], + "no-const-assign": "error", + "no-constant-binary-expression": "error", + "no-constant-condition": "error", + "no-constructor-return": "warn", + "no-control-regex": "error", + "no-debugger": "error", + "no-delete-var": "error", + "no-dupe-class-members": "error", + "no-dupe-else-if": "error", + "no-dupe-keys": "error", + "no-duplicate-case": "error", + "no-duplicate-imports": "warn", + "no-empty-character-class": "error", + "no-empty-pattern": "error", + "no-empty-static-block": "error", + "no-eval": "error", + "no-ex-assign": "error", + "no-extra-boolean-cast": "error", + "no-func-assign": "error", + "no-global-assign": "error", + "no-import-assign": "error", + "no-invalid-regexp": "error", + "no-irregular-whitespace": "error", + "no-iterator": "error", + "no-loss-of-precision": "error", + "no-misleading-character-class": "error", + "no-new": "warn", + "no-new-native-nonconstructor": "error", + "no-new-wrappers": "warn", + "no-nonoctal-decimal-escape": "error", + "no-obj-calls": "error", + "no-self-assign": "error", + "no-setter-return": "error", + "no-shadow-restricted-names": "error", + "no-sparse-arrays": "error", + "no-this-before-super": "error", + "no-unassigned-vars": "error", + "no-unexpected-multiline": "error", + "no-unsafe-finally": "error", + "no-unsafe-negation": "error", + "no-unsafe-optional-chaining": "error", + "no-unused-expressions": "error", + "no-unused-labels": "error", + "no-unused-private-class-members": "error", + "no-unused-vars": "error", + "no-useless-backreference": "error", + "no-useless-catch": "error", + "no-useless-constructor": "warn", + "no-useless-escape": "error", + "no-useless-rename": "error", + "no-var": "warn", + "no-with": "error", + "prefer-const": "warn", + "prefer-object-has-own": "warn", + "radix": "warn", + "prefer-numeric-literals": "warn", + "require-yield": "error", + "use-isnan": "error", + "valid-typeof": "error", + "yoda": "warn", - // Perf - "no-await-in-loop": "error", - "no-useless-call": "error", - "oxc/no-accumulating-spread": "error", - "oxc/no-map-spread": "error", - "unicorn/prefer-array-find": "error", - "unicorn/prefer-array-flat-map": "error", - "unicorn/prefer-set-has": "error", - - // Restriction - "default-case": ["error", { "commentPattern": "^skip\\sdefault" }], - "no-console": ["warn", { "allow": ["error", "warn", "info"] }], - "no-empty": "error", - "no-param-reassign": "error", - "no-restricted-globals": "error", - "typescript/no-import-type-side-effects": "error", - "typescript/no-explicit-any": "error", - "typescript/no-non-null-asserted-nullish-coalescing": "error", - "typescript/no-non-null-assertion": "error", - "typescript/promise-function-async": "error", - "typescript/use-unknown-in-catch-callback-variable": "error", - "unicorn/prefer-node-protocol": "error", - "react/no-unknown-property": "error", - "react/button-has-type": "error", + // Import "import/no-cycle": ["error", { "maxDepth": 3 }], + "import/no-empty-named-blocks": "warn", + "import/no-named-as-default": "warn", + "import/no-named-as-default-member": "warn", + "import/no-self-import": "error", + "import/unambiguous": "warn", - // Suspicious - "eslint/no-unneeded-ternary": "off", - "eslint/no-shadow": "off", - "react/react-in-jsx-scope": "off", - "import/no-unassigned-import": "off", + // JSX Accessibility + "jsx-a11y/alt-text": "error", + "jsx-a11y/anchor-has-content": "error", + "jsx-a11y/anchor-is-valid": "error", + "jsx-a11y/aria-activedescendant-has-tabindex": "error", + "jsx-a11y/aria-props": "error", + "jsx-a11y/aria-proptypes": "error", + "jsx-a11y/aria-role": "error", + "jsx-a11y/aria-unsupported-elements": "error", + "jsx-a11y/autocomplete-valid": "error", + "jsx-a11y/heading-has-content": "error", + "jsx-a11y/html-has-lang": "error", + "jsx-a11y/iframe-has-title": "error", + "jsx-a11y/img-redundant-alt": "error", + "jsx-a11y/label-has-associated-control": "error", + "jsx-a11y/media-has-caption": "error", + "jsx-a11y/mouse-events-have-key-events": "error", + "jsx-a11y/no-access-key": "warn", + "jsx-a11y/no-aria-hidden-on-focusable": "error", + "jsx-a11y/no-autofocus": "warn", + "jsx-a11y/no-distracting-elements": "error", + "jsx-a11y/no-redundant-roles": "error", + "jsx-a11y/no-static-element-interactions": "error", + "jsx-a11y/tabindex-no-positive": "warn", + "jsx-a11y/prefer-tag-over-role": "error", + "jsx-a11y/role-has-required-aria-props": "error", + "jsx-a11y/role-supports-aria-props": "error", + "jsx-a11y/scope": "error", - // Pedantic - "eqeqeq": ["error", "smart"], - "radix": "error", - "require-await": "error", - "typescript/no-unsafe-argument": "error", - "typescript/return-await": "error", - "react/jsx-no-target-blank": "error", - "react/jsx-no-useless-fragment": "error", - "react/rules-of-hooks": "error", + // Oxc + "oxc/approx-constant": "warn", + "oxc/bad-array-method-on-arguments": "error", + "oxc/bad-char-at-comparison": "error", + "oxc/bad-comparison-sequence": "error", + "oxc/bad-min-max-func": "error", + "oxc/bad-object-literal-comparison": "error", + "oxc/bad-replace-all-arg": "error", + "oxc/const-comparisons": "error", + "oxc/double-comparisons": "error", + "oxc/erasing-op": "error", + "oxc/misrefactored-assign-op": "warn", + "oxc/missing-throw": "error", + "oxc/no-accumulating-spread": "warn", + "oxc/no-barrel-file": ["warn", { "threshold": 10 }], + "oxc/number-arg-out-of-range": "error", + "oxc/only-used-in-recursion": "error", + "oxc/uninvoked-array-callback": "error", - // Style - "capitalized-comments": "off", - "default-case-last": "error", - "default-param-last": "error", - "func-names": ["error", "as-needed", { "generators": "as-needed" }], - "max-params": ["error", { "max": 3 }], - "no-duplicate-imports": "error", - "no-implicit-coercion": "error", - "no-template-curly-in-string": "error", - "yoda": "error", - "typescript/consistent-type-definitions": ["error", "interface"], - "unicorn/filename-case": ["error", { "case": "kebabCase" }], + // Promise + "promise/always-return": "warn", + "promise/catch-or-return": "error", + "promise/no-callback-in-promise": "error", + "promise/no-multiple-resolved": "error", + "promise/no-new-statics": "error", + "promise/no-promise-in-callback": "error", + "promise/param-names": "warn", + "promise/valid-params": "error", + + // React + "react/button-has-type": "error", + "react/checked-requires-onchange-or-readonly": "error", + "react/exhaustive-deps": "error", + "react/forbid-dom-props": ["error", { "forbid": [] }], + "react/forbid-elements": ["error", { "forbid": [] }], + "react/iframe-missing-sandbox": "error", + "react/jsx-boolean-value": ["warn", "never"], + "react/jsx-filename-extension": ["warn", { "extensions": ["jsx", "tsx"] }], + "react/jsx-fragments": ["warn", "element"], + "react/jsx-handler-names": "warn", + "react/jsx-key": "error", + "react/jsx-no-comment-textnodes": "warn", + "react/jsx-no-script-url": "error", + "react/jsx-no-target-blank": "warn", + "react/jsx-no-constructed-context-values": "error", + "react/jsx-no-duplicate-props": "error", + "react/jsx-no-undef": "error", + "react/jsx-no-useless-fragment": "warn", + "react/jsx-pascal-case": "warn", + "react/jsx-props-no-spread-multi": "error", + "react/no-children-prop": "error", + "react/no-danger-with-children": "error", + "react/no-direct-mutation-state": "error", + "react/no-find-dom-node": "error", + "react/no-string-refs": "error", + "react/no-this-in-sfc": "error", + "react/no-unsafe": "error", + "react/style-prop-object": "error", + "react/prefer-function-component": "warn", + "react/rules-of-hooks": "error", "react/self-closing-comp": "warn", - "import/no-duplicates": "error", - "eslint/func-style": ["error", "declaration"], + "react/void-dom-elements-no-children": "error", + + // TypeScript + "typescript/adjacent-overload-signatures": "warn", + "typescript/array-type": ["warn", { "default": "array" }], + "typescript/await-thenable": "error", + "typescript/consistent-type-imports": [ + "warn", + { + "prefer": "type-imports", + "fixStyle": "inline-type-imports", + "disallowTypeAnnotations": false, + }, + ], + "typescript/consistent-type-assertions": [ + "warn", + { "assertionStyle": "as" }, + ], + "typescript/consistent-type-definitions": ["warn", "interface"], + "typescript/no-array-delete": "error", + "typescript/no-base-to-string": "error", + "typescript/no-duplicate-enum-values": "error", + "typescript/no-duplicate-type-constituents": "error", + "typescript/no-extra-non-null-assertion": "error", + "typescript/no-floating-promises": "error", + "typescript/no-for-in-array": "error", + "typescript/no-implied-eval": "error", + "typescript/no-meaningless-void-operator": "error", + "typescript/no-misused-new": "error", + "typescript/no-confusing-non-null-assertion": "warn", + "typescript/no-explicit-any": "warn", + "typescript/no-misused-spread": "error", + "typescript/no-non-null-asserted-optional-chain": "error", + "typescript/no-redundant-type-constituents": "error", + "typescript/no-unnecessary-boolean-literal-compare": "warn", + "typescript/no-unnecessary-template-expression": "warn", + "typescript/no-unnecessary-type-assertion": "warn", + "typescript/no-unnecessary-type-constraint": "warn", + "typescript/no-this-alias": "error", + "typescript/no-unnecessary-condition": "error", + "typescript/no-unnecessary-parameter-property-assignment": "error", + "typescript/no-unsafe-declaration-merging": "error", + "typescript/no-unsafe-unary-minus": "error", + "typescript/no-useless-empty-export": "error", + "typescript/no-wrapper-object-types": "error", + "typescript/prefer-as-const": "error", + "typescript/prefer-function-type": "warn", + "typescript/prefer-namespace-keyword": "error", + "typescript/prefer-string-starts-ends-with": "warn", + "typescript/require-array-sort-compare": "error", + "typescript/restrict-template-expressions": "error", + "typescript/require-await": "warn", + "typescript/switch-exhaustiveness-check": "warn", + "typescript/triple-slash-reference": "error", + "typescript/unbound-method": "error", + + // Unicorn + "unicorn/error-message": "warn", + "unicorn/filename-case": ["warn", { "case": "kebabCase" }], + "unicorn/no-accessor-recursion": "error", + "unicorn/no-array-reverse": "warn", + "unicorn/no-array-sort": "warn", + "unicorn/no-await-in-promise-methods": "error", + "unicorn/no-instanceof-builtins": "warn", + "unicorn/no-empty-file": "error", + "unicorn/no-invalid-fetch-options": "error", + "unicorn/no-invalid-remove-event-listener": "error", + "unicorn/no-new-array": "error", + "unicorn/no-single-promise-in-promise-methods": "error", + "unicorn/no-thenable": "error", + "unicorn/no-unnecessary-await": "error", + "unicorn/no-useless-fallback-in-spread": "error", + "unicorn/no-useless-length-check": "error", + "unicorn/no-useless-promise-resolve-reject": "warn", + "unicorn/no-useless-spread": "error", + "unicorn/prefer-array-flat-map": "warn", + "unicorn/prefer-array-some": "warn", + "unicorn/prefer-node-protocol": "warn", + "unicorn/prefer-optional-catch-binding": "warn", + "unicorn/prefer-set-size": "error", + "unicorn/throw-new-error": "warn", + "unicorn/prefer-string-starts-ends-with": "error", }, "overrides": [ { diff --git a/@types/react.d.ts b/@types/react.d.ts new file mode 100644 index 0000000..453b977 --- /dev/null +++ b/@types/react.d.ts @@ -0,0 +1,8 @@ +import 'react'; + +declare module 'react' { + interface CSSProperties { + // Allow any CSS variable starting with '--' + [key: `--${string}`]: string | number; + } +} diff --git a/drizzle.config.ts b/drizzle.config.ts index f1103bd..6369fa0 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -3,6 +3,7 @@ import 'dotenv/config'; import { defineConfig } from 'drizzle-kit'; import { getLocalCloudflareD1Path } from './src/lib/database/utils'; +import { drizzleEnv } from './src/lib/env/drizzle'; const DBEnvironments = ['local', 'remote'] as const; type DBEnvironment = (typeof DBEnvironments)[number]; @@ -11,7 +12,6 @@ interface DBConfig { config: ReturnType; } -const DB_ENV = process.env.DB_ENV as DBEnvironment; const OUT_DIR = './src/lib/database/migrations'; const SCHEMA_DIR = './src/lib/database/schema'; @@ -59,14 +59,6 @@ const ENVIRONMENTS: Record = { }, }; -const activeConfig = ENVIRONMENTS[DB_ENV]; - -if (!activeConfig) { - throw new Error( - `Invalid DB_ENV value. Expected one of ${DBEnvironments.join(', ')}. Please set the DB_ENV environment variable accordingly.`, - ); -} - +const activeConfig = ENVIRONMENTS[drizzleEnv.DB_ENV]; console.info(`Running Drizzle config in ${activeConfig.name} mode`); - export default activeConfig.config; diff --git a/lint-staged.config.js b/lint-staged.config.js index 0cd3400..5149a14 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -7,21 +7,20 @@ const ALL_FILES = '*'; const TYPESCRIPT_FILES = `*.{${TYPESCRIPT_EXTENSIONS.join(',')}}`; const JAVASCRIPT_FILES = `*.{${JAVASCRIPT_EXTENSIONS.join(',')}}`; -// Format code with Oxfmt +/** + * Format code with Oxfmt + */ function buildOxfmtCommand(stagedFiles) { return `oxfmt --no-error-on-unmatched-pattern ${stagedFiles.join(' ')}`; } -// Check and fix code with Oxlint +/** + * Check and fix code with Oxlint + */ function buildOxlintCommand(stagedFiles) { return `oxlint ${stagedFiles.join(' ')}`; } -// Type check with TypeScript -function buildTypeCheckCommand() { - return 'tsc --noEmit'; -} - /** * Lint staged files * @description Run commands on staged files based on their types @@ -35,7 +34,7 @@ const lintStagedConfig = { return [buildOxlintCommand(stagedFiles)]; }, [TYPESCRIPT_FILES]: function (stagedFiles) { - return [buildTypeCheckCommand(), buildOxlintCommand(stagedFiles)]; + return [buildOxlintCommand(stagedFiles)]; }, }; diff --git a/package.json b/package.json index b280ef6..374e45c 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,6 @@ "format": "oxfmt", "format:check": "oxfmt --check", "lint": "oxlint", - "lint:ts": "tsc --noEmit", "lint:fix": "oxlint --fix", "storybook:dev": "storybook dev -p 6006", "storybook:build": "storybook build", @@ -115,8 +114,9 @@ "drizzle-kit": "^0.31.10", "husky": "^9.1.7", "lint-staged": "^16.4.0", - "oxfmt": "^0.42.0", - "oxlint": "^1.57.0", + "oxfmt": "^0.44.0", + "oxlint": "^1.59.0", + "oxlint-tsgolint": "^0.20.0", "release-it": "^19.2.4", "skills": "^1.4.5", "storybook": "^10.3.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9f8d9c1..249caab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: dependencies: '@better-auth/drizzle-adapter': specifier: ^1.5.6 - version: 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))) + version: 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.15)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))) '@devsantara/head': specifier: ^0.4.1 version: 0.4.1(@types/react@19.2.14)(react@19.2.4) @@ -55,7 +55,7 @@ importers: version: 1.166.9(@tanstack/react-router@1.168.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(zod@4.3.6) better-auth: specifier: ^1.5.6 - version: 1.5.6(cda3b31c0637fd6775df146cf0d5df72) + version: 1.5.6(31cbc98915db2d1b55eeab35e5a9d8b9) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -70,7 +70,7 @@ importers: version: 4.1.0 drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) + version: 0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.15)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) embla-carousel-react: specifier: ^8.6.0 version: 8.6.0(react@19.2.4) @@ -197,7 +197,7 @@ importers: version: 6.0.1(@rolldown/plugin-babel@0.2.2(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.11)(vite@8.0.2))(babel-plugin-react-compiler@1.0.0)(vite@8.0.2) alchemy: specifier: ^0.90.1 - version: 0.90.1(@cloudflare/vite-plugin@1.31.0(vite@8.0.2)(workerd@1.20260401.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)))(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(vite@8.0.2)(workerd@1.20260401.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)) + version: 0.90.1(@cloudflare/vite-plugin@1.31.0(vite@8.0.2)(workerd@1.20260401.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)))(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.15)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(vite@8.0.2)(workerd@1.20260401.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)) babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 @@ -217,11 +217,14 @@ importers: specifier: ^16.4.0 version: 16.4.0 oxfmt: - specifier: ^0.42.0 - version: 0.42.0 + specifier: ^0.44.0 + version: 0.44.0 oxlint: - specifier: ^1.57.0 - version: 1.57.0 + specifier: ^1.59.0 + version: 1.59.0(oxlint-tsgolint@0.20.0) + oxlint-tsgolint: + specifier: ^0.20.0 + version: 0.20.0 release-it: specifier: ^19.2.4 version: 19.2.4(@types/node@25.5.0) @@ -2040,246 +2043,276 @@ packages: '@oxc-project/types@0.122.0': resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} - '@oxfmt/binding-android-arm-eabi@0.42.0': - resolution: {integrity: sha512-dsqPTYsozeokRjlrt/b4E7Pj0z3eS3Eg74TWQuuKbjY4VttBmA88rB7d50Xrd+TZ986qdXCNeZRPEzZHAe+jow==} + '@oxfmt/binding-android-arm-eabi@0.44.0': + resolution: {integrity: sha512-5UvghMd9SA/yvKTWCAxMAPXS1d2i054UeOf4iFjZjfayTwCINcC3oaSXjtbZfCaEpxgJod7XiOjTtby5yEv/BQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.42.0': - resolution: {integrity: sha512-t+aAjHxcr5eOBphFHdg1ouQU9qmZZoRxnX7UOJSaTwSoKsb6TYezNKO0YbWytGXCECObRqNcUxPoPr0KaraAIg==} + '@oxfmt/binding-android-arm64@0.44.0': + resolution: {integrity: sha512-IVudM1BWfvrYO++Khtzr8q9n5Rxu7msUvoFMqzGJVdX7HfUXUDHwaH2zHZNB58svx2J56pmCUzophyaPFkcG/A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.42.0': - resolution: {integrity: sha512-ulpSEYMKg61C5bRMZinFHrKJYRoKGVbvMEXA5zM1puX3O9T6Q4XXDbft20yrDijpYWeuG59z3Nabt+npeTsM1A==} + '@oxfmt/binding-darwin-arm64@0.44.0': + resolution: {integrity: sha512-eWCLAIKAHfx88EqEP1Ga2yz7qVcqDU5lemn4xck+07bH182hDdprOHjbogyk0In1Djys3T0/pO2JepFnRJ41Mg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.42.0': - resolution: {integrity: sha512-ttxLKhQYPdFiM8I/Ri37cvqChE4Xa562nNOsZFcv1CKTVLeEozXjKuYClNvxkXmNlcF55nzM80P+CQkdFBu+uQ==} + '@oxfmt/binding-darwin-x64@0.44.0': + resolution: {integrity: sha512-eHTBznHLM49++dwz07MblQ2cOXyIgeedmE3Wgy4ptUESj38/qYZyRi1MPwC9olQJWssMeY6WI3UZ7YmU5ggvyQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.42.0': - resolution: {integrity: sha512-Og7QS3yI3tdIKYZ58SXik0rADxIk2jmd+/YvuHRyKULWpG4V2fR5V4hvKm624Mc0cQET35waPXiCQWvjQEjwYQ==} + '@oxfmt/binding-freebsd-x64@0.44.0': + resolution: {integrity: sha512-jLMmbj0u0Ft43QpkUVr/0v1ZfQCGWAvU+WznEHcN3wZC/q6ox7XeSJtk9P36CCpiDSUf3sGnzbIuG1KdEMEDJQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.42.0': - resolution: {integrity: sha512-jwLOw/3CW4H6Vxcry4/buQHk7zm9Ne2YsidzTL1kpiMe4qqrRCwev3dkyWe2YkFmP+iZCQ7zku4KwjcLRoh8ew==} + '@oxfmt/binding-linux-arm-gnueabihf@0.44.0': + resolution: {integrity: sha512-n+A/u/ByK1qV8FVGOwyaSpw5NPNl0qlZfgTBqHeGIqr8Qzq1tyWZ4lAaxPoe5mZqE3w88vn3+jZtMxriHPE7tg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.42.0': - resolution: {integrity: sha512-XwXu2vkMtiq2h7tfvN+WA/9/5/1IoGAVCFPiiQUvcAuG3efR97KNcRGM8BetmbYouFotQ2bDal3yyjUx6IPsTg==} + '@oxfmt/binding-linux-arm-musleabihf@0.44.0': + resolution: {integrity: sha512-5eax+FkxyCqAi3Rw0mrZFr7+KTt/XweFsbALR+B5ljWBLBl8nHe4ADrUnb1gLEfQCJLl+Ca5FIVD4xEt95AwIw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.42.0': - resolution: {integrity: sha512-ea7s/XUJoT7ENAtUQDudFe3nkSM3e3Qpz4nJFRdzO2wbgXEcjnchKLEsV3+t4ev3r8nWxIYr9NRjPWtnyIFJVA==} + '@oxfmt/binding-linux-arm64-gnu@0.44.0': + resolution: {integrity: sha512-58l8JaHxSGOmOMOG2CIrNsnkRJAj0YcHQCmvNACniOa/vd1iRHhlPajczegzS5jwMENlqgreyiTR9iNlke8qCw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.42.0': - resolution: {integrity: sha512-+JA0YMlSdDqmacygGi2REp57c3fN+tzARD8nwsukx9pkCHK+6DkbAA9ojS4lNKsiBjIW8WWa0pBrBWhdZEqfuw==} + '@oxfmt/binding-linux-arm64-musl@0.44.0': + resolution: {integrity: sha512-AlObQIXyVRZ96LbtVljtFq0JqH5B92NU+BQeDFrXWBUWlCKAM0wF5GLfIhCLT5kQ3Sl+U0YjRJ7Alqj5hGQaCg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.42.0': - resolution: {integrity: sha512-VfnET0j4Y5mdfCzh5gBt0NK28lgn5DKx+8WgSMLYYeSooHhohdbzwAStLki9pNuGy51y4I7IoW8bqwAaCMiJQg==} + '@oxfmt/binding-linux-ppc64-gnu@0.44.0': + resolution: {integrity: sha512-YcFE8/q/BbrCiIiM5piwbkA6GwJc5QqhMQp2yDrqQ2fuVkZ7CInb1aIijZ/k8EXc72qXMSwKpVlBv1w/MsGO/A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.42.0': - resolution: {integrity: sha512-gVlCbmBkB0fxBWbhBj9rcxezPydsQHf4MFKeHoTSPicOQ+8oGeTQgQ8EeesSybWeiFPVRx3bgdt4IJnH6nOjAA==} + '@oxfmt/binding-linux-riscv64-gnu@0.44.0': + resolution: {integrity: sha512-eOdzs6RqkRzuqNHUX5C8ISN5xfGh4xDww8OEd9YAmc3OWN8oAe5bmlIqQ+rrHLpv58/0BuU48bxkhnIGjA/ATQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.42.0': - resolution: {integrity: sha512-zN5OfstL0avgt/IgvRu0zjQzVh/EPkcLzs33E9LMAzpqlLWiPWeMDZyMGFlSRGOdDjuNmlZBCgj0pFnK5u32TQ==} + '@oxfmt/binding-linux-riscv64-musl@0.44.0': + resolution: {integrity: sha512-YBgNTxntD/QvlFUfgvh8bEdwOhXiquX8gaofZJAwYa/Xp1S1DQrFVZEeck7GFktr24DztsSp8N8WtWCBwxs0Hw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.42.0': - resolution: {integrity: sha512-9X6+H2L0qMc2sCAgO9HS03bkGLMKvOFjmEdchaFlany3vNZOjnVui//D8k/xZAtQv2vaCs1reD5KAgPoIU4msA==} + '@oxfmt/binding-linux-s390x-gnu@0.44.0': + resolution: {integrity: sha512-GLIh1R6WHWshl/i4QQDNgj0WtT25aRO4HNUWEoitxiywyRdhTFmFEYT2rXlcl9U6/26vhmOqG5cRlMLG3ocaIA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.42.0': - resolution: {integrity: sha512-BajxJ6KQvMMdpXGPWhBGyjb2Jvx4uec0w+wi6TJZ6Tv7+MzPwe0pO8g5h1U0jyFgoaF7mDl6yKPW3ykWcbUJRw==} + '@oxfmt/binding-linux-x64-gnu@0.44.0': + resolution: {integrity: sha512-gZOpgTlOsLcLfAF9qgpTr7FIIFSKnQN3hDf/0JvQ4CIwMY7h+eilNjxq/CorqvYcEOu+LRt1W4ZS7KccEHLOdA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.42.0': - resolution: {integrity: sha512-0wV284I6vc5f0AqAhgAbHU2935B4bVpncPoe5n/WzVZY/KnHgqxC8iSFGeSyLWEgstFboIcWkOPck7tqbdHkzA==} + '@oxfmt/binding-linux-x64-musl@0.44.0': + resolution: {integrity: sha512-1CyS9JTB+pCUFYFI6pkQGGZaT/AY5gnhHVrQQLhFba6idP9AzVYm1xbdWfywoldTYvjxQJV6x4SuduCIfP3W+A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.42.0': - resolution: {integrity: sha512-p4BG6HpGnhfgHk1rzZfyR6zcWkE7iLrWxyehHfXUy4Qa5j3e0roglFOdP/Nj5cJJ58MA3isQ5dlfkW2nNEpolw==} + '@oxfmt/binding-openharmony-arm64@0.44.0': + resolution: {integrity: sha512-bmEv70Ak6jLr1xotCbF5TxIKjsmQaiX+jFRtnGtfA03tJPf6VG3cKh96S21boAt3JZc+Vjx8PYcDuLj39vM2Pw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.42.0': - resolution: {integrity: sha512-mn//WV60A+IetORDxYieYGAoQso4KnVRRjORDewMcod4irlRe0OSC7YPhhwaexYNPQz/GCFk+v9iUcZ2W22yxQ==} + '@oxfmt/binding-win32-arm64-msvc@0.44.0': + resolution: {integrity: sha512-yWzB+oCpSnP/dmw85eFLAT5o35Ve5pkGS2uF/UCISpIwDqf1xa7OpmtomiqY/Vzg8VyvMbuf6vroF2khF/+1Vg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.42.0': - resolution: {integrity: sha512-3gWltUrvuz4LPJXWivoAxZ28Of2O4N7OGuM5/X3ubPXCEV8hmgECLZzjz7UYvSDUS3grfdccQwmjynm+51EFpw==} + '@oxfmt/binding-win32-ia32-msvc@0.44.0': + resolution: {integrity: sha512-TcWpo18xEIE3AmIG2kpr3kz5IEhQgnx0lazl2+8L+3eTopOAUevQcmlr4nhguImNWz0OMeOZrYZOhJNCf16nlQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.42.0': - resolution: {integrity: sha512-Wg4TMAfQRL9J9AZevJ/ZNy3uyyDztDYQtGr4P8UyyzIhLhFrdSmz1J/9JT+rv0fiCDLaFOBQnj3f3K3+a5PzDQ==} + '@oxfmt/binding-win32-x64-msvc@0.44.0': + resolution: {integrity: sha512-oj8aLkPJZppIM4CMQNsyir9ybM1Xw/CfGPTSsTnzpVGyljgfbdP0EVUlURiGM0BDrmw5psQ6ArmGCcUY/yABaQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.57.0': - resolution: {integrity: sha512-C7EiyfAJG4B70496eV543nKiq5cH0o/xIh/ufbjQz3SIvHhlDDsyn+mRFh+aW8KskTyUpyH2LGWL8p2oN6bl1A==} + '@oxlint-tsgolint/darwin-arm64@0.20.0': + resolution: {integrity: sha512-KKQcIHZHMxqpHUA1VXIbOG6chNCFkUWbQy6M+AFVtPKkA/3xAeJkJ3njoV66bfzwPHRcWQO+kcj5XqtbkjakoA==} + cpu: [arm64] + os: [darwin] + + '@oxlint-tsgolint/darwin-x64@0.20.0': + resolution: {integrity: sha512-7HeVMuclGfG+NLZi2ybY0T4fMI7/XxO/208rJk+zEIloKkVnlh11Wd241JMGwgNFXn+MLJbOqOfojDb2Dt4L1g==} + cpu: [x64] + os: [darwin] + + '@oxlint-tsgolint/linux-arm64@0.20.0': + resolution: {integrity: sha512-zxhUwz+WSxE6oWlZLK2z2ps9yC6ebmgoYmjAl0Oa48+GqkZ56NVgo+wb8DURNv6xrggzHStQxqQxe3mK51HZag==} + cpu: [arm64] + os: [linux] + + '@oxlint-tsgolint/linux-x64@0.20.0': + resolution: {integrity: sha512-/1l6FnahC9im8PK+Ekkx/V3yetO/PzZnJegE2FXcv/iXEhbeVxP/ouiTYcUQu9shT1FWJCSNti1VJHH+21Y1dg==} + cpu: [x64] + os: [linux] + + '@oxlint-tsgolint/win32-arm64@0.20.0': + resolution: {integrity: sha512-oPZ5Yz8sVdo7P/5q+i3IKeix31eFZ55JAPa1+RGPoe9PoaYVsdMvR6Jvib6YtrqoJnFPlg3fjEjlEPL8VBKYJA==} + cpu: [arm64] + os: [win32] + + '@oxlint-tsgolint/win32-x64@0.20.0': + resolution: {integrity: sha512-4stx8RHj3SP9vQyRF/yZbz5igtPvYMEUR8CUoha4BVNZihi39DpCR8qkU7lpjB5Ga1DRMo2pHaA4bdTOMaY4mw==} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.59.0': + resolution: {integrity: sha512-etYDw/UaEv936AQUd/CRMBVd+e+XuuU6wC+VzOv1STvsTyZenLChepLWqLtnyTTp4YMlM22ypzogDDwqYxv5cg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.57.0': - resolution: {integrity: sha512-9i80AresjZ/FZf5xK8tKFbhQnijD4s1eOZw6/FHUwD59HEZbVLRc2C88ADYJfLZrF5XofWDiRX/Ja9KefCLy7w==} + '@oxlint/binding-android-arm64@1.59.0': + resolution: {integrity: sha512-TgLc7XVLKH2a4h8j3vn1MDjfK33i9MY60f/bKhRGWyVzbk5LCZ4X01VZG7iHrMmi5vYbAp8//Ponigx03CLsdw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.57.0': - resolution: {integrity: sha512-0eUfhRz5L2yKa9I8k3qpyl37XK3oBS5BvrgdVIx599WZK63P8sMbg+0s4IuxmIiZuBK68Ek+Z+gcKgeYf0otsg==} + '@oxlint/binding-darwin-arm64@1.59.0': + resolution: {integrity: sha512-DXyFPf5ZKldMLloRHx/B9fsxsiTQomaw7cmEW3YIJko2HgCh+GUhp9gGYwHrqlLJPsEe3dYj9JebjX92D3j3AA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.57.0': - resolution: {integrity: sha512-UvrSuzBaYOue+QMAcuDITe0k/Vhj6KZGjfnI6x+NkxBTke/VoM7ZisaxgNY0LWuBkTnd1OmeQfEQdQ48fRjkQg==} + '@oxlint/binding-darwin-x64@1.59.0': + resolution: {integrity: sha512-LgvrsdgVLX1qWqIEmNsSmMXJhpAWdtUQ0M+oR0CySwi+9IHWyOGuIL8w8+u/kbZNMyZr4WUyYB5i0+D+AKgkLg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.57.0': - resolution: {integrity: sha512-wtQq0dCoiw4bUwlsNVDJJ3pxJA218fOezpgtLKrbQqUtQJcM9yP8z+I9fu14aHg0uyAxIY+99toL6uBa2r7nxA==} + '@oxlint/binding-freebsd-x64@1.59.0': + resolution: {integrity: sha512-bOJhqX/ny4hrFuTPlyk8foSRx/vLRpxJh0jOOKN2NWW6FScXHPAA5rQbrwdQPcgGB5V8Ua51RS03fke8ssBcug==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.57.0': - resolution: {integrity: sha512-qxFWl2BBBFcT4djKa+OtMdnLgoHEJXpqjyGwz8OhW35ImoCwR5qtAGqApNYce5260FQqoAHW8S8eZTjiX67Tsg==} + '@oxlint/binding-linux-arm-gnueabihf@1.59.0': + resolution: {integrity: sha512-vVUXxYMF9trXCsz4m9H6U0IjehosVHxBzVgJUxly1uz4W1PdDyicaBnpC0KRXsHYretLVe+uS9pJy8iM57Kujw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.57.0': - resolution: {integrity: sha512-SQoIsBU7J0bDW15/f0/RvxHfY3Y0+eB/caKBQtNFbuerTiA6JCYx9P1MrrFTwY2dTm/lMgTSgskvCEYk2AtG/Q==} + '@oxlint/binding-linux-arm-musleabihf@1.59.0': + resolution: {integrity: sha512-TULQW8YBPGRWg5yZpFPL54HLOnJ3/HiX6VenDPi6YfxB/jlItwSMFh3/hCeSNbh+DAMaE1Py0j5MOaivHkI/9Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.57.0': - resolution: {integrity: sha512-jqxYd1W6WMeozsCmqe9Rzbu3SRrGTyGDAipRlRggetyYbUksJqJKvUNTQtZR/KFoJPb+grnSm5SHhdWrywv3RQ==} + '@oxlint/binding-linux-arm64-gnu@1.59.0': + resolution: {integrity: sha512-Gt54Y4eqSgYJ90xipm24xeyaPV854706o/kiT8oZvUt3VDY7qqxdqyGqchMaujd87ib+/MXvnl9WkK8Cc1BExg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.57.0': - resolution: {integrity: sha512-i66WyEPVEvq9bxRUCJ/MP5EBfnTDN3nhwEdFZFTO5MmLLvzngfWEG3NSdXQzTT3vk5B9i6C2XSIYBh+aG6uqyg==} + '@oxlint/binding-linux-arm64-musl@1.59.0': + resolution: {integrity: sha512-3CtsKp7NFB3OfqQzbuAecrY7GIZeiv7AD+xutU4tefVQzlfmTI7/ygWLrvkzsDEjTlMq41rYHxgsn6Yh8tybmA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.57.0': - resolution: {integrity: sha512-oMZDCwz4NobclZU3pH+V1/upVlJZiZvne4jQP+zhJwt+lmio4XXr4qG47CehvrW1Lx2YZiIHuxM2D4YpkG3KVA==} + '@oxlint/binding-linux-ppc64-gnu@1.59.0': + resolution: {integrity: sha512-K0diOpT3ncDmOfl9I1HuvpEsAuTxkts0VYwIv/w6Xiy9CdwyPBVX88Ga9l8VlGgMrwBMnSY4xIvVlVY/fkQk7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.57.0': - resolution: {integrity: sha512-uoBnjJ3MMEBbfnWC1jSFr7/nSCkcQYa72NYoNtLl1imshDnWSolYCjzb8LVCwYCCfLJXD+0gBLD7fyC14c0+0g==} + '@oxlint/binding-linux-riscv64-gnu@1.59.0': + resolution: {integrity: sha512-xAU7+QDU6kTJJ7mJLOGgo7oOjtAtkKyFZ0Yjdb5cEo3DiCCPFLvyr08rWiQh6evZ7RiUTf+o65NY/bqttzJiQQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.57.0': - resolution: {integrity: sha512-BdrwD7haPZ8a9KrZhKJRSj6jwCor+Z8tHFZ3PT89Y3Jq5v3LfMfEePeAmD0LOTWpiTmzSzdmyw9ijneapiVHKQ==} + '@oxlint/binding-linux-riscv64-musl@1.59.0': + resolution: {integrity: sha512-KUmZmKlTTyauOnvUNVxK7G40sSSx0+w5l1UhaGsC6KPpOYHenx2oqJTnabmpLJicok7IC+3Y6fXAUOMyexaeJQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.57.0': - resolution: {integrity: sha512-BNs+7ZNsRstVg2tpNxAXfMX/Iv5oZh204dVyb8Z37+/gCh+yZqNTlg6YwCLIMPSk5wLWIGOaQjT0GUOahKYImw==} + '@oxlint/binding-linux-s390x-gnu@1.59.0': + resolution: {integrity: sha512-4usRxC8gS0PGdkHnRmwJt/4zrQNZyk6vL0trCxwZSsAKM+OxhB8nKiR+mhjdBbl8lbMh2gc3bZpNN/ik8c4c2A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.57.0': - resolution: {integrity: sha512-AghS18w+XcENcAX0+BQGLiqjpqpaxKJa4cWWP0OWNLacs27vHBxu7TYkv9LUSGe5w8lOJHeMxcYfZNOAPqw2bg==} + '@oxlint/binding-linux-x64-gnu@1.59.0': + resolution: {integrity: sha512-s/rNE2gDmbwAOOP493xk2X7M8LZfI1LJFSSW1+yanz3vuQCFPiHkx4GY+O1HuLUDtkzGlhtMrIcxxzyYLv308w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.57.0': - resolution: {integrity: sha512-E/FV3GB8phu/Rpkhz5T96hAiJlGzn91qX5yj5gU754P5cmVGXY1Jw/VSjDSlZBCY3VHjsVLdzgdkJaomEmcNOg==} + '@oxlint/binding-linux-x64-musl@1.59.0': + resolution: {integrity: sha512-+yYj1udJa2UvvIUmEm0IcKgc0UlPMgz0nsSTvkPL2y6n0uU5LgIHSwVu4AHhrve6j9BpVSoRksnz8c9QcvITJA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.57.0': - resolution: {integrity: sha512-xvZ2yZt0nUVfU14iuGv3V25jpr9pov5N0Wr28RXnHFxHCRxNDMtYPHV61gGLhN9IlXM96gI4pyYpLSJC5ClLCQ==} + '@oxlint/binding-openharmony-arm64@1.59.0': + resolution: {integrity: sha512-bUplUb48LYsB3hHlQXP2ZMOenpieWoOyppLAnnAhuPag3MGPnt+7caxE3w/Vl9wpQsTA3gzLntQi9rxWrs7Xqg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.57.0': - resolution: {integrity: sha512-Z4D8Pd0AyHBKeazhdIXeUUy5sIS3Mo0veOlzlDECg6PhRRKgEsBJCCV1n+keUZtQ04OP+i7+itS3kOykUyNhDg==} + '@oxlint/binding-win32-arm64-msvc@1.59.0': + resolution: {integrity: sha512-/HLsLuz42rWl7h7ePdmMTpHm2HIDmPtcEMYgm5BBEHiEiuNOrzMaUpd2z7UnNni5LGN9obJy2YoAYBLXQwazrA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.57.0': - resolution: {integrity: sha512-StOZ9nFMVKvevicbQfql6Pouu9pgbeQnu60Fvhz2S6yfMaii+wnueLnqQ5I1JPgNF0Syew4voBlAaHD13wH6tw==} + '@oxlint/binding-win32-ia32-msvc@1.59.0': + resolution: {integrity: sha512-rUPy+JnanpPwV/aJCPnxAD1fW50+XPI0VkWr7f0vEbqcdsS8NpB24Rw6RsS7SdpFv8Dw+8ugCwao5nCFbqOUSg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.57.0': - resolution: {integrity: sha512-6PuxhYgth8TuW0+ABPOIkGdBYw+qYGxgIdXPHSVpiCDm+hqTTWCmC739St1Xni0DJBt8HnSHTG67i1y6gr8qrA==} + '@oxlint/binding-win32-x64-msvc@1.59.0': + resolution: {integrity: sha512-xkE7puteDS/vUyRngLXW0t8WgdWoS/tfxXjhP/P7SMqPDx+hs44SpssO3h3qmTqECYEuXBUPzcAw5257Ka+ofA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -4998,6 +5031,9 @@ packages: defu@6.1.6: resolution: {integrity: sha512-f8mefEW4WIVg4LckePx3mALjQSPQgFlg9U8yaPdlsbdYcHQyj9n2zL2LJEA52smeYxOvmd/nB7TpMtHGMTHcug==} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} @@ -6260,17 +6296,21 @@ packages: resolution: {integrity: sha512-zBd1G8HkewNd2A8oQ8c6BN/f/c9EId7rSUueOLGu28govmUctXmM+3765GwsByv9nYUdrLqHphXlYIc86saYsg==} engines: {node: '>=18'} - oxfmt@0.42.0: - resolution: {integrity: sha512-QhejGErLSMReNuZ6vxgFHDyGoPbjTRNi6uGHjy0cvIjOQFqD6xmr/T+3L41ixR3NIgzcNiJ6ylQKpvShTgDfqg==} + oxfmt@0.44.0: + resolution: {integrity: sha512-lnncqvHewyRvaqdrnntVIrZV2tEddz8lbvPsQzG/zlkfvgZkwy0HP1p/2u1aCDToeg1jb9zBpbJdfkV73Itw+w==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - oxlint@1.57.0: - resolution: {integrity: sha512-DGFsuBX5MFZX9yiDdtKjTrYPq45CZ8Fft6qCltJITYZxfwYjVdGf/6wycGYTACloauwIPxUnYhBVeZbHvleGhw==} + oxlint-tsgolint@0.20.0: + resolution: {integrity: sha512-/Uc9TQyN1l8w9QNvXtVHYtz+SzDJHKpb5X0UnHodl0BVzijUPk0LPlDOHAvogd1UI+iy9ZSF6gQxEqfzUxCULQ==} + hasBin: true + + oxlint@1.59.0: + resolution: {integrity: sha512-0xBLeGGjP4vD9pygRo8iuOkOzEU1MqOnfiOl7KYezL/QvWL8NUg6n03zXc7ZVqltiOpUxBk2zgHI3PnRIEdAvw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - oxlint-tsgolint: '>=0.15.0' + oxlint-tsgolint: '>=0.18.0' peerDependenciesMeta: oxlint-tsgolint: optional: true @@ -7966,21 +8006,6 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0)': - dependencies: - '@better-auth/utils': 0.3.1 - '@better-fetch/fetch': 1.1.21 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.40.0 - '@standard-schema/spec': 1.1.0 - better-call: 1.3.2(zod@4.3.6) - jose: 6.2.2 - kysely: 0.28.14 - nanostores: 1.2.0 - zod: 4.3.6 - optionalDependencies: - '@cloudflare/workers-types': 4.20260405.1 - '@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0)': dependencies: '@better-auth/utils': 0.3.1 @@ -7996,43 +8021,43 @@ snapshots: optionalDependencies: '@cloudflare/workers-types': 4.20260405.1 - '@better-auth/drizzle-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)))': + '@better-auth/drizzle-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.15)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)))': dependencies: - '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) + '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0) '@better-auth/utils': 0.3.1 optionalDependencies: - drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) + drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.15)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) - '@better-auth/kysely-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.15)': + '@better-auth/kysely-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.15)': dependencies: - '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) + '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0) '@better-auth/utils': 0.3.1 optionalDependencies: kysely: 0.28.15 - '@better-auth/memory-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)': + '@better-auth/memory-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0))(@better-auth/utils@0.3.1)': dependencies: - '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) + '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0) '@better-auth/utils': 0.3.1 - '@better-auth/mongo-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(mongodb@7.1.0(@aws-sdk/credential-providers@3.1024.0)(socks@2.8.7))': + '@better-auth/mongo-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(mongodb@7.1.0(@aws-sdk/credential-providers@3.1024.0)(socks@2.8.7))': dependencies: - '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) + '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0) '@better-auth/utils': 0.3.1 optionalDependencies: mongodb: 7.1.0(@aws-sdk/credential-providers@3.1024.0)(socks@2.8.7) - '@better-auth/prisma-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))': + '@better-auth/prisma-adapter@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))': dependencies: - '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) + '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0) '@better-auth/utils': 0.3.1 optionalDependencies: '@prisma/client': 7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2) prisma: 7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2) - '@better-auth/telemetry@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))': + '@better-auth/telemetry@1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0))': dependencies: - '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0) + '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0) '@better-auth/utils': 0.3.1 '@better-fetch/fetch': 1.1.21 @@ -9264,118 +9289,136 @@ snapshots: '@oxc-project/types@0.122.0': {} - '@oxfmt/binding-android-arm-eabi@0.42.0': + '@oxfmt/binding-android-arm-eabi@0.44.0': optional: true - '@oxfmt/binding-android-arm64@0.42.0': + '@oxfmt/binding-android-arm64@0.44.0': optional: true - '@oxfmt/binding-darwin-arm64@0.42.0': + '@oxfmt/binding-darwin-arm64@0.44.0': optional: true - '@oxfmt/binding-darwin-x64@0.42.0': + '@oxfmt/binding-darwin-x64@0.44.0': optional: true - '@oxfmt/binding-freebsd-x64@0.42.0': + '@oxfmt/binding-freebsd-x64@0.44.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.42.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.44.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.42.0': + '@oxfmt/binding-linux-arm-musleabihf@0.44.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.42.0': + '@oxfmt/binding-linux-arm64-gnu@0.44.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.42.0': + '@oxfmt/binding-linux-arm64-musl@0.44.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.42.0': + '@oxfmt/binding-linux-ppc64-gnu@0.44.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.42.0': + '@oxfmt/binding-linux-riscv64-gnu@0.44.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.42.0': + '@oxfmt/binding-linux-riscv64-musl@0.44.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.42.0': + '@oxfmt/binding-linux-s390x-gnu@0.44.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.42.0': + '@oxfmt/binding-linux-x64-gnu@0.44.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.42.0': + '@oxfmt/binding-linux-x64-musl@0.44.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.42.0': + '@oxfmt/binding-openharmony-arm64@0.44.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.42.0': + '@oxfmt/binding-win32-arm64-msvc@0.44.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.42.0': + '@oxfmt/binding-win32-ia32-msvc@0.44.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.42.0': + '@oxfmt/binding-win32-x64-msvc@0.44.0': optional: true - '@oxlint/binding-android-arm-eabi@1.57.0': + '@oxlint-tsgolint/darwin-arm64@0.20.0': optional: true - '@oxlint/binding-android-arm64@1.57.0': + '@oxlint-tsgolint/darwin-x64@0.20.0': optional: true - '@oxlint/binding-darwin-arm64@1.57.0': + '@oxlint-tsgolint/linux-arm64@0.20.0': optional: true - '@oxlint/binding-darwin-x64@1.57.0': + '@oxlint-tsgolint/linux-x64@0.20.0': optional: true - '@oxlint/binding-freebsd-x64@1.57.0': + '@oxlint-tsgolint/win32-arm64@0.20.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.57.0': + '@oxlint-tsgolint/win32-x64@0.20.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.57.0': + '@oxlint/binding-android-arm-eabi@1.59.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.57.0': + '@oxlint/binding-android-arm64@1.59.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.57.0': + '@oxlint/binding-darwin-arm64@1.59.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.57.0': + '@oxlint/binding-darwin-x64@1.59.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.57.0': + '@oxlint/binding-freebsd-x64@1.59.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.57.0': + '@oxlint/binding-linux-arm-gnueabihf@1.59.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.57.0': + '@oxlint/binding-linux-arm-musleabihf@1.59.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.57.0': + '@oxlint/binding-linux-arm64-gnu@1.59.0': optional: true - '@oxlint/binding-linux-x64-musl@1.57.0': + '@oxlint/binding-linux-arm64-musl@1.59.0': optional: true - '@oxlint/binding-openharmony-arm64@1.57.0': + '@oxlint/binding-linux-ppc64-gnu@1.59.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.57.0': + '@oxlint/binding-linux-riscv64-gnu@1.59.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.57.0': + '@oxlint/binding-linux-riscv64-musl@1.59.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.57.0': + '@oxlint/binding-linux-s390x-gnu@1.59.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.59.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.59.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.59.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.59.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.59.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.59.0': optional: true '@phun-ky/typeof@2.0.3': {} @@ -11713,7 +11756,7 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - alchemy@0.90.1(@cloudflare/vite-plugin@1.31.0(vite@8.0.2)(workerd@1.20260401.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)))(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(vite@8.0.2)(workerd@1.20260401.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)): + alchemy@0.90.1(@cloudflare/vite-plugin@1.31.0(vite@8.0.2)(workerd@1.20260401.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)))(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.15)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(vite@8.0.2)(workerd@1.20260401.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)): dependencies: '@aws-sdk/credential-providers': 3.1024.0 '@cloudflare/unenv-preset': 2.7.7(unenv@2.0.0-rc.21)(workerd@1.20260401.1) @@ -11723,7 +11766,7 @@ snapshots: '@smithy/node-config-provider': 4.3.12 '@smithy/types': 4.13.1 aws4fetch: 1.0.20 - drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) + drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.15)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) env-paths: 3.0.0 esbuild: 0.25.12 execa: 9.6.1 @@ -11879,15 +11922,15 @@ snapshots: before-after-hook@4.0.0: {} - better-auth@1.5.6(cda3b31c0637fd6775df146cf0d5df72): + better-auth@1.5.6(31cbc98915db2d1b55eeab35e5a9d8b9): dependencies: '@better-auth/core': 1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0) - '@better-auth/drizzle-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))) - '@better-auth/kysely-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.15) - '@better-auth/memory-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1) - '@better-auth/mongo-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(mongodb@7.1.0(@aws-sdk/credential-providers@3.1024.0)(socks@2.8.7)) - '@better-auth/prisma-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) - '@better-auth/telemetry': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.14)(nanostores@1.2.0)) + '@better-auth/drizzle-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.15)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))) + '@better-auth/kysely-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(kysely@0.28.15) + '@better-auth/memory-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0))(@better-auth/utils@0.3.1) + '@better-auth/mongo-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(mongodb@7.1.0(@aws-sdk/credential-providers@3.1024.0)(socks@2.8.7)) + '@better-auth/prisma-adapter': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) + '@better-auth/telemetry': 1.5.6(@better-auth/core@1.5.6(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260405.1)(@opentelemetry/api@1.9.0)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0)) '@better-auth/utils': 0.3.1 '@better-fetch/fetch': 1.1.21 '@noble/ciphers': 2.1.1 @@ -11902,7 +11945,7 @@ snapshots: '@prisma/client': 7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2) '@tanstack/react-start': 1.167.5(crossws@0.4.1(srvx@0.11.15))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) drizzle-kit: 0.31.10 - drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) + drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.15)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)) mongodb: 7.1.0(@aws-sdk/credential-providers@3.1024.0)(socks@2.8.7) mysql2: 3.15.3 prisma: 7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2) @@ -11971,7 +12014,7 @@ snapshots: dependencies: chokidar: 4.0.3 confbox: 0.2.4 - defu: 6.1.6 + defu: 6.1.7 dotenv: 16.6.1 exsolve: 1.0.8 giget: 2.0.0 @@ -12366,6 +12409,9 @@ snapshots: defu@6.1.6: {} + defu@6.1.7: + optional: true + degenerator@5.0.1: dependencies: ast-types: 0.13.4 @@ -12437,14 +12483,14 @@ snapshots: esbuild: 0.25.12 tsx: 4.21.0 - drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.14)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)): + drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260405.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2))(kysely@0.28.15)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2)): optionalDependencies: '@cloudflare/workers-types': 4.20260405.1 '@electric-sql/pglite': 0.3.15 '@libsql/client': 0.17.2 '@opentelemetry/api': 1.9.0 '@prisma/client': 7.4.2(prisma@7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2))(typescript@6.0.2) - kysely: 0.28.14 + kysely: 0.28.15 mysql2: 3.15.3 postgres: 3.4.7 prisma: 7.4.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.2) @@ -13552,51 +13598,61 @@ snapshots: macos-release: 3.4.0 windows-release: 6.1.0 - oxfmt@0.42.0: + oxfmt@0.44.0: dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.42.0 - '@oxfmt/binding-android-arm64': 0.42.0 - '@oxfmt/binding-darwin-arm64': 0.42.0 - '@oxfmt/binding-darwin-x64': 0.42.0 - '@oxfmt/binding-freebsd-x64': 0.42.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.42.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.42.0 - '@oxfmt/binding-linux-arm64-gnu': 0.42.0 - '@oxfmt/binding-linux-arm64-musl': 0.42.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.42.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.42.0 - '@oxfmt/binding-linux-riscv64-musl': 0.42.0 - '@oxfmt/binding-linux-s390x-gnu': 0.42.0 - '@oxfmt/binding-linux-x64-gnu': 0.42.0 - '@oxfmt/binding-linux-x64-musl': 0.42.0 - '@oxfmt/binding-openharmony-arm64': 0.42.0 - '@oxfmt/binding-win32-arm64-msvc': 0.42.0 - '@oxfmt/binding-win32-ia32-msvc': 0.42.0 - '@oxfmt/binding-win32-x64-msvc': 0.42.0 - - oxlint@1.57.0: - optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.57.0 - '@oxlint/binding-android-arm64': 1.57.0 - '@oxlint/binding-darwin-arm64': 1.57.0 - '@oxlint/binding-darwin-x64': 1.57.0 - '@oxlint/binding-freebsd-x64': 1.57.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.57.0 - '@oxlint/binding-linux-arm-musleabihf': 1.57.0 - '@oxlint/binding-linux-arm64-gnu': 1.57.0 - '@oxlint/binding-linux-arm64-musl': 1.57.0 - '@oxlint/binding-linux-ppc64-gnu': 1.57.0 - '@oxlint/binding-linux-riscv64-gnu': 1.57.0 - '@oxlint/binding-linux-riscv64-musl': 1.57.0 - '@oxlint/binding-linux-s390x-gnu': 1.57.0 - '@oxlint/binding-linux-x64-gnu': 1.57.0 - '@oxlint/binding-linux-x64-musl': 1.57.0 - '@oxlint/binding-openharmony-arm64': 1.57.0 - '@oxlint/binding-win32-arm64-msvc': 1.57.0 - '@oxlint/binding-win32-ia32-msvc': 1.57.0 - '@oxlint/binding-win32-x64-msvc': 1.57.0 + '@oxfmt/binding-android-arm-eabi': 0.44.0 + '@oxfmt/binding-android-arm64': 0.44.0 + '@oxfmt/binding-darwin-arm64': 0.44.0 + '@oxfmt/binding-darwin-x64': 0.44.0 + '@oxfmt/binding-freebsd-x64': 0.44.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.44.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.44.0 + '@oxfmt/binding-linux-arm64-gnu': 0.44.0 + '@oxfmt/binding-linux-arm64-musl': 0.44.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.44.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.44.0 + '@oxfmt/binding-linux-riscv64-musl': 0.44.0 + '@oxfmt/binding-linux-s390x-gnu': 0.44.0 + '@oxfmt/binding-linux-x64-gnu': 0.44.0 + '@oxfmt/binding-linux-x64-musl': 0.44.0 + '@oxfmt/binding-openharmony-arm64': 0.44.0 + '@oxfmt/binding-win32-arm64-msvc': 0.44.0 + '@oxfmt/binding-win32-ia32-msvc': 0.44.0 + '@oxfmt/binding-win32-x64-msvc': 0.44.0 + + oxlint-tsgolint@0.20.0: + optionalDependencies: + '@oxlint-tsgolint/darwin-arm64': 0.20.0 + '@oxlint-tsgolint/darwin-x64': 0.20.0 + '@oxlint-tsgolint/linux-arm64': 0.20.0 + '@oxlint-tsgolint/linux-x64': 0.20.0 + '@oxlint-tsgolint/win32-arm64': 0.20.0 + '@oxlint-tsgolint/win32-x64': 0.20.0 + + oxlint@1.59.0(oxlint-tsgolint@0.20.0): + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.59.0 + '@oxlint/binding-android-arm64': 1.59.0 + '@oxlint/binding-darwin-arm64': 1.59.0 + '@oxlint/binding-darwin-x64': 1.59.0 + '@oxlint/binding-freebsd-x64': 1.59.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.59.0 + '@oxlint/binding-linux-arm-musleabihf': 1.59.0 + '@oxlint/binding-linux-arm64-gnu': 1.59.0 + '@oxlint/binding-linux-arm64-musl': 1.59.0 + '@oxlint/binding-linux-ppc64-gnu': 1.59.0 + '@oxlint/binding-linux-riscv64-gnu': 1.59.0 + '@oxlint/binding-linux-riscv64-musl': 1.59.0 + '@oxlint/binding-linux-s390x-gnu': 1.59.0 + '@oxlint/binding-linux-x64-gnu': 1.59.0 + '@oxlint/binding-linux-x64-musl': 1.59.0 + '@oxlint/binding-openharmony-arm64': 1.59.0 + '@oxlint/binding-win32-arm64-msvc': 1.59.0 + '@oxlint/binding-win32-ia32-msvc': 1.59.0 + '@oxlint/binding-win32-x64-msvc': 1.59.0 + oxlint-tsgolint: 0.20.0 p-limit@7.3.0: dependencies: diff --git a/src/lib/auth/server.ts b/src/lib/auth/server.ts index 75bc55a..10ca90b 100644 --- a/src/lib/auth/server.ts +++ b/src/lib/auth/server.ts @@ -44,20 +44,20 @@ export const authServer = betterAuth({ }), secondaryStorage: { get: async (key) => { - return await kvStore.get(key); + return kvStore.get(key); }, set: async (key, value, ttl) => { - if (!ttl) return await kvStore.put(key, value); + if (!ttl) return kvStore.put(key, value); // Cloudflare Workers KV has a minimum TTL of 60 seconds. // If the provided TTL is less than that, we set it to the minimum. let expirationTtl = ttl; if (expirationTtl < KV_STORE_MIN_TTL_IN_SECONDS) { expirationTtl = KV_STORE_MIN_TTL_IN_SECONDS; } - return await kvStore.put(key, value, { expirationTtl }); + return kvStore.put(key, value, { expirationTtl }); }, delete: async (key) => { - return await kvStore.delete(key); + return kvStore.delete(key); }, }, plugins: [tanstackStartCookies()], @@ -109,7 +109,7 @@ export const authServer = betterAuth({ }, }, hooks: { - // oxlint-disable-next-line require-await + // oxlint-disable-next-line typescript/require-await after: createAuthMiddleware(async (ctx) => { const response = ctx.context.returned; if (!(response instanceof APIError)) { diff --git a/src/lib/auth/types.ts b/src/lib/auth/types.ts index 76a5553..ba1c447 100644 --- a/src/lib/auth/types.ts +++ b/src/lib/auth/types.ts @@ -1,7 +1,3 @@ -import type { authClient } from '~/lib/auth/client'; -import { authServer } from '~/lib/auth/server'; +import type { authServer } from '~/lib/auth/server'; -export type AuthErrors = Record< - keyof typeof authServer.$ERROR_CODES | keyof typeof authClient.$ERROR_CODES, - string ->; +export type AuthErrors = Record; diff --git a/src/lib/env/drizzle.ts b/src/lib/env/drizzle.ts new file mode 100644 index 0000000..4b6ad8f --- /dev/null +++ b/src/lib/env/drizzle.ts @@ -0,0 +1,11 @@ +import { createEnv } from '@t3-oss/env-core'; +import * as z from 'zod/v4'; + +/** Env schema for Drizzle configuration */ +export const drizzleEnv = createEnv({ + server: { + DB_ENV: z.enum(['local', 'remote']), + }, + runtimeEnv: process.env, + emptyStringAsUndefined: true, +}); diff --git a/src/lib/form/components/form-checkbox-single.tsx b/src/lib/form/components/form-checkbox-single.tsx index faf0c9a..305ac7b 100644 --- a/src/lib/form/components/form-checkbox-single.tsx +++ b/src/lib/form/components/form-checkbox-single.tsx @@ -50,7 +50,7 @@ function FormCheckboxSingleItem({ const isDisabled = fieldSet?.disabled || disabled; function handleCheckedChange(checked: boolean) { - field.handleChange(checked === true); + field.handleChange(checked); } const checkbox = ( diff --git a/src/lib/form/components/form-reset.tsx b/src/lib/form/components/form-reset.tsx index 40c4ab6..bc5ef5d 100644 --- a/src/lib/form/components/form-reset.tsx +++ b/src/lib/form/components/form-reset.tsx @@ -9,7 +9,7 @@ export function FormReset({ }: React.ComponentPropsWithRef) { const form = useFormContext(); - function handleReset(event: React.MouseEvent) { + function handleReset(event: React.MouseEvent) { event.preventDefault(); form.reset(); } diff --git a/src/lib/form/components/form-root.tsx b/src/lib/form/components/form-root.tsx index 7488772..c38326c 100644 --- a/src/lib/form/components/form-root.tsx +++ b/src/lib/form/components/form-root.tsx @@ -8,9 +8,9 @@ export function FormRoot({ }: React.ComponentPropsWithRef<'form'>) { const form = useFormContext(); - function handleSubmit(event: React.FormEvent) { + async function handleSubmit(event: React.SubmitEvent) { event.preventDefault(); - form.handleSubmit(); + await form.handleSubmit(); } return ( diff --git a/src/lib/form/form.utils.ts b/src/lib/form/form.utils.ts index 2fa0672..2774717 100644 --- a/src/lib/form/form.utils.ts +++ b/src/lib/form/form.utils.ts @@ -46,6 +46,6 @@ export function checkIsFormError(errors: unknown): errors is FormError { typeof errors === 'object' && errors !== null && '_tag' in errors && - errors?._tag === FormErrorSymbol + errors._tag === FormErrorSymbol ); } diff --git a/src/routes/api/auth.$.ts b/src/routes/api/auth.$.ts index 6e3fb32..8ac50db 100644 --- a/src/routes/api/auth.$.ts +++ b/src/routes/api/auth.$.ts @@ -6,10 +6,10 @@ export const Route = createFileRoute('/api/auth/$')({ server: { handlers: { GET: async ({ request }: { request: Request }) => { - return await authServer.handler(request); + return authServer.handler(request); }, POST: async ({ request }: { request: Request }) => { - return await authServer.handler(request); + return authServer.handler(request); }, }, }, diff --git a/src/routes/app/index.tsx b/src/routes/app/index.tsx index 6fe4521..ea7c3eb 100644 --- a/src/routes/app/index.tsx +++ b/src/routes/app/index.tsx @@ -28,7 +28,7 @@ function RouteComponent() { toast.success(m.auth_sign_out_success_title(), { description: m.auth_sign_out_success_description(), }); - navigate({ to: '/' }); + await navigate({ to: '/' }); } return ( diff --git a/src/routes/auth/layout.tsx b/src/routes/auth/layout.tsx index 7589491..d29a701 100644 --- a/src/routes/auth/layout.tsx +++ b/src/routes/auth/layout.tsx @@ -6,7 +6,7 @@ import { authGuestGuard } from '~/modules/auth/auth.utils'; export const Route = createFileRoute('/auth')({ validateSearch: zodValidator(authSearchParamsSchema), - beforeLoad: async () => await authGuestGuard(), + beforeLoad: async () => authGuestGuard(), component: RouteComponent, }); diff --git a/src/server.ts b/src/server.ts index 2194408..b77788f 100644 --- a/src/server.ts +++ b/src/server.ts @@ -3,7 +3,7 @@ import handler from '@tanstack/react-start/server-entry'; import { paraglideMiddleware } from '~/lib/i18n/server'; export default { - fetch(req: Request): Promise { - return paraglideMiddleware(req, () => handler.fetch(req)); + async fetch(req: Request): Promise { + return paraglideMiddleware(req, async () => handler.fetch(req)); }, }; diff --git a/src/start.ts b/src/start.ts index c76cd54..74cd713 100644 --- a/src/start.ts +++ b/src/start.ts @@ -1,13 +1,13 @@ import { createMiddleware, createStart } from '@tanstack/react-start'; const requestMiddleware = createMiddleware({ type: 'request' }).server( - function handler({ next }) { + async function handler({ next }) { return next(); }, ); const functionMiddleware = createMiddleware({ type: 'function' }).server( - function handler({ next }) { + async function handler({ next }) { return next(); }, ); diff --git a/src/ui/components/core/carousel.tsx b/src/ui/components/core/carousel.tsx index c4a52d9..0b8fb26 100644 --- a/src/ui/components/core/carousel.tsx +++ b/src/ui/components/core/carousel.tsx @@ -98,24 +98,35 @@ function Carousel({ api.on('select', onSelect); return () => { - api?.off('select', onSelect); + api.off('select', onSelect); }; }, [api, onSelect]); + const contextValue = React.useMemo( + () => ({ + carouselRef, + api, + opts, + orientation, + scrollPrev, + scrollNext, + canScrollPrev, + canScrollNext, + }), + [ + carouselRef, + api, + opts, + orientation, + scrollPrev, + scrollNext, + canScrollPrev, + canScrollNext, + ], + ); + return ( - +

); @@ -297,6 +300,7 @@ function ChartLegendContent({ {payload .filter((item) => item.type !== 'none') .map((item, index) => { + // oxlint-disable-next-line typescript/restrict-template-expressions const key = `${nameKey ?? item.dataKey ?? 'value'}`; const itemConfig = getPayloadConfigFromPayload(config, item, key); diff --git a/src/ui/components/core/field.tsx b/src/ui/components/core/field.tsx index e93c1a2..bcb7364 100644 --- a/src/ui/components/core/field.tsx +++ b/src/ui/components/core/field.tsx @@ -22,8 +22,10 @@ function FieldSet({ ? (parentFieldSetState?.disabled ?? false) : disabled; + const value = React.useMemo(() => ({ disabled: isDisabled }), [isDisabled]); + return ( - +
& { - errors?: Array<{ message?: string } | undefined>; + errors?: ({ message?: string } | undefined)[]; }) { const content = React.useMemo(() => { if (children) { @@ -211,7 +213,7 @@ function FieldError({ ...new Map(errors.map((error) => [error?.message, error])).values(), ]; - if (uniqueErrors?.length === 1) { + if (uniqueErrors.length === 1) { return uniqueErrors[0]?.message; } diff --git a/src/ui/components/core/input-group.tsx b/src/ui/components/core/input-group.tsx index 3fabc42..8f0cab8 100644 --- a/src/ui/components/core/input-group.tsx +++ b/src/ui/components/core/input-group.tsx @@ -47,14 +47,14 @@ function InputGroupAddon({ ...props }: React.ComponentProps<'div'> & VariantProps) { return ( - // oxlint-disable-next-line click-events-have-key-events no-static-element-interactions + // oxlint-disable-next-line click-events-have-key-events
{ - if ((e.target as HTMLElement).closest('button')) { + if (e.target instanceof HTMLElement && e.target.closest('button')) { return; } e.currentTarget.parentElement?.querySelector('input')?.focus(); diff --git a/src/ui/components/core/input-otp.tsx b/src/ui/components/core/input-otp.tsx index 9fb4711..5487200 100644 --- a/src/ui/components/core/input-otp.tsx +++ b/src/ui/components/core/input-otp.tsx @@ -46,7 +46,7 @@ function InputOTPSlot({ index: number; }) { const inputOTPContext = React.useContext(OTPInputContext); - const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}; + const { char, hasFakeCaret, isActive } = inputOTPContext.slots[index] ?? {}; return (
boolean)) => { const openState = typeof value === 'function' ? value(open) : value; if (setOpenProp) { setOpenProp(openState); } else { - _setOpen(openState); + setInternalOpen(openState); } // This sets the cookie to keep the sidebar state. @@ -183,11 +183,7 @@ function Sidebar({ data-slot="sidebar" data-mobile="true" className="w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden" - style={ - { - '--sidebar-width': SIDEBAR_WIDTH_MOBILE, - } as React.CSSProperties - } + style={{ '--sidebar-width': SIDEBAR_WIDTH_MOBILE }} side={side} > @@ -604,11 +600,7 @@ function SidebarMenuSkeleton({
); diff --git a/src/ui/components/core/sonner.tsx b/src/ui/components/core/sonner.tsx index d597f09..945b739 100644 --- a/src/ui/components/core/sonner.tsx +++ b/src/ui/components/core/sonner.tsx @@ -5,13 +5,14 @@ import { OctagonXIcon, Loader2Icon, } from 'lucide-react'; -import { useTheme } from 'next-themes'; import { Toaster as RootToaster, type ToasterProps, toast as baseToast, } from 'sonner'; +import { useTheme } from '~/ui/styles/theme'; + const toast = baseToast; function Toaster({ ...props }: ToasterProps) { diff --git a/src/ui/components/core/toggle-group.tsx b/src/ui/components/core/toggle-group.tsx index 0a4537a..2bb095f 100644 --- a/src/ui/components/core/toggle-group.tsx +++ b/src/ui/components/core/toggle-group.tsx @@ -30,6 +30,11 @@ function ToggleGroup({ spacing?: number; orientation?: 'horizontal' | 'vertical'; }) { + const contextValue = React.useMemo( + () => ({ variant, size, spacing, orientation }), + [variant, size, spacing, orientation], + ); + return ( - + {children} diff --git a/src/ui/hooks/use-media-query.ts b/src/ui/hooks/use-media-query.ts index 60b7dcb..643d535 100644 --- a/src/ui/hooks/use-media-query.ts +++ b/src/ui/hooks/use-media-query.ts @@ -25,7 +25,7 @@ const directionOperators: Record = { 'max-width': '<', }; -interface Options { +interface Options { /** * Initial value to use before the media query listener is set up. * This opens up the possibility of knowing the media query match state @@ -80,9 +80,7 @@ export function useMediaQuery( options?: Options, ) { const { initialValue } = options ?? {}; - const [isMatches, setIsMatches] = React.useState( - initialValue, - ); + const [isMatches, setIsMatches] = React.useState(initialValue); React.useEffect( function watchMediaSize() { @@ -92,10 +90,10 @@ export function useMediaQuery( ); function onChangeMediaQuery(event: MediaQueryListEvent) { - setIsMatches(event.matches); + setIsMatches(event.matches as TInitialValue); } mediaQuery.addEventListener('change', onChangeMediaQuery); - setIsMatches(mediaQuery.matches); + setIsMatches(mediaQuery.matches as TInitialValue); return () => mediaQuery.removeEventListener('change', onChangeMediaQuery); }, [breakpoint, direction], diff --git a/src/ui/styles/theme.tsx b/src/ui/styles/theme.tsx index a4260fb..d587acf 100644 --- a/src/ui/styles/theme.tsx +++ b/src/ui/styles/theme.tsx @@ -4,6 +4,8 @@ import { } from 'next-themes'; import * as React from 'react'; +export type Theme = 'light' | 'dark' | 'system'; + /** * Theme provider component that wraps the application * to configures the next-themes provider. diff --git a/tsconfig.json b/tsconfig.json index bf7c7bb..e6d55ba 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,8 @@ "vite.config.ts", "alchemy.run.ts", "eslint.config.ts", - "commitlint.config.ts" + "commitlint.config.ts", + "drizzle.config.ts" ], "exclude": ["node_modules"], "compilerOptions": { From 3e1631f84a0d77e410d9ea2473e1045984ff3283 Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Sat, 11 Apr 2026 17:29:57 +0700 Subject: [PATCH 11/20] refactor(oxc): use config ts file instead of json (#90) --- .husky/pre-commit | 3 +- lint-staged.config.js | 41 ------ lint-staged.config.ts | 33 +++++ oxfmt.config.ts | 49 +++++++ oxlint.config.ts | 303 ++++++++++++++++++++++++++++++++++++++++++ package.json | 8 +- tsconfig.json | 7 +- 7 files changed, 393 insertions(+), 51 deletions(-) delete mode 100644 lint-staged.config.js create mode 100644 lint-staged.config.ts create mode 100644 oxfmt.config.ts create mode 100644 oxlint.config.ts diff --git a/.husky/pre-commit b/.husky/pre-commit index cb2c84d..3e92ad3 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1,2 @@ -pnpm lint-staged +NODE_OPTIONS="--experimental-strip-types" pnpm lint-staged --config lint-staged.config.ts + diff --git a/lint-staged.config.js b/lint-staged.config.js deleted file mode 100644 index 5149a14..0000000 --- a/lint-staged.config.js +++ /dev/null @@ -1,41 +0,0 @@ -// Define file extensions -const TYPESCRIPT_EXTENSIONS = ['ts', 'mts', 'cts', 'tsx']; -const JAVASCRIPT_EXTENSIONS = ['js', 'mjs', 'cjs', 'jsx']; - -// Construct glob patterns for lint-staged -const ALL_FILES = '*'; -const TYPESCRIPT_FILES = `*.{${TYPESCRIPT_EXTENSIONS.join(',')}}`; -const JAVASCRIPT_FILES = `*.{${JAVASCRIPT_EXTENSIONS.join(',')}}`; - -/** - * Format code with Oxfmt - */ -function buildOxfmtCommand(stagedFiles) { - return `oxfmt --no-error-on-unmatched-pattern ${stagedFiles.join(' ')}`; -} - -/** - * Check and fix code with Oxlint - */ -function buildOxlintCommand(stagedFiles) { - return `oxlint ${stagedFiles.join(' ')}`; -} - -/** - * Lint staged files - * @description Run commands on staged files based on their types - * @type {import('lint-staged').Configuration} - */ -const lintStagedConfig = { - [ALL_FILES]: function (stagedFiles) { - return [buildOxfmtCommand(stagedFiles)]; - }, - [JAVASCRIPT_FILES]: function (stagedFiles) { - return [buildOxlintCommand(stagedFiles)]; - }, - [TYPESCRIPT_FILES]: function (stagedFiles) { - return [buildOxlintCommand(stagedFiles)]; - }, -}; - -export default lintStagedConfig; diff --git a/lint-staged.config.ts b/lint-staged.config.ts new file mode 100644 index 0000000..5b1ca25 --- /dev/null +++ b/lint-staged.config.ts @@ -0,0 +1,33 @@ +import type { Configuration } from 'lint-staged'; + +// Define file extensions +const JS_TS_EXTENSIONS = ['js', 'mjs', 'cjs', 'jsx', 'ts', 'mts', 'cts', 'tsx']; + +// Construct glob patterns for lint-staged +const ALL_FILES = '*'; +const JS_TS_FILES = `*.{${JS_TS_EXTENSIONS.join(',')}}`; + +// Format code with Oxfmt +function buildFormatCommand(stagedFiles: readonly string[]) { + return `pnpm run format --no-error-on-unmatched-pattern ${stagedFiles.join(' ')}`; +} + +// Check and fix code with Oxlint +function buildLintCommand(stagedFiles: readonly string[]) { + return `pnpm run lint ${stagedFiles.join(' ')}`; +} + +/** + * Lint staged files + * @description Run commands on staged files based on their types + */ +const lintStagedConfig: Configuration = { + [ALL_FILES]: function (stagedFiles) { + return [buildFormatCommand(stagedFiles)]; + }, + [JS_TS_FILES]: function (stagedFiles) { + return [buildLintCommand(stagedFiles)]; + }, +}; + +export default lintStagedConfig; diff --git a/oxfmt.config.ts b/oxfmt.config.ts new file mode 100644 index 0000000..1d5032a --- /dev/null +++ b/oxfmt.config.ts @@ -0,0 +1,49 @@ +import { defineConfig } from 'oxfmt'; + +export default defineConfig({ + ignorePatterns: [ + 'pnpm-lock.yaml', + 'routeTree.gen.ts', + 'public/', + 'src/lib/i18n/', + 'src/lib/database/migrations/', + '.agents/', + 'skills-lock.json', + 'CHANGELOG.md', + ], + printWidth: 80, + tabWidth: 2, + useTabs: false, + semi: true, + singleQuote: true, + jsxSingleQuote: false, + trailingComma: 'all', + endOfLine: 'lf', + objectWrap: 'preserve', + bracketSpacing: true, + bracketSameLine: false, + singleAttributePerLine: false, + arrowParens: 'always', + sortPackageJson: true, + sortImports: { + order: 'asc', + newlinesBetween: true, + sortSideEffects: true, + internalPattern: ['~/'], + groups: [ + ['side_effect'], + ['builtin'], + ['external'], + ['internal'], + ['parent', 'sibling', 'index'], + ['style'], + ], + }, + sortTailwindcss: { + stylesheet: './src/ui/styles/app.css', + attributes: ['class', 'className', 'classNames'], + functions: ['clsx', 'twMerge', 'cn', 'cva'], + preserveDuplicates: false, + preserveWhitespace: false, + }, +}); diff --git a/oxlint.config.ts b/oxlint.config.ts new file mode 100644 index 0000000..d62def3 --- /dev/null +++ b/oxlint.config.ts @@ -0,0 +1,303 @@ +import { defineConfig } from 'oxlint'; + +export default defineConfig({ + ignorePatterns: [ + 'pnpm-lock.yaml', + 'routeTree.gen.ts', + 'public/', + 'src/lib/i18n/', + 'src/lib/database/migrations/', + '.agents/', + ], + env: { + browser: true, + node: true, + }, + options: { + typeAware: true, + typeCheck: true, + }, + plugins: [ + 'eslint', + 'import', + 'jsx-a11y', + 'oxc', + 'promise', + 'react', + 'typescript', + 'unicorn', + ], + rules: { + // Eslint + 'array-callback-return': 'error', + 'constructor-super': 'error', + 'for-direction': 'error', + 'func-names': ['warn', 'as-needed', { generators: 'as-needed' }], + 'func-style': ['warn', 'declaration'], + 'max-params': ['warn', { max: 3 }], + 'no-async-promise-executor': 'error', + 'no-caller': 'error', + 'no-class-assign': 'error', + 'no-compare-neg-zero': 'error', + 'no-cond-assign': 'error', + 'no-console': ['warn', { allow: ['error', 'error', 'info'] }], + 'no-const-assign': 'error', + 'no-constant-binary-expression': 'error', + 'no-constant-condition': 'error', + 'no-constructor-return': 'warn', + 'no-control-regex': 'error', + 'no-debugger': 'error', + 'no-delete-var': 'error', + 'no-dupe-class-members': 'error', + 'no-dupe-else-if': 'error', + 'no-dupe-keys': 'error', + 'no-duplicate-case': 'error', + 'no-duplicate-imports': 'warn', + 'no-empty-character-class': 'error', + 'no-empty-pattern': 'error', + 'no-empty-static-block': 'error', + 'no-eval': 'error', + 'no-ex-assign': 'error', + 'no-extra-boolean-cast': 'error', + 'no-func-assign': 'error', + 'no-global-assign': 'error', + 'no-import-assign': 'error', + 'no-invalid-regexp': 'error', + 'no-irregular-whitespace': 'error', + 'no-iterator': 'error', + 'no-loss-of-precision': 'error', + 'no-misleading-character-class': 'error', + 'no-new': 'warn', + 'no-new-native-nonconstructor': 'error', + 'no-new-wrappers': 'warn', + 'no-nonoctal-decimal-escape': 'error', + 'no-obj-calls': 'error', + 'no-self-assign': 'error', + 'no-setter-return': 'error', + 'no-shadow-restricted-names': 'error', + 'no-sparse-arrays': 'error', + 'no-this-before-super': 'error', + 'no-unassigned-vars': 'error', + 'no-unexpected-multiline': 'error', + 'no-unsafe-finally': 'error', + 'no-unsafe-negation': 'error', + 'no-unsafe-optional-chaining': 'error', + 'no-unused-expressions': 'error', + 'no-unused-labels': 'error', + 'no-unused-private-class-members': 'error', + 'no-unused-vars': 'error', + 'no-useless-backreference': 'error', + 'no-useless-catch': 'error', + 'no-useless-constructor': 'warn', + 'no-useless-escape': 'error', + 'no-useless-rename': 'error', + 'no-var': 'warn', + 'no-with': 'error', + 'prefer-const': 'warn', + 'prefer-object-has-own': 'warn', + radix: 'warn', + 'prefer-numeric-literals': 'warn', + 'require-yield': 'error', + 'use-isnan': 'error', + 'valid-typeof': 'error', + yoda: 'warn', + + // Import + 'import/no-cycle': ['error', { maxDepth: 3 }], + 'import/no-empty-named-blocks': 'warn', + 'import/no-named-as-default': 'warn', + 'import/no-named-as-default-member': 'warn', + 'import/no-self-import': 'error', + 'import/unambiguous': 'warn', + + // JSX Accessibility + 'jsx-a11y/alt-text': 'error', + 'jsx-a11y/anchor-has-content': 'error', + 'jsx-a11y/anchor-is-valid': 'error', + 'jsx-a11y/aria-activedescendant-has-tabindex': 'error', + 'jsx-a11y/aria-props': 'error', + 'jsx-a11y/aria-proptypes': 'error', + 'jsx-a11y/aria-role': 'error', + 'jsx-a11y/aria-unsupported-elements': 'error', + 'jsx-a11y/autocomplete-valid': 'error', + 'jsx-a11y/heading-has-content': 'error', + 'jsx-a11y/html-has-lang': 'error', + 'jsx-a11y/iframe-has-title': 'error', + 'jsx-a11y/img-redundant-alt': 'error', + 'jsx-a11y/label-has-associated-control': 'error', + 'jsx-a11y/media-has-caption': 'error', + 'jsx-a11y/mouse-events-have-key-events': 'error', + 'jsx-a11y/no-access-key': 'warn', + 'jsx-a11y/no-aria-hidden-on-focusable': 'error', + 'jsx-a11y/no-autofocus': 'warn', + 'jsx-a11y/no-distracting-elements': 'error', + 'jsx-a11y/no-redundant-roles': 'error', + 'jsx-a11y/no-static-element-interactions': 'error', + 'jsx-a11y/tabindex-no-positive': 'warn', + 'jsx-a11y/prefer-tag-over-role': 'error', + 'jsx-a11y/role-has-required-aria-props': 'error', + 'jsx-a11y/role-supports-aria-props': 'error', + 'jsx-a11y/scope': 'error', + + // Oxc + 'oxc/approx-constant': 'warn', + 'oxc/bad-array-method-on-arguments': 'error', + 'oxc/bad-char-at-comparison': 'error', + 'oxc/bad-comparison-sequence': 'error', + 'oxc/bad-min-max-func': 'error', + 'oxc/bad-object-literal-comparison': 'error', + 'oxc/bad-replace-all-arg': 'error', + 'oxc/const-comparisons': 'error', + 'oxc/double-comparisons': 'error', + 'oxc/erasing-op': 'error', + 'oxc/misrefactored-assign-op': 'warn', + 'oxc/missing-throw': 'error', + 'oxc/no-accumulating-spread': 'warn', + 'oxc/no-barrel-file': ['warn', { threshold: 10 }], + 'oxc/number-arg-out-of-range': 'error', + 'oxc/only-used-in-recursion': 'error', + 'oxc/uninvoked-array-callback': 'error', + + // Promise + 'promise/always-return': 'warn', + 'promise/catch-or-return': 'error', + 'promise/no-callback-in-promise': 'error', + 'promise/no-multiple-resolved': 'error', + 'promise/no-new-statics': 'error', + 'promise/no-promise-in-callback': 'error', + 'promise/param-names': 'warn', + 'promise/valid-params': 'error', + + // React + 'react/button-has-type': 'error', + 'react/checked-requires-onchange-or-readonly': 'error', + 'react/exhaustive-deps': 'error', + 'react/forbid-dom-props': ['error', { forbid: [] }], + 'react/forbid-elements': ['error', { forbid: [] }], + 'react/iframe-missing-sandbox': 'error', + 'react/jsx-boolean-value': ['warn', 'never'], + 'react/jsx-filename-extension': ['warn', { extensions: ['jsx', 'tsx'] }], + 'react/jsx-fragments': ['warn', 'element'], + 'react/jsx-handler-names': 'warn', + 'react/jsx-key': 'error', + 'react/jsx-no-comment-textnodes': 'warn', + 'react/jsx-no-script-url': 'error', + 'react/jsx-no-target-blank': 'warn', + 'react/jsx-no-constructed-context-values': 'error', + 'react/jsx-no-duplicate-props': 'error', + 'react/jsx-no-undef': 'error', + 'react/jsx-no-useless-fragment': 'warn', + 'react/jsx-pascal-case': 'warn', + 'react/jsx-props-no-spread-multi': 'error', + 'react/no-children-prop': 'error', + 'react/no-danger-with-children': 'error', + 'react/no-direct-mutation-state': 'error', + 'react/no-find-dom-node': 'error', + 'react/no-string-refs': 'error', + 'react/no-this-in-sfc': 'error', + 'react/no-unsafe': 'error', + 'react/style-prop-object': 'error', + 'react/prefer-function-component': 'warn', + 'react/rules-of-hooks': 'error', + 'react/self-closing-comp': 'warn', + 'react/void-dom-elements-no-children': 'error', + + // TypeScript + 'typescript/adjacent-overload-signatures': 'warn', + 'typescript/array-type': ['warn', { default: 'array' }], + 'typescript/await-thenable': 'error', + 'typescript/consistent-type-imports': [ + 'warn', + { + prefer: 'type-imports', + fixStyle: 'inline-type-imports', + disallowTypeAnnotations: false, + }, + ], + 'typescript/consistent-type-assertions': ['warn', { assertionStyle: 'as' }], + 'typescript/consistent-type-definitions': ['warn', 'interface'], + 'typescript/no-array-delete': 'error', + 'typescript/no-base-to-string': 'error', + 'typescript/no-duplicate-enum-values': 'error', + 'typescript/no-duplicate-type-constituents': 'error', + 'typescript/no-extra-non-null-assertion': 'error', + 'typescript/no-floating-promises': 'error', + 'typescript/no-for-in-array': 'error', + 'typescript/no-implied-eval': 'error', + 'typescript/no-meaningless-void-operator': 'error', + 'typescript/no-misused-new': 'error', + 'typescript/no-confusing-non-null-assertion': 'warn', + 'typescript/no-explicit-any': 'warn', + 'typescript/no-misused-spread': 'error', + 'typescript/no-non-null-asserted-optional-chain': 'error', + 'typescript/no-redundant-type-constituents': 'error', + 'typescript/no-unnecessary-boolean-literal-compare': 'warn', + 'typescript/no-unnecessary-template-expression': 'warn', + 'typescript/no-unnecessary-type-assertion': 'warn', + 'typescript/no-unnecessary-type-constraint': 'warn', + 'typescript/no-this-alias': 'error', + 'typescript/no-unnecessary-condition': 'error', + 'typescript/no-unnecessary-parameter-property-assignment': 'error', + 'typescript/no-unsafe-declaration-merging': 'error', + 'typescript/no-unsafe-unary-minus': 'error', + 'typescript/no-useless-empty-export': 'error', + 'typescript/no-wrapper-object-types': 'error', + 'typescript/prefer-as-const': 'error', + 'typescript/prefer-function-type': 'warn', + 'typescript/prefer-namespace-keyword': 'error', + 'typescript/prefer-string-starts-ends-with': 'warn', + 'typescript/require-array-sort-compare': 'error', + 'typescript/restrict-template-expressions': 'error', + 'typescript/require-await': 'warn', + 'typescript/switch-exhaustiveness-check': 'warn', + 'typescript/triple-slash-reference': 'error', + 'typescript/unbound-method': 'error', + + // Unicorn + 'unicorn/error-message': 'warn', + 'unicorn/filename-case': ['warn', { case: 'kebabCase' }], + 'unicorn/no-accessor-recursion': 'error', + 'unicorn/no-array-reverse': 'warn', + 'unicorn/no-array-sort': 'warn', + 'unicorn/no-await-in-promise-methods': 'error', + 'unicorn/no-instanceof-builtins': 'warn', + 'unicorn/no-empty-file': 'error', + 'unicorn/no-invalid-fetch-options': 'error', + 'unicorn/no-invalid-remove-event-listener': 'error', + 'unicorn/no-new-array': 'error', + 'unicorn/no-single-promise-in-promise-methods': 'error', + 'unicorn/no-thenable': 'error', + 'unicorn/no-unnecessary-await': 'error', + 'unicorn/no-useless-fallback-in-spread': 'error', + 'unicorn/no-useless-length-check': 'error', + 'unicorn/no-useless-promise-resolve-reject': 'warn', + 'unicorn/no-useless-spread': 'error', + 'unicorn/prefer-array-flat-map': 'warn', + 'unicorn/prefer-array-some': 'warn', + 'unicorn/prefer-node-protocol': 'warn', + 'unicorn/prefer-optional-catch-binding': 'warn', + 'unicorn/prefer-set-size': 'error', + 'unicorn/throw-new-error': 'warn', + 'unicorn/prefer-string-starts-ends-with': 'error', + }, + overrides: [ + { + // Only allow named export in whole source code + files: ['src/**/*.{js,jsx,ts,tsx}'], + plugins: ['import'], + rules: { + 'import/no-default-export': 'error', + 'import/prefer-default-export': 'off', + }, + }, + { + // Only allow default export in reserved files + files: ['src/server.ts'], + plugins: ['import'], + rules: { + 'import/no-default-export': 'off', + 'import/prefer-default-export': 'error', + }, + }, + ], +}); diff --git a/package.json b/package.json index 374e45c..9be9406 100644 --- a/package.json +++ b/package.json @@ -32,10 +32,10 @@ "db:studio:local": "DB_ENV=local drizzle-kit studio", "db:studio:remote": "DB_ENV=remote drizzle-kit studio", "commitlint": "commitlint --edit", - "format": "oxfmt", - "format:check": "oxfmt --check", - "lint": "oxlint", - "lint:fix": "oxlint --fix", + "format": "oxfmt --config oxfmt.config.ts", + "format:check": "oxfmt --config oxfmt.config.ts --check", + "lint": "oxlint --config oxlint.config.ts", + "lint:fix": "oxlint --config oxlint.config.ts --fix", "storybook:dev": "storybook dev -p 6006", "storybook:build": "storybook build", "release": "release-it", diff --git a/tsconfig.json b/tsconfig.json index e6d55ba..2a558fe 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,11 +6,8 @@ "src/**/*.tsx", ".storybook/**/*.ts", ".storybook/**/*.tsx", - "vite.config.ts", - "alchemy.run.ts", - "eslint.config.ts", - "commitlint.config.ts", - "drizzle.config.ts" + "*.config.ts", + "alchemy.run.ts" ], "exclude": ["node_modules"], "compilerOptions": { From ed8fb401adc1dda573a2978cf2602c134fa95af3 Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Sat, 11 Apr 2026 17:32:41 +0700 Subject: [PATCH 12/20] style(oxc): remove old config files (#91) --- .oxfmtrc.jsonc | 48 -------- .oxlintrc.jsonc | 305 ------------------------------------------------ 2 files changed, 353 deletions(-) delete mode 100644 .oxfmtrc.jsonc delete mode 100644 .oxlintrc.jsonc diff --git a/.oxfmtrc.jsonc b/.oxfmtrc.jsonc deleted file mode 100644 index 647b25f..0000000 --- a/.oxfmtrc.jsonc +++ /dev/null @@ -1,48 +0,0 @@ -{ - "$schema": "./node_modules/oxfmt/configuration_schema.json", - "ignorePatterns": [ - "pnpm-lock.yaml", - "routeTree.gen.ts", - "public/", - "src/lib/i18n/", - "src/lib/database/migrations/", - ".agents/", - "skills-lock.json", - "CHANGELOG.md", - ], - "printWidth": 80, - "tabWidth": 2, - "useTabs": false, - "semi": true, - "singleQuote": true, - "jsxSingleQuote": false, - "trailingComma": "all", - "endOfLine": "lf", - "objectWrap": "preserve", - "bracketSpacing": true, - "bracketSameLine": false, - "singleAttributePerLine": false, - "arrowParens": "always", - "sortPackageJson": true, - "sortImports": { - "order": "asc", - "newlinesBetween": true, - "sortSideEffects": true, - "internalPattern": ["~/"], - "groups": [ - ["side_effect"], - ["builtin"], - ["external"], - ["internal"], - ["parent", "sibling", "index"], - ["style"], - ], - }, - "sortTailwindcss": { - "stylesheet": "./src/ui/styles/app.css", - "attributes": ["class", "className", "classNames"], - "functions": ["clsx", "twMerge", "cn", "cva"], - "preserveDuplicates": false, - "preserveWhitespace": false, - }, -} diff --git a/.oxlintrc.jsonc b/.oxlintrc.jsonc deleted file mode 100644 index 0a96e27..0000000 --- a/.oxlintrc.jsonc +++ /dev/null @@ -1,305 +0,0 @@ -{ - "$schema": "./node_modules/oxlint/configuration_schema.json", - "ignorePatterns": [ - "pnpm-lock.yaml", - "routeTree.gen.ts", - "public/", - "src/lib/i18n/", - "src/lib/database/migrations/", - ".agents/", - ], - "env": { - "browser": true, - "node": true, - }, - "options": { - "typeAware": true, - "typeCheck": true, - }, - "plugins": [ - "eslint", - "import", - "jsx-a11y", - "oxc", - "promise", - "react", - "typescript", - "unicorn", - ], - "rules": { - // Eslint - "array-callback-return": "error", - "constructor-super": "error", - "for-direction": "error", - "func-names": ["warn", "as-needed", { "generators": "as-needed" }], - "func-style": ["warn", "declaration"], - "max-params": ["warn", { "max": 3 }], - "no-async-promise-executor": "error", - "no-caller": "error", - "no-class-assign": "error", - "no-compare-neg-zero": "error", - "no-cond-assign": "error", - "no-console": ["warn", { "allow": ["error", "error", "info"] }], - "no-const-assign": "error", - "no-constant-binary-expression": "error", - "no-constant-condition": "error", - "no-constructor-return": "warn", - "no-control-regex": "error", - "no-debugger": "error", - "no-delete-var": "error", - "no-dupe-class-members": "error", - "no-dupe-else-if": "error", - "no-dupe-keys": "error", - "no-duplicate-case": "error", - "no-duplicate-imports": "warn", - "no-empty-character-class": "error", - "no-empty-pattern": "error", - "no-empty-static-block": "error", - "no-eval": "error", - "no-ex-assign": "error", - "no-extra-boolean-cast": "error", - "no-func-assign": "error", - "no-global-assign": "error", - "no-import-assign": "error", - "no-invalid-regexp": "error", - "no-irregular-whitespace": "error", - "no-iterator": "error", - "no-loss-of-precision": "error", - "no-misleading-character-class": "error", - "no-new": "warn", - "no-new-native-nonconstructor": "error", - "no-new-wrappers": "warn", - "no-nonoctal-decimal-escape": "error", - "no-obj-calls": "error", - "no-self-assign": "error", - "no-setter-return": "error", - "no-shadow-restricted-names": "error", - "no-sparse-arrays": "error", - "no-this-before-super": "error", - "no-unassigned-vars": "error", - "no-unexpected-multiline": "error", - "no-unsafe-finally": "error", - "no-unsafe-negation": "error", - "no-unsafe-optional-chaining": "error", - "no-unused-expressions": "error", - "no-unused-labels": "error", - "no-unused-private-class-members": "error", - "no-unused-vars": "error", - "no-useless-backreference": "error", - "no-useless-catch": "error", - "no-useless-constructor": "warn", - "no-useless-escape": "error", - "no-useless-rename": "error", - "no-var": "warn", - "no-with": "error", - "prefer-const": "warn", - "prefer-object-has-own": "warn", - "radix": "warn", - "prefer-numeric-literals": "warn", - "require-yield": "error", - "use-isnan": "error", - "valid-typeof": "error", - "yoda": "warn", - - // Import - "import/no-cycle": ["error", { "maxDepth": 3 }], - "import/no-empty-named-blocks": "warn", - "import/no-named-as-default": "warn", - "import/no-named-as-default-member": "warn", - "import/no-self-import": "error", - "import/unambiguous": "warn", - - // JSX Accessibility - "jsx-a11y/alt-text": "error", - "jsx-a11y/anchor-has-content": "error", - "jsx-a11y/anchor-is-valid": "error", - "jsx-a11y/aria-activedescendant-has-tabindex": "error", - "jsx-a11y/aria-props": "error", - "jsx-a11y/aria-proptypes": "error", - "jsx-a11y/aria-role": "error", - "jsx-a11y/aria-unsupported-elements": "error", - "jsx-a11y/autocomplete-valid": "error", - "jsx-a11y/heading-has-content": "error", - "jsx-a11y/html-has-lang": "error", - "jsx-a11y/iframe-has-title": "error", - "jsx-a11y/img-redundant-alt": "error", - "jsx-a11y/label-has-associated-control": "error", - "jsx-a11y/media-has-caption": "error", - "jsx-a11y/mouse-events-have-key-events": "error", - "jsx-a11y/no-access-key": "warn", - "jsx-a11y/no-aria-hidden-on-focusable": "error", - "jsx-a11y/no-autofocus": "warn", - "jsx-a11y/no-distracting-elements": "error", - "jsx-a11y/no-redundant-roles": "error", - "jsx-a11y/no-static-element-interactions": "error", - "jsx-a11y/tabindex-no-positive": "warn", - "jsx-a11y/prefer-tag-over-role": "error", - "jsx-a11y/role-has-required-aria-props": "error", - "jsx-a11y/role-supports-aria-props": "error", - "jsx-a11y/scope": "error", - - // Oxc - "oxc/approx-constant": "warn", - "oxc/bad-array-method-on-arguments": "error", - "oxc/bad-char-at-comparison": "error", - "oxc/bad-comparison-sequence": "error", - "oxc/bad-min-max-func": "error", - "oxc/bad-object-literal-comparison": "error", - "oxc/bad-replace-all-arg": "error", - "oxc/const-comparisons": "error", - "oxc/double-comparisons": "error", - "oxc/erasing-op": "error", - "oxc/misrefactored-assign-op": "warn", - "oxc/missing-throw": "error", - "oxc/no-accumulating-spread": "warn", - "oxc/no-barrel-file": ["warn", { "threshold": 10 }], - "oxc/number-arg-out-of-range": "error", - "oxc/only-used-in-recursion": "error", - "oxc/uninvoked-array-callback": "error", - - // Promise - "promise/always-return": "warn", - "promise/catch-or-return": "error", - "promise/no-callback-in-promise": "error", - "promise/no-multiple-resolved": "error", - "promise/no-new-statics": "error", - "promise/no-promise-in-callback": "error", - "promise/param-names": "warn", - "promise/valid-params": "error", - - // React - "react/button-has-type": "error", - "react/checked-requires-onchange-or-readonly": "error", - "react/exhaustive-deps": "error", - "react/forbid-dom-props": ["error", { "forbid": [] }], - "react/forbid-elements": ["error", { "forbid": [] }], - "react/iframe-missing-sandbox": "error", - "react/jsx-boolean-value": ["warn", "never"], - "react/jsx-filename-extension": ["warn", { "extensions": ["jsx", "tsx"] }], - "react/jsx-fragments": ["warn", "element"], - "react/jsx-handler-names": "warn", - "react/jsx-key": "error", - "react/jsx-no-comment-textnodes": "warn", - "react/jsx-no-script-url": "error", - "react/jsx-no-target-blank": "warn", - "react/jsx-no-constructed-context-values": "error", - "react/jsx-no-duplicate-props": "error", - "react/jsx-no-undef": "error", - "react/jsx-no-useless-fragment": "warn", - "react/jsx-pascal-case": "warn", - "react/jsx-props-no-spread-multi": "error", - "react/no-children-prop": "error", - "react/no-danger-with-children": "error", - "react/no-direct-mutation-state": "error", - "react/no-find-dom-node": "error", - "react/no-string-refs": "error", - "react/no-this-in-sfc": "error", - "react/no-unsafe": "error", - "react/style-prop-object": "error", - "react/prefer-function-component": "warn", - "react/rules-of-hooks": "error", - "react/self-closing-comp": "warn", - "react/void-dom-elements-no-children": "error", - - // TypeScript - "typescript/adjacent-overload-signatures": "warn", - "typescript/array-type": ["warn", { "default": "array" }], - "typescript/await-thenable": "error", - "typescript/consistent-type-imports": [ - "warn", - { - "prefer": "type-imports", - "fixStyle": "inline-type-imports", - "disallowTypeAnnotations": false, - }, - ], - "typescript/consistent-type-assertions": [ - "warn", - { "assertionStyle": "as" }, - ], - "typescript/consistent-type-definitions": ["warn", "interface"], - "typescript/no-array-delete": "error", - "typescript/no-base-to-string": "error", - "typescript/no-duplicate-enum-values": "error", - "typescript/no-duplicate-type-constituents": "error", - "typescript/no-extra-non-null-assertion": "error", - "typescript/no-floating-promises": "error", - "typescript/no-for-in-array": "error", - "typescript/no-implied-eval": "error", - "typescript/no-meaningless-void-operator": "error", - "typescript/no-misused-new": "error", - "typescript/no-confusing-non-null-assertion": "warn", - "typescript/no-explicit-any": "warn", - "typescript/no-misused-spread": "error", - "typescript/no-non-null-asserted-optional-chain": "error", - "typescript/no-redundant-type-constituents": "error", - "typescript/no-unnecessary-boolean-literal-compare": "warn", - "typescript/no-unnecessary-template-expression": "warn", - "typescript/no-unnecessary-type-assertion": "warn", - "typescript/no-unnecessary-type-constraint": "warn", - "typescript/no-this-alias": "error", - "typescript/no-unnecessary-condition": "error", - "typescript/no-unnecessary-parameter-property-assignment": "error", - "typescript/no-unsafe-declaration-merging": "error", - "typescript/no-unsafe-unary-minus": "error", - "typescript/no-useless-empty-export": "error", - "typescript/no-wrapper-object-types": "error", - "typescript/prefer-as-const": "error", - "typescript/prefer-function-type": "warn", - "typescript/prefer-namespace-keyword": "error", - "typescript/prefer-string-starts-ends-with": "warn", - "typescript/require-array-sort-compare": "error", - "typescript/restrict-template-expressions": "error", - "typescript/require-await": "warn", - "typescript/switch-exhaustiveness-check": "warn", - "typescript/triple-slash-reference": "error", - "typescript/unbound-method": "error", - - // Unicorn - "unicorn/error-message": "warn", - "unicorn/filename-case": ["warn", { "case": "kebabCase" }], - "unicorn/no-accessor-recursion": "error", - "unicorn/no-array-reverse": "warn", - "unicorn/no-array-sort": "warn", - "unicorn/no-await-in-promise-methods": "error", - "unicorn/no-instanceof-builtins": "warn", - "unicorn/no-empty-file": "error", - "unicorn/no-invalid-fetch-options": "error", - "unicorn/no-invalid-remove-event-listener": "error", - "unicorn/no-new-array": "error", - "unicorn/no-single-promise-in-promise-methods": "error", - "unicorn/no-thenable": "error", - "unicorn/no-unnecessary-await": "error", - "unicorn/no-useless-fallback-in-spread": "error", - "unicorn/no-useless-length-check": "error", - "unicorn/no-useless-promise-resolve-reject": "warn", - "unicorn/no-useless-spread": "error", - "unicorn/prefer-array-flat-map": "warn", - "unicorn/prefer-array-some": "warn", - "unicorn/prefer-node-protocol": "warn", - "unicorn/prefer-optional-catch-binding": "warn", - "unicorn/prefer-set-size": "error", - "unicorn/throw-new-error": "warn", - "unicorn/prefer-string-starts-ends-with": "error", - }, - "overrides": [ - { - // Only allow named export in whole source code - "files": ["src/**/*.{js,jsx,ts,tsx}"], - "plugins": ["import"], - "rules": { - "import/no-default-export": "error", - "import/prefer-default-export": "off", - }, - }, - { - // Only allow default export in reserved files - "files": ["src/server.ts"], - "plugins": ["import"], - "rules": { - "import/no-default-export": "off", - "import/prefer-default-export": "error", - }, - }, - ], -} From d85f77e4c7711ab45e1f83ad3295f05379c002b9 Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Sat, 11 Apr 2026 19:06:40 +0700 Subject: [PATCH 13/20] refactor(start): rename entry files (#92) --- alchemy.run.ts | 1 + oxlint.config.ts | 2 +- src/{client.tsx => entry.client.tsx} | 0 src/entry.server.ts | 9 +++++++++ src/{start.ts => entry.start.ts} | 0 src/routeTree.gen.ts | 2 +- src/server.ts | 9 --------- vite.config.ts | 8 +++++++- 8 files changed, 19 insertions(+), 12 deletions(-) rename src/{client.tsx => entry.client.tsx} (100%) create mode 100644 src/entry.server.ts rename src/{start.ts => entry.start.ts} (100%) delete mode 100644 src/server.ts diff --git a/alchemy.run.ts b/alchemy.run.ts index 33a9e42..a049f08 100644 --- a/alchemy.run.ts +++ b/alchemy.run.ts @@ -122,6 +122,7 @@ const kvStore = await KVNamespace('kv', { /** Provision a TanStack Start worker for the application */ export const worker = await TanStackStart('website', { adopt: true, + wrangler: { main: 'src/entry.server.ts' }, observability: isProductionStage(app) ? { enabled: true } : undefined, url: isProductionStage(app) ? false : true, domains: getDomain(app), diff --git a/oxlint.config.ts b/oxlint.config.ts index d62def3..1fcbce6 100644 --- a/oxlint.config.ts +++ b/oxlint.config.ts @@ -292,7 +292,7 @@ export default defineConfig({ }, { // Only allow default export in reserved files - files: ['src/server.ts'], + files: ['src/entry.server.ts'], plugins: ['import'], rules: { 'import/no-default-export': 'off', diff --git a/src/client.tsx b/src/entry.client.tsx similarity index 100% rename from src/client.tsx rename to src/entry.client.tsx diff --git a/src/entry.server.ts b/src/entry.server.ts new file mode 100644 index 0000000..4ead1ed --- /dev/null +++ b/src/entry.server.ts @@ -0,0 +1,9 @@ +import handler, { createServerEntry } from '@tanstack/react-start/server-entry'; + +import { paraglideMiddleware } from '~/lib/i18n/server'; + +export default createServerEntry({ + fetch(req: Request): Promise { + return paraglideMiddleware(req, () => handler.fetch(req)); + }, +}); diff --git a/src/start.ts b/src/entry.start.ts similarity index 100% rename from src/start.ts rename to src/entry.start.ts diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index 1f0a0f5..245957a 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -220,7 +220,7 @@ export const routeTree = rootRouteImport ._addFileTypes() import type { getRouter } from './router.ts' -import type { startInstance } from './start.ts' +import type { startInstance } from './entry.start.ts' declare module '@tanstack/react-start' { interface Register { ssr: true diff --git a/src/server.ts b/src/server.ts deleted file mode 100644 index b77788f..0000000 --- a/src/server.ts +++ /dev/null @@ -1,9 +0,0 @@ -import handler from '@tanstack/react-start/server-entry'; - -import { paraglideMiddleware } from '~/lib/i18n/server'; - -export default { - async fetch(req: Request): Promise { - return paraglideMiddleware(req, async () => handler.fetch(req)); - }, -}; diff --git a/vite.config.ts b/vite.config.ts index 65c6707..68936a3 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -48,7 +48,13 @@ export default async function viteConfig({ mode }: ConfigEnv) { alchemy({ viteEnvironment: { name: 'ssr' } }), tailwindcss(), tanstackDevtools(), - tanstackStart({ srcDirectory: 'src', router: { routeToken: 'layout' } }), + tanstackStart({ + srcDirectory: 'src', + router: { routeToken: 'layout' }, + start: { entry: 'entry.start.ts' }, + server: { entry: 'entry.server.ts' }, + client: { entry: 'entry.client.tsx' }, + }), // React's vite plugin must come after start's vite plugin viteReact(), babel({ presets: [reactCompilerPreset()] }), From e9aa4716b52a80e73a2b1aada4d1582442a8fe06 Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Sun, 12 Apr 2026 01:42:50 +0700 Subject: [PATCH 14/20] chore(vscode): invalid oxfmt config path (#93) --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 991a4d8..db73229 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -28,7 +28,7 @@ // Extension - Oxc "oxc.enable": true, - "oxc.fmt.configPath": ".oxfmtrc.jsonc", + "oxc.fmt.configPath": "oxfmt.config.ts", // Extension - Tailwind CSS "tailwindCSS.classAttributes": ["class", "className", "classNames"], From 877ba0ed4cec1b70936be77ef58e6100a0b23476 Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Sun, 12 Apr 2026 15:37:23 +0700 Subject: [PATCH 15/20] refactor(auth): simplify auth error and guard (#94) * refactor(auth): simplify auth error and guard * docs(auth): add more clear jsdoc --- src/modules/auth/auth.fn.ts | 32 ++++++++++++++++++++++++---- src/modules/auth/auth.utils.ts | 39 ---------------------------------- src/routes/app/layout.tsx | 17 +++++++++------ src/routes/auth/layout.tsx | 9 +++++--- 4 files changed, 45 insertions(+), 52 deletions(-) delete mode 100644 src/modules/auth/auth.utils.ts diff --git a/src/modules/auth/auth.fn.ts b/src/modules/auth/auth.fn.ts index e16d5a8..2f0eb63 100644 --- a/src/modules/auth/auth.fn.ts +++ b/src/modules/auth/auth.fn.ts @@ -5,9 +5,10 @@ import { authServer } from '~/lib/auth/server'; /** * A server function to get the current authenticated user and session. - * Returns `null` if no user is authenticated. + * + * @returns The current session with user, or `null` if no session exists. */ -export const getCurrentUserFn = createServerFn({ method: 'GET' }).handler( +export const getSession = createServerFn({ method: 'GET' }).handler( async () => { const headers = getRequestHeaders(); const authSession = await authServer.api.getSession({ @@ -17,8 +18,31 @@ export const getCurrentUserFn = createServerFn({ method: 'GET' }).handler( return null; } return { - ...authSession.user, - session: authSession.session, + ...authSession.session, + user: authSession.user, + }; + }, +); + +/** + * A server function to get the current authenticated user and session. + * Unlike `getSession`, this function throws if no user is authenticated. + * + * @returns The current session with user. + * @throws {Error} If no authenticated session is found (`"Unauthorized"`). + */ +export const ensureSession = createServerFn({ method: 'GET' }).handler( + async () => { + const headers = getRequestHeaders(); + const authSession = await authServer.api.getSession({ + headers, + }); + if (!authSession) { + throw new Error('Unauthorized'); + } + return { + ...authSession.session, + user: authSession.user, }; }, ); diff --git a/src/modules/auth/auth.utils.ts b/src/modules/auth/auth.utils.ts deleted file mode 100644 index b4002e3..0000000 --- a/src/modules/auth/auth.utils.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { redirect } from '@tanstack/react-router'; - -import { getCurrentUserFn } from '~/modules/auth/auth.fn'; - -/** - * A utility function that asserts the current user is authenticated. - * If not authenticated, it redirects to the auth page. - * If authenticated, it returns the user object. - */ -export async function authUserGuard({ - redirectBack, -}: { - redirectBack?: string; -}) { - const user = await getCurrentUserFn(); - const isAuthenticated = user !== null; - if (!isAuthenticated) { - throw redirect({ - to: '/auth', - replace: true, - search: { redirectBack }, - }); - } - return user; -} - -/** - * A utility function that asserts the current user is a guest (not authenticated). - * If authenticated, it redirects to the app page. - * If not authenticated, it returns void. - */ -export async function authGuestGuard() { - const user = await getCurrentUserFn(); - const isAuthenticated = user !== null; - if (isAuthenticated) { - throw redirect({ to: '/app', replace: true }); - } - return; -} diff --git a/src/routes/app/layout.tsx b/src/routes/app/layout.tsx index a95ca81..2c1bdae 100644 --- a/src/routes/app/layout.tsx +++ b/src/routes/app/layout.tsx @@ -1,13 +1,18 @@ -import { createFileRoute, Outlet } from '@tanstack/react-router'; +import { createFileRoute, Outlet, redirect } from '@tanstack/react-router'; -import { authUserGuard } from '~/modules/auth/auth.utils'; +import { getSession } from '~/modules/auth/auth.fn'; export const Route = createFileRoute('/app')({ beforeLoad: async ({ location }) => { - const user = await authUserGuard({ - redirectBack: location.pathname, - }); - return { user }; + const session = await getSession(); + if (!session) { + throw redirect({ + to: '/auth', + replace: true, + search: { redirectBack: location.pathname }, + }); + } + return { user: session.user }; }, component: RouteComponent, }); diff --git a/src/routes/auth/layout.tsx b/src/routes/auth/layout.tsx index d29a701..3c7a1c9 100644 --- a/src/routes/auth/layout.tsx +++ b/src/routes/auth/layout.tsx @@ -1,12 +1,15 @@ -import { createFileRoute, Outlet } from '@tanstack/react-router'; +import { createFileRoute, Outlet, redirect } from '@tanstack/react-router'; import { zodValidator } from '@tanstack/zod-adapter'; +import { getSession } from '~/modules/auth/auth.fn'; import { authSearchParamsSchema } from '~/modules/auth/auth.search'; -import { authGuestGuard } from '~/modules/auth/auth.utils'; export const Route = createFileRoute('/auth')({ validateSearch: zodValidator(authSearchParamsSchema), - beforeLoad: async () => authGuestGuard(), + beforeLoad: async () => { + const session = await getSession(); + if (session) throw redirect({ to: '/app', replace: true }); + }, component: RouteComponent, }); From 278b014fe06359b5fbf690ee9501cfb5db36caf7 Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Mon, 13 Apr 2026 20:44:36 +0700 Subject: [PATCH 16/20] feat(analytic): add posthog wrapper for analytic capture (#60) * feat(analytic): add posthog wrapper for analytic capture * feat(analytic): add server analytic with posthog-node * feat: remove example event and property * refactor(analytic): simplify capture API with conditional property types --- src/lib/analytic/events.ts | 19 ++++++++++ src/lib/analytic/index.ts | 65 ++++++++++++++++++++++++++++++++++ src/lib/analytic/properties.ts | 26 ++++++++++++++ src/lib/analytic/types.ts | 19 ++++++++++ 4 files changed, 129 insertions(+) create mode 100644 src/lib/analytic/events.ts create mode 100644 src/lib/analytic/index.ts create mode 100644 src/lib/analytic/properties.ts create mode 100644 src/lib/analytic/types.ts diff --git a/src/lib/analytic/events.ts b/src/lib/analytic/events.ts new file mode 100644 index 0000000..ec5643b --- /dev/null +++ b/src/lib/analytic/events.ts @@ -0,0 +1,19 @@ +/** + * Analytics events + * + * Uses the `category:object_action` naming convention to ensure consistent and descriptive event naming. + * - **category**: The context or domain where the event occurred (e.g., `auth`, `account_settings`, `signup_flow`) + * - **object**: The component, feature, or location involved (e.g., `signup_button`, `pricing_page`) + * - **action**: The user action or system event that occurred (e.g., `click`, `submit`, `view`, `cancel`) + * + * @examples + * - `account_settings:forgot_password_button_click` + * - `signup_flow:pricing_page_view` + * - `registration:sign_up_button_click` + * - `registration_v2:sign_up_button_click` - version your events + * + * @see {@link https://posthog.com/docs/product-analytics/best-practices#2-implement-a-naming-convention} + */ +export enum AnalyticEvent { + EVENT = 'category:object_action' /** Example */, +} diff --git a/src/lib/analytic/index.ts b/src/lib/analytic/index.ts new file mode 100644 index 0000000..d86f4fd --- /dev/null +++ b/src/lib/analytic/index.ts @@ -0,0 +1,65 @@ +import { usePostHog } from '@posthog/react'; +import type { CaptureOptions } from 'posthog-js'; +import type { EventMessage } from 'posthog-node'; +import * as React from 'react'; + +import { type AnalyticEvent } from '~/lib/analytic/events'; +import type { AnalyticCaptureEventProps } from '~/lib/analytic/types'; +import { createPosthogClient } from '~/lib/posthog/server'; + +/** + * Hook for capturing analytics events using PostHog. + * + * Provides a typed interface for tracking analytics events with associated properties. + * This hook wraps the PostHog client to ensure type-safe event capturing. + */ +export function useAnalytic() { + const posthog = usePostHog(); + + return React.useRef({ + capture({ + event, + properties, + ...options + }: AnalyticCaptureEventProps) { + return posthog.capture(event, properties, options); + }, + }).current; +} + +/** + * Creates a server-side analytics client using PostHog. + * + * This function initializes a PostHog client for server-side analytics tracking, + * providing a type-safe interface for capturing analytics events immediately. + * Useful for tracking events that occur during server-side operations. + */ +export function createAnalyticClient() { + const posthog = createPosthogClient(); + + /** Capture an event immediately (synchronously) */ + function captureImmediate({ + event, + properties, + ...props + }: AnalyticCaptureEventProps< + TEvent, + Omit + >) { + return posthog.captureImmediate({ event, properties, ...props }); + } + + /** Capture an event manually (asynchronously) */ + function capture({ + event, + properties, + ...props + }: AnalyticCaptureEventProps< + TEvent, + Omit + >) { + return posthog.capture({ event, properties, ...props }); + } + + return { capture, captureImmediate }; +} diff --git a/src/lib/analytic/properties.ts b/src/lib/analytic/properties.ts new file mode 100644 index 0000000..332a818 --- /dev/null +++ b/src/lib/analytic/properties.ts @@ -0,0 +1,26 @@ +import type { AnalyticEvent } from '~/lib/analytic/events'; + +/** + * Analytics properties - contextual data attached to events + * + * Uses naming conventions to ensure consistent and descriptive property naming. + * - **object_adjective pattern**: Use descriptive property names (e.g., `user_id`, `item_price`, `member_count`) + * - **boolean prefixes**: Use `is_` or `has_` for boolean properties (e.g., `is_subscribed`, `has_seen_upsell`) + * - **temporal suffixes**: For dates/timestamps, include `_date` or `_timestamp` (e.g., `user_creation_date`, `last_login_timestamp`) + * + * @examples + * - `user_id` + * - `item_price` + * - `member_count` + * - `is_subscribed` + * - `has_seen_upsell` + * - `last_login_timestamp` + * - `user_creation_date` + * + * @see {@link https://posthog.com/docs/product-analytics/best-practices#2-implement-a-naming-convention} + */ +export interface AnalyticProperty { + [AnalyticEvent.EVENT]: { + event_id: string; + } /** Example */; +} diff --git a/src/lib/analytic/types.ts b/src/lib/analytic/types.ts new file mode 100644 index 0000000..61a8475 --- /dev/null +++ b/src/lib/analytic/types.ts @@ -0,0 +1,19 @@ +import type { AnalyticEvent } from '~/lib/analytic/events'; +import type { AnalyticProperty } from '~/lib/analytic/properties'; + +/** + * Props for capturing an analytics event. + * + * Conditionally requires `properties` based on whether the event has a + * corresponding entry in `AnalyticProperty`. If the event is mapped, `properties` + * is required and typed accordingly; otherwise `properties` is not allowed. + * + * @template TEvent - The analytic event type being captured. + * @template TOthers - Additional options to merge into the props (e.g. PostHog `CaptureOptions`). + */ +export type AnalyticCaptureEventProps< + TEvent extends AnalyticEvent, + TOthers extends {} = {}, +> = TEvent extends keyof AnalyticProperty + ? { event: TEvent; properties: AnalyticProperty[TEvent] } & TOthers + : { event: TEvent; properties?: undefined } & TOthers; From afeea953b02956837675837060172a9d0debc649 Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Mon, 13 Apr 2026 20:52:09 +0700 Subject: [PATCH 17/20] chore(pnpm): move npmrc config into pnpm workspace (#95) --- .npmrc | 1 - pnpm-workspace.yaml | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) delete mode 100644 .npmrc diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 3e775ef..0000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -auto-install-peers=true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 7c828dc..3120b35 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,7 @@ +autoInstallPeers: true +engineStrict: true +nodeLinker: 'isolated' +strictPeerDependencies: false onlyBuiltDependencies: - esbuild - sharp From 4d3f80ba9f4d479f8f923a0236bef639e44a356b Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Sun, 19 Apr 2026 18:47:51 +0700 Subject: [PATCH 18/20] build(posthog): only generate and upload sourcemap when enabled (#97) --- .env.example | 4 ++-- src/lib/env/client.ts | 2 ++ src/lib/env/server.ts | 5 +++++ src/lib/posthog/plugin.ts | 38 -------------------------------------- vite.config.ts | 28 +++++++++++++++++----------- 5 files changed, 26 insertions(+), 51 deletions(-) delete mode 100644 src/lib/posthog/plugin.ts diff --git a/.env.example b/.env.example index 2ad106a..93c5d07 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -# Debug +# Devtools VITE_DEVTOOLS_ENABLED= # Alchemy (required when using alchemy) @@ -33,7 +33,7 @@ VITE_PUBLIC_POSTHOG_KEY=<***> VITE_PUBLIC_POSTHOG_DEBUG= VITE_PUBLIC_POSTHOG_ENABLED= -# Observability - Posthog sourcemap upload (CI only) +# Observability - Posthog sourcemap upload # See https://app.posthog.com/settings/project#variables POSTHOG_CLI_HOST= POSTHOG_CLI_PROJECT_ID=<***> diff --git a/src/lib/env/client.ts b/src/lib/env/client.ts index c5387f4..b5d9e9a 100644 --- a/src/lib/env/client.ts +++ b/src/lib/env/client.ts @@ -7,6 +7,8 @@ import { coerceBoolean } from './utils'; export const clientEnv = createEnv({ clientPrefix: 'VITE_', client: { + // Devtools + VITE_DEVTOOLS_ENABLED: coerceBoolean().default(false), // Application VITE_PUBLIC_BASE_URL: z.url(), // PostHog diff --git a/src/lib/env/server.ts b/src/lib/env/server.ts index 92e9dc1..299daff 100644 --- a/src/lib/env/server.ts +++ b/src/lib/env/server.ts @@ -4,11 +4,16 @@ import * as z from 'zod/v4'; /** Env schema for server bundle */ export const serverEnv = createEnv({ server: { + // Auth AUTH_SECRET: z.string(), AUTH_GITHUB_CLIENT_ID: z.string(), AUTH_GITHUB_CLIENT_SECRET: z.string(), AUTH_GOOGLE_CLIENT_ID: z.string(), AUTH_GOOGLE_CLIENT_SECRET: z.string(), + // Posthog CLI (for posthog vite plugin upload sourcemap) + POSTHOG_CLI_HOST: z.url(), + POSTHOG_CLI_PROJECT_ID: z.string(), + POSTHOG_CLI_TOKEN: z.string(), }, runtimeEnv: process.env, emptyStringAsUndefined: true, diff --git a/src/lib/posthog/plugin.ts b/src/lib/posthog/plugin.ts deleted file mode 100644 index 9fdc174..0000000 --- a/src/lib/posthog/plugin.ts +++ /dev/null @@ -1,38 +0,0 @@ -import posthogVitePlugin, { - type PostHogRollupPluginOptions, -} from '@posthog/rollup-plugin'; - -/** - * Create a PostHog Vite/Rollup plugin instance only when the required - * PostHog configuration is present. - * - * This wrapper is useful when you want sourcemap upload + injection in some - * environments (e.g. production CI) but want to avoid running the plugin in - * others (e.g. local dev, preview builds). - * - * If any required option is missing, this function returns `undefined` so it - * can be conditionally included in your Vite/Rollup plugins array without - * additional branching. - * - * When enabled, the underlying PostHog plugin will: - * - inject sourcemap references - * - upload sourcemaps - * - delete sourcemaps after upload (as configured) - */ -export function posthog(options: Partial) { - if (!options.personalApiKey || !options.projectId || !options.host) { - return undefined; - } - - return posthogVitePlugin({ - host: options.host, - projectId: options.projectId, - personalApiKey: options.personalApiKey, - ...options, - sourcemaps: { - enabled: true, - deleteAfterUpload: true, - ...options.sourcemaps, - }, - }); -} diff --git a/vite.config.ts b/vite.config.ts index 68936a3..908fd8a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,4 +1,5 @@ import { paraglideVitePlugin as paraglide } from '@inlang/paraglide-js'; +import posthogVitePlugin from '@posthog/rollup-plugin'; import babel from '@rolldown/plugin-babel'; import tailwindcss from '@tailwindcss/vite'; import { devtools as tanstackDevtools } from '@tanstack/devtools-vite'; @@ -7,8 +8,6 @@ import viteReact, { reactCompilerPreset } from '@vitejs/plugin-react'; import alchemy from 'alchemy/cloudflare/tanstack-start'; import { defineConfig, loadEnv, type ConfigEnv } from 'vite'; -import { posthog } from './src/lib/posthog/plugin'; - export default async function viteConfig({ mode }: ConfigEnv) { /** * Environment Variables aren't loaded automatically @@ -16,8 +15,8 @@ export default async function viteConfig({ mode }: ConfigEnv) { */ Object.assign(process.env, loadEnv(mode, process.cwd(), '')); /** Validate env's schema on build */ - await import('./src/lib/env/server'); - await import('./src/lib/env/client'); + const { serverEnv } = await import('./src/lib/env/server'); + const { clientEnv } = await import('./src/lib/env/client'); return defineConfig({ server: { port: 3000 }, @@ -26,13 +25,12 @@ export default async function viteConfig({ mode }: ConfigEnv) { tsconfigPaths: true, }, devtools: { - enabled: process.env.VITE_DEVTOOLS_ENABLED === 'true', + enabled: clientEnv.VITE_DEVTOOLS_ENABLED, }, build: { target: 'esnext', minify: true, cssMinify: true, - sourcemap: true, rolldownOptions: { external: ['node:async_hooks', 'cloudflare:workers'], output: { @@ -85,11 +83,19 @@ export default async function viteConfig({ mode }: ConfigEnv) { }, ], }), - posthog({ - host: process.env.POSTHOG_CLI_HOST, - projectId: process.env.POSTHOG_CLI_PROJECT_ID, - personalApiKey: process.env.POSTHOG_CLI_TOKEN, - }), + clientEnv.VITE_PUBLIC_POSTHOG_ENABLED + ? [ + posthogVitePlugin({ + host: serverEnv.POSTHOG_CLI_HOST, + projectId: serverEnv.POSTHOG_CLI_PROJECT_ID, + personalApiKey: serverEnv.POSTHOG_CLI_TOKEN, + sourcemaps: { + enabled: true, + deleteAfterUpload: true, + }, + }), + ] + : [], ], }); } From 6e5cabdf1cc2e4286a01610ee3b678aa5ba3393e Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Sun, 19 Apr 2026 18:48:12 +0700 Subject: [PATCH 19/20] feat(cache): add cache control middleware lib (#96) * feat(cache): add cache control middleware lib * docs(cache): add jsdoc for request headers const * docs(cache): remove invalid docs --- src/lib/cache/headers.ts | 57 ++++++++++ src/lib/cache/middleware.ts | 70 +++++++++++++ src/lib/cache/presets.ts | 201 ++++++++++++++++++++++++++++++++++++ src/lib/cache/types.ts | 37 +++++++ 4 files changed, 365 insertions(+) create mode 100644 src/lib/cache/headers.ts create mode 100644 src/lib/cache/middleware.ts create mode 100644 src/lib/cache/presets.ts create mode 100644 src/lib/cache/types.ts diff --git a/src/lib/cache/headers.ts b/src/lib/cache/headers.ts new file mode 100644 index 0000000..f164d63 --- /dev/null +++ b/src/lib/cache/headers.ts @@ -0,0 +1,57 @@ +import type { CacheControlDirectives } from '~/lib/cache/types'; + +/** Standard Cache-Control header name */ +export const CACHE_CONTROL_HEADER = 'Cache-Control'; +/** Cloudflare CDN-specific cache control header */ +export const CF_CACHE_CONTROL_HEADER = 'CDN-Cache-Control'; + +/** + * Serializes a {@link CacheControlDirectives} object into a `Cache-Control` header value string. + * + * Directives are only included when explicitly set — `undefined` fields are omitted. + * Returns `undefined` when no directives are provided or all fields are `undefined`, + * so callers can skip setting the header entirely. + * + * @param options - Cache-Control directives to serialize. + * @returns A comma-separated directive string (e.g. `"public, max-age=3600"`), + * or `undefined` if there is nothing to serialize. + * + * @example + * buildCacheControlHeader({ scope: 'public', maxAge: 3600, staleWhileRevalidate: 60 }); + * // => "public, max-age=3600, stale-while-revalidate=60" + * + * buildCacheControlHeader(undefined); + * // => undefined + */ +export function buildCacheControlHeader( + options?: CacheControlDirectives, +): string | undefined { + if (!options) return undefined; + const directives: string[] = []; + + if (options.scope) { + directives.push(options.scope); + } + + if (options.maxAge !== undefined) { + directives.push(`max-age=${options.maxAge}`); + } + + if (options.sMaxAge !== undefined) { + directives.push(`s-maxage=${options.sMaxAge}`); + } + + if (options.staleWhileRevalidate !== undefined) { + directives.push(`stale-while-revalidate=${options.staleWhileRevalidate}`); + } + + if (options.immutable) { + directives.push('immutable'); + } + + if (directives.length === 0) { + return undefined; + } + + return directives.join(', '); +} diff --git a/src/lib/cache/middleware.ts b/src/lib/cache/middleware.ts new file mode 100644 index 0000000..2b98117 --- /dev/null +++ b/src/lib/cache/middleware.ts @@ -0,0 +1,70 @@ +/** + * Middleware utilities for setting cache headers on requests and functions. + * + * Provides two middleware creators: + * - cacheRequestMiddleware: for request-level caching + * - cacheFunctionMiddleware: for function-level caching (GET only) + */ +import { createMiddleware } from '@tanstack/react-start'; +import { setResponseHeader } from '@tanstack/react-start/server'; + +import { + buildCacheControlHeader, + CACHE_CONTROL_HEADER, + CF_CACHE_CONTROL_HEADER, +} from '~/lib/cache/headers'; +import type { CacheOptions } from '~/lib/cache/types'; + +/** + * Creates a request middleware that sets cache headers on the response. + * + * @param options - Cache options to control the Cache-Control and CF-Cache-Control headers. + * @returns Middleware that sets cache headers for each request. + */ +export function cacheRequestMiddleware(options: CacheOptions) { + return createMiddleware({ type: 'request' }).server(async ({ next }) => { + const result = await next(); + + // Set standard Cache-Control header + const cacheControl = buildCacheControlHeader(options); + if (cacheControl) { + result.response.headers.set(CACHE_CONTROL_HEADER, cacheControl); + } + + // Set Cloudflare-specific cache header if options.cloudflare is provided + const cfCacheControl = buildCacheControlHeader(options.cloudflare); + if (cfCacheControl) { + result.response.headers.set(CF_CACHE_CONTROL_HEADER, cfCacheControl); + } + + return result; + }); +} + +/** + * Creates a function middleware that sets cache headers for GET requests only. + * + * @param options - Cache options to control the Cache-Control and CF-Cache-Control headers. + * @returns Middleware that sets cache headers for GET function calls. + */ +export function cacheFunctionMiddleware(options: CacheOptions) { + return createMiddleware({ type: 'function' }).server( + async ({ next, method }) => { + if (method !== 'GET') return next(); + const result = await next(); + + // Set standard Cache-Control header + const cacheControl = buildCacheControlHeader(options); + if (cacheControl) { + setResponseHeader(CACHE_CONTROL_HEADER, cacheControl); + } + + // Set Cloudflare-specific cache header if options.cloudflare is provided + const cfCacheControl = buildCacheControlHeader(options.cloudflare); + if (cfCacheControl) { + setResponseHeader(CF_CACHE_CONTROL_HEADER, cfCacheControl); + } + return result; + }, + ); +} diff --git a/src/lib/cache/presets.ts b/src/lib/cache/presets.ts new file mode 100644 index 0000000..9a163b6 --- /dev/null +++ b/src/lib/cache/presets.ts @@ -0,0 +1,201 @@ +import type { CacheOptions } from '~/lib/cache/types'; + +export class CachePreset { + /** + * Prevents the response from being stored in any cache — browser or CDN. + * + * **When to use:** Responses that contain sensitive or user-specific data that + * must never be persisted anywhere (e.g. authentication tokens, payment info, + * one-time secrets, or any endpoint whose caching would constitute a security + * risk). + * + * **Why:** `no-store` is the strongest prohibition. Unlike `no-cache` (which + * still allows conditional storage), `no-store` instructs every intermediary + * to discard the response immediately after delivery. No `cloudflare` override + * is set because CDN-level storage of these responses is always wrong. + * + * @example + * CachePreset.noStore() + * // Cache-Control: no-store + */ + static noStore(): CacheOptions { + return { scope: 'no-store' }; + } + + /** + * Allows caching but requires every cache to revalidate with the origin before + * serving a stored response. + * + * **When to use:** Real-time or near-real-time data where the browser may still + * benefit from conditional requests (304 Not Modified), but serving a stale + * copy silently is not acceptable (e.g. dashboard summaries, live pricing, + * inventory levels). + * + * **Why:** `no-cache` does not mean "do not cache" — it means "always check + * freshness". Browsers can still store the response and avoid re-downloading + * the body when the origin returns 304, saving bandwidth while guaranteeing + * up-to-date content. No `cloudflare` override is set; CDN revalidation on + * every request negates the benefit of a CDN. + * + * @example + * CachePreset.noCache() + * // Cache-Control: no-cache + */ + static noCache(): CacheOptions { + return { scope: 'no-cache' }; + } + + /** + * Allows the browser to cache the response but prohibits shared/CDN caches + * from storing it. + * + * **When to use:** Authenticated pages or API responses that are personal to + * the logged-in user (e.g. profile pages, account settings, personalized feeds) + * where browser caching speeds up navigation but CDN caching would serve one + * user's data to another. + * + * **Why:** `private` restricts storage to the user's own browser cache. + * `max-age=300` (5 min) lets the browser reuse the response across quick + * navigation. `stale-while-revalidate=60` allows an immediate render of the + * stale copy while a fresh fetch runs in the background, keeping the UX snappy + * without sacrificing freshness. No `cloudflare` key is set deliberately — + * Cloudflare must not store private responses. + * + * @example + * CachePreset.private() + * // Cache-Control: private, max-age=300, stale-while-revalidate=60 + */ + static private(): CacheOptions { + return { + scope: 'private', + maxAge: 300, + staleWhileRevalidate: 60, + }; + } + + /** + * Short browser freshness with a longer CDN TTL for frequently updated public + * content. + * + * **When to use:** Public content that changes often but not on every request + * (e.g. activity feeds, comment counts, leaderboards, live event listings). + * You want CDN to absorb traffic spikes while keeping displayed data reasonably + * fresh. + * + * **Why:** Browsers get a 60 s window (`max-age=60`) before considering the + * response stale, with a 30 s revalidation grace (`stale-while-revalidate=30`) + * for seamless background refreshes. Cloudflare's `s-maxage=300` lets the CDN + * serve the same edge-cached copy for 5 min, absorbing origin load during + * spikes, while a 60 s SWR grace on the CDN side means edge nodes revalidate + * silently without interrupting users. + * + * @example + * CachePreset.shortLived() + * // Cache-Control: public, max-age=60, stale-while-revalidate=30 + * // CDN-Cache-Control: s-maxage=300, stale-while-revalidate=60 + */ + static shortLived(): CacheOptions { + return { + scope: 'public', + maxAge: 60, + staleWhileRevalidate: 30, + cloudflare: { + sMaxAge: 300, + staleWhileRevalidate: 60, + }, + }; + } + + /** + * Standard public caching policy for typical marketing and informational pages. + * + * **When to use:** Public pages whose content changes infrequently throughout + * the day (e.g. landing pages, feature pages, pricing, about pages). A good + * default for any server-rendered page that does not contain personalized data. + * + * **Why:** Browsers treat responses as fresh for 5 min (`max-age=300`), with a + * 60 s SWR window for background revalidation so users never see a loading + * state between navigation. Cloudflare caches for 1 hour (`s-maxage=3600`) + * with a 5 min SWR grace, dramatically reducing origin hits from repeated + * visitors and crawlers while still picking up deploys within minutes. + * + * @example + * CachePreset.standard() + * // Cache-Control: public, max-age=300, stale-while-revalidate=60 + * // CDN-Cache-Control: s-maxage=3600, stale-while-revalidate=300 + */ + static standard(): CacheOptions { + return { + scope: 'public', + maxAge: 300, + staleWhileRevalidate: 60, + cloudflare: { + sMaxAge: 3_600, + staleWhileRevalidate: 300, + }, + }; + } + + /** + * Long browser and CDN TTLs for rarely changing public content. + * + * **When to use:** Content that is updated on the order of days or weeks (e.g. + * blog posts, documentation pages, changelogs, help articles). Suitable when + * you can tolerate up to an hour of stale content in browsers and up to a week + * in CDN after a publish. + * + * **Why:** A 24 h browser TTL (`max-age=86400`) eliminates redundant requests + * for returning visitors in the same day, with a 1 h SWR grace to handle the + * transition silently. Cloudflare stores for 7 days (`s-maxage=604800`), + * keeping origin load near zero for stable content, while a 1 day SWR on the + * CDN ensures deploys propagate gradually without a hard cache break. + * + * @example + * CachePreset.longLived() + * // Cache-Control: public, max-age=86400, stale-while-revalidate=3600 + * // CDN-Cache-Control: s-maxage=604800, stale-while-revalidate=86400 + */ + static longLived(): CacheOptions { + return { + scope: 'public', + maxAge: 86_400, + staleWhileRevalidate: 3_600, + cloudflare: { + sMaxAge: 604_800, + staleWhileRevalidate: 86_400, + }, + }; + } + + /** + * Permanent caching for content-hashed static assets. + * + * **When to use:** Any asset whose URL includes a content hash or build + * fingerprint, guaranteeing the URL changes whenever the content changes + * (e.g. bundled JS/CSS files like `main.abc123.js`, versioned fonts, hashed + * images). Never use this for URLs that can serve different content over time. + * + * **Why:** `max-age=31536000` (1 year) is the de-facto browser maximum for + * permanent caching. The `immutable` directive tells the browser the file will + * never change during its freshness lifetime, suppressing conditional + * revalidation requests on back/forward navigation. Cloudflare mirrors the same + * policy at the edge. Because the URL itself changes on every build, cache + * busting is handled automatically — no manual purge is needed. + * + * @example + * CachePreset.immutable() + * // Cache-Control: public, max-age=31536000, immutable + * // CDN-Cache-Control: s-maxage=31536000, immutable + */ + static immutable(): CacheOptions { + return { + scope: 'public', + maxAge: 31_536_000, + immutable: true, + cloudflare: { + sMaxAge: 31_536_000, + immutable: true, + }, + }; + } +} diff --git a/src/lib/cache/types.ts b/src/lib/cache/types.ts new file mode 100644 index 0000000..21a122b --- /dev/null +++ b/src/lib/cache/types.ts @@ -0,0 +1,37 @@ +/** + * Visibility and freshness scope for the `Cache-Control` header. + * + * - `public` — Response may be stored by any cache (browser, CDN, proxy). + * - `private` — Response is intended for a single user and must not be stored by shared caches. + * - `no-cache` — Cache must revalidate with the origin before serving a stored response. + * - `no-store` — Response must not be stored in any cache at all. + */ +export type CacheScope = 'public' | 'private' | 'no-cache' | 'no-store'; + +/** + * Structured representation of `Cache-Control` HTTP header directives. + */ +export interface CacheControlDirectives { + /** Visibility and freshness scope (e.g. `public`, `private`, `no-cache`, `no-store`). */ + scope?: CacheScope; + /** Maximum time in seconds a response is considered fresh by the browser (`max-age`). */ + maxAge?: number; + /** Maximum time in seconds a response is considered fresh by shared/CDN caches (`s-maxage`). */ + sMaxAge?: number; + /** Seconds a stale response may be served while a revalidation happens in the background (`stale-while-revalidate`). */ + staleWhileRevalidate?: number; + /** When `true`, adds the `immutable` directive — signals the response will never change during its freshness lifetime. */ + immutable?: boolean; +} + +/** + * Cache configuration + * + * Extends {@link CacheControlDirectives} with an optional `cloudflare` override + * that is written to the `CDN-Cache-Control` header, allowing independent + * cache policies for Cloudflare and the browser. + */ +export interface CacheOptions extends CacheControlDirectives { + /** Directives written to the `CDN-Cache-Control` header for Cloudflare-specific caching rules. */ + cloudflare?: CacheControlDirectives; +} From 8b4e270bb6e0a23c4097146a78491e4866962410 Mon Sep 17 00:00:00 2001 From: Edwin Tantawi Date: Sun, 19 Apr 2026 19:20:06 +0700 Subject: [PATCH 20/20] fix(posthog): cli env only used at build time (#98) --- src/lib/env/posthog-cli.ts | 13 +++++++++++++ src/lib/env/server.ts | 4 ---- vite.config.ts | 9 +++++---- 3 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 src/lib/env/posthog-cli.ts diff --git a/src/lib/env/posthog-cli.ts b/src/lib/env/posthog-cli.ts new file mode 100644 index 0000000..9c03350 --- /dev/null +++ b/src/lib/env/posthog-cli.ts @@ -0,0 +1,13 @@ +import { createEnv } from '@t3-oss/env-core'; +import * as z from 'zod/v4'; + +/** Env schema for posthog cli */ +export const posthogCliEnv = createEnv({ + server: { + POSTHOG_CLI_HOST: z.url(), + POSTHOG_CLI_PROJECT_ID: z.string(), + POSTHOG_CLI_TOKEN: z.string(), + }, + runtimeEnv: process.env, + emptyStringAsUndefined: true, +}); diff --git a/src/lib/env/server.ts b/src/lib/env/server.ts index 299daff..1b912da 100644 --- a/src/lib/env/server.ts +++ b/src/lib/env/server.ts @@ -10,10 +10,6 @@ export const serverEnv = createEnv({ AUTH_GITHUB_CLIENT_SECRET: z.string(), AUTH_GOOGLE_CLIENT_ID: z.string(), AUTH_GOOGLE_CLIENT_SECRET: z.string(), - // Posthog CLI (for posthog vite plugin upload sourcemap) - POSTHOG_CLI_HOST: z.url(), - POSTHOG_CLI_PROJECT_ID: z.string(), - POSTHOG_CLI_TOKEN: z.string(), }, runtimeEnv: process.env, emptyStringAsUndefined: true, diff --git a/vite.config.ts b/vite.config.ts index 908fd8a..9038a5c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -15,8 +15,9 @@ export default async function viteConfig({ mode }: ConfigEnv) { */ Object.assign(process.env, loadEnv(mode, process.cwd(), '')); /** Validate env's schema on build */ - const { serverEnv } = await import('./src/lib/env/server'); + await import('./src/lib/env/server'); const { clientEnv } = await import('./src/lib/env/client'); + const { posthogCliEnv } = await import('./src/lib/env/posthog-cli'); return defineConfig({ server: { port: 3000 }, @@ -86,9 +87,9 @@ export default async function viteConfig({ mode }: ConfigEnv) { clientEnv.VITE_PUBLIC_POSTHOG_ENABLED ? [ posthogVitePlugin({ - host: serverEnv.POSTHOG_CLI_HOST, - projectId: serverEnv.POSTHOG_CLI_PROJECT_ID, - personalApiKey: serverEnv.POSTHOG_CLI_TOKEN, + host: posthogCliEnv.POSTHOG_CLI_HOST, + projectId: posthogCliEnv.POSTHOG_CLI_PROJECT_ID, + personalApiKey: posthogCliEnv.POSTHOG_CLI_TOKEN, sourcemaps: { enabled: true, deleteAfterUpload: true,