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/.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 }} 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/.npmrc b/.npmrc deleted file mode 100644 index 3e775ef..0000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -auto-install-peers=true diff --git a/.oxfmtrc.json b/.oxfmtrc.json deleted file mode 100644 index 8c46383..0000000 --- a/.oxfmtrc.json +++ /dev/null @@ -1,46 +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", - "experimentalSortPackageJson": true, - "experimentalSortImports": { - "order": "asc", - "internalPattern": ["~/"], - "groups": [ - ["side_effect"], - ["builtin"], - ["external"], - ["internal"], - ["parent", "sibling", "index"], - ["style"] - ] - }, - "experimentalTailwindcss": { - "stylesheet": "./src/ui/styles/app.css", - "attributes": ["class", "className", "classNames"], - "functions": ["clsx", "twMerge", "cn", "cva"], - "preserveDuplicates": false, - "preserveWhitespace": false - } -} diff --git a/.oxlintrc.json b/.oxlintrc.json deleted file mode 100644 index 20be329..0000000 --- a/.oxlintrc.json +++ /dev/null @@ -1,112 +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 - }, - "categories": { - "correctness": "error", - "suspicious": "error" - }, - "plugins": [ - "oxc", - "eslint", - "unicorn", - "typescript", - "promise", - "react", - "jsx-a11y", - "react-perf", - "import" - ], - "rules": { - // Correctness - "react/no-children-prop": ["off"], - - // 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/no-cycle": ["error", { "maxDepth": 3 }], - - // Suspicious - "eslint/no-unneeded-ternary": "off", - "eslint/no-shadow": "off", - "react/react-in-jsx-scope": "off", - "import/no-unassigned-import": "off", - - // 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", - - // 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" }], - "react/self-closing-comp": "warn", - "import/no-duplicates": "error", - "eslint/func-style": ["error", "declaration"] - }, - "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/.vscode/settings.json b/.vscode/settings.json index 844b21b..db73229 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -20,15 +20,15 @@ "**/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, - "oxc.fmt.configPath": ".oxfmtrc.json", + "oxc.fmt.configPath": "oxfmt.config.ts", // Extension - Tailwind CSS "tailwindCSS.classAttributes": ["class", "className", "classNames"], 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/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/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 deleted file mode 100644 index 0cd3400..0000000 --- a/lint-staged.config.js +++ /dev/null @@ -1,42 +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(' ')}`; -} - -// Type check with TypeScript -function buildTypeCheckCommand() { - return 'tsc --noEmit'; -} - -/** - * 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 [buildTypeCheckCommand(), 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..1fcbce6 --- /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/entry.server.ts'], + plugins: ['import'], + rules: { + 'import/no-default-export': 'off', + 'import/prefer-default-export': 'error', + }, + }, + ], +}); diff --git a/package.json b/package.json index c9e5b13..9be9406 100644 --- a/package.json +++ b/package.json @@ -32,11 +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:ts": "tsc --noEmit", - "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", @@ -86,8 +85,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,22 +107,23 @@ "@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", "drizzle-kit": "^0.31.10", "husky": "^9.1.7", "lint-staged": "^16.4.0", - "oxfmt": "^0.41.0", - "oxlint": "^1.56.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", "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 b3e0f3d..249caab 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.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) @@ -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.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.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.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.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.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.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(0b01dc45a13b6e9cf78d5c2991b2aa38) + version: 1.5.6(31cbc98915db2d1b55eeab35e5a9d8b9) 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.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) @@ -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.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 @@ -214,11 +217,14 @@ importers: specifier: ^16.4.0 version: 16.4.0 oxfmt: - specifier: ^0.41.0 - version: 0.41.0 + specifier: ^0.44.0 + version: 0.44.0 oxlint: - specifier: ^1.56.0 - version: 1.56.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) @@ -238,8 +244,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 +265,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 +321,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 +356,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 +365,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 +573,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 +585,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 +597,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 +609,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 +621,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 +633,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 +759,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==} @@ -2034,246 +2043,276 @@ 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.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.41.0': - resolution: {integrity: sha512-s0b1dxNgb2KomspFV2LfogC2XtSJB42POXF4bMCLJyvQmAGos4ZtjGPfQreToQEaY0FQFjz3030ggI36rF1q5g==} + '@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.41.0': - resolution: {integrity: sha512-EGXGualADbv/ZmamE7/2DbsrYmjoPlAmHEpTL4vapLF4EfVD6fr8/uQDFnPJkUBjiSWFJZtFNsGeN1B6V3owmA==} + '@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.41.0': - resolution: {integrity: sha512-WxySJEvdQQYMmyvISH3qDpTvoS0ebnIP63IMxLLWowJyPp/AAH0hdWtlo+iGNK5y3eVfa5jZguwNaQkDKWpGSw==} + '@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.41.0': - resolution: {integrity: sha512-Y2kzMkv3U3oyuYaR4wTfGjOTYTXiFC/hXmG0yVASKkbh02BJkvD98Ij8bIevr45hNZ0DmZEgqiXF+9buD4yMYQ==} + '@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.41.0': - resolution: {integrity: sha512-ptazDjdUyhket01IjPTT6ULS1KFuBfTUU97osTP96X5y/0oso+AgAaJzuH81oP0+XXyrWIHbRzozSAuQm4p48g==} + '@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.41.0': - resolution: {integrity: sha512-UkoL2OKxFD+56bPEBcdGn+4juTW4HRv/T6w1dIDLnvKKWr6DbarB/mtHXlADKlFiJubJz8pRkttOR7qjYR6lTA==} + '@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.41.0': - resolution: {integrity: sha512-gofu0PuumSOHYczD8p62CPY4UF6ee+rSLZJdUXkpwxg6pILiwSDBIouPskjF/5nF3A7QZTz2O9KFNkNxxFN9tA==} + '@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.41.0': - resolution: {integrity: sha512-VfVZxL0+6RU86T8F8vKiDBa+iHsr8PAjQmKGBzSCAX70b6x+UOMFl+2dNihmKmUwqkCazCPfYjt6SuAPOeQJ3g==} + '@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.41.0': - resolution: {integrity: sha512-bwzokz2eGvdfJbc0i+zXMJ4BBjQPqg13jyWpEEZDOrBCQ91r8KeY2Mi2kUeuMTZNFXju+jcAbAbpyJxRGla0eg==} + '@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.41.0': - resolution: {integrity: sha512-POLM//PCH9uqDeNDwWL3b3DkMmI3oI2cU6hwc2lnztD1o7dzrQs3R9nq555BZ6wI7t2lyhT9CS+CRaz5X0XqLA==} + '@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.41.0': - resolution: {integrity: sha512-NNK7PzhFqLUwx/G12Xtm6scGv7UITvyGdAR5Y+TlqsG+essnuRWR4jRNODWRjzLZod0T3SayRbnkSIWMBov33w==} + '@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.41.0': - resolution: {integrity: sha512-qVf/zDC5cN9eKe4qI/O/m445er1IRl6swsSl7jHkqmOSVfknwCe5JXitYjZca+V/cNJSU/xPlC5EFMabMMFDpw==} + '@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.41.0': - resolution: {integrity: sha512-ojxYWu7vUb6ysYqVCPHuAPVZHAI40gfZ0PDtZAMwVmh2f0V8ExpPIKoAKr7/8sNbAXJBBpZhs2coypIo2jJX4w==} + '@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.41.0': - resolution: {integrity: sha512-O2exZLBxoCMIv2vlvcbkdedazJPTdG0VSup+0QUCfYQtx751zCZNboX2ZUOiQ/gDTdhtXvSiot0h6GEGkOyalA==} + '@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.41.0': - resolution: {integrity: sha512-N+31/VoL+z+NNBt8viy3I4NaIdPbiYeOnB884LKqvXldaE2dRztdPv3q5ipfZYv0RwFp7JfqS4I27K/DSHCakg==} + '@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.41.0': - resolution: {integrity: sha512-Z7NAtu/RN8kjCQ1y5oDD0nTAeRswh3GJ93qwcW51srmidP7XPBmZbLlwERu1W5veCevQJtPS9xmkpcDTYsGIwQ==} + '@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.41.0': - resolution: {integrity: sha512-uNxxP3l4bJ6VyzIeRqCmBU2Q0SkCFgIhvx9/9dJ9V8t/v+jP1IBsuaLwCXGR8JPHtkj4tFp+RHtUmU2ZYAUpMA==} + '@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.41.0': - resolution: {integrity: sha512-49ZSpbZ1noozyPapE8SUOSm3IN0Ze4b5nkO+4+7fq6oEYQQJFhE0saj5k/Gg4oewVPdjn0L3ZFeWk2Vehjcw7A==} + '@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.56.0': - resolution: {integrity: sha512-IyfYPthZyiSKwAv/dLjeO18SaK8MxLI9Yss2JrRDyweQAkuL3LhEy7pwIwI7uA3KQc1Vdn20kdmj3q0oUIQL6A==} + '@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.56.0': - resolution: {integrity: sha512-Ga5zYrzH6vc/VFxhn6MmyUnYEfy9vRpwTIks99mY3j6Nz30yYpIkWryI0QKPCgvGUtDSXVLEaMum5nA+WrNOSg==} + '@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.56.0': - resolution: {integrity: sha512-ogmbdJysnw/D4bDcpf1sPLpFThZ48lYp4aKYm10Z/6Nh1SON6NtnNhTNOlhEY296tDFItsZUz+2tgcSYqh8Eyw==} + '@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.56.0': - resolution: {integrity: sha512-x8QE1h+RAtQ2g+3KPsP6Fk/tdz6zJQUv5c7fTrJxXV3GHOo+Ry5p/PsogU4U+iUZg0rj6hS+E4xi+mnwwlDCWQ==} + '@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.56.0': - resolution: {integrity: sha512-6G+WMZvwJpMvY7my+/SHEjb7BTk/PFbePqLpmVmUJRIsJMy/UlyYqjpuh0RCgYYkPLcnXm1rUM04kbTk8yS1Yg==} + '@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.56.0': - resolution: {integrity: sha512-YYHBsk/sl7fYwQOok+6W5lBPeUEvisznV/HZD2IfZmF3Bns6cPC3Z0vCtSEOaAWTjYWN3jVsdu55jMxKlsdlhg==} + '@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.56.0': - resolution: {integrity: sha512-+AZK8rOUr78y8WT6XkDb04IbMRqauNV+vgT6f8ZLOH8wnpQ9i7Nol0XLxAu+Cq7Sb+J9wC0j6Km5hG8rj47/yQ==} + '@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.56.0': - resolution: {integrity: sha512-urse2SnugwJRojUkGSSeH2LPMaje5Q50yQtvtL9HFckiyeqXzoFwOAZqD5TR29R2lq7UHidfFDM9EGcchcbb8A==} + '@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.56.0': - resolution: {integrity: sha512-rkTZkBfJ4TYLjansjSzL6mgZOdN5IvUnSq3oNJSLwBcNvy3dlgQtpHPrRxrCEbbcp7oQ6If0tkNaqfOsphYZ9g==} + '@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.56.0': - resolution: {integrity: sha512-uqL1kMH3u69/e1CH2EJhP3CP28jw2ExLsku4o8RVAZ7fySo9zOyI2fy9pVlTAp4voBLVgzndXi3SgtdyCTa2aA==} + '@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.56.0': - resolution: {integrity: sha512-j0CcMBOgV6KsRaBdsebIeiy7hCjEvq2KdEsiULf2LZqAq0v1M1lWjelhCV57LxsqaIGChXFuFJ0RiFrSRHPhSg==} + '@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.56.0': - resolution: {integrity: sha512-7VDOiL8cDG3DQ/CY3yKjbV1c4YPvc4vH8qW09Vv+5ukq3l/Kcyr6XGCd5NvxUmxqDb2vjMpM+eW/4JrEEsUetA==} + '@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.56.0': - resolution: {integrity: sha512-JGRpX0M+ikD3WpwJ7vKcHKV6Kg0dT52BW2Eu2BupXotYeqGXBrbY+QPkAyKO6MNgKozyTNaRh3r7g+VWgyAQYQ==} + '@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.56.0': - resolution: {integrity: sha512-dNaICPvtmuxFP/VbqdofrLqdS3bM/AKJN3LMJD52si44ea7Be1cBk6NpfIahaysG9Uo+L98QKddU9CD5L8UHnQ==} + '@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.56.0': - resolution: {integrity: sha512-pF1vOtM+GuXmbklM1hV8WMsn6tCNPvkUzklj/Ej98JhlanbmA2RB1BILgOpwSuCTRTIYx2MXssmEyQQ90QF5aA==} + '@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.56.0': - resolution: {integrity: sha512-bp8NQ4RE6fDIFLa4bdBiOA+TAvkNkg+rslR+AvvjlLTYXLy9/uKAYLQudaQouWihLD/hgkrXIKKzXi5IXOewwg==} + '@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.56.0': - resolution: {integrity: sha512-PxT4OJDfMOQBzo3OlzFb9gkoSD+n8qSBxyVq2wQSZIHFQYGEqIRTo9M0ZStvZm5fdhMqaVYpOnJvH2hUMEDk/g==} + '@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.56.0': - resolution: {integrity: sha512-PTRy6sIEPqy2x8PTP1baBNReN/BNEFmde0L+mYeHmjXE1Vlcc9+I5nsqENsB2yAm5wLkzPoTNCMY/7AnabT4/A==} + '@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.56.0': - resolution: {integrity: sha512-ZHa0clocjLmIDr+1LwoWtxRcoYniAvERotvwKUYKhH41NVfl0Y4LNbyQkwMZzwDvKklKGvGZ5+DAG58/Ik47tQ==} + '@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] @@ -3427,8 +3466,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 +3534,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 +3570,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 +3590,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 +3622,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 +3658,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 +3678,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 +4360,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 +4618,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 +5028,12 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + 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'} @@ -5355,12 +5396,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: @@ -5809,6 +5850,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==} @@ -6054,8 +6099,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 @@ -6251,17 +6296,21 @@ packages: resolution: {integrity: sha512-zBd1G8HkewNd2A8oQ8c6BN/f/c9EId7rSUueOLGu28govmUctXmM+3765GwsByv9nYUdrLqHphXlYIc86saYsg==} engines: {node: '>=18'} - oxfmt@0.41.0: - resolution: {integrity: sha512-sKLdJZdQ3bw6x9qKiT7+eID4MNEXlDHf5ZacfIircrq6Qwjk0L6t2/JQlZZrVHTXJawK3KaMuBoJnEJPcqCEdg==} + oxfmt@0.44.0: + resolution: {integrity: sha512-lnncqvHewyRvaqdrnntVIrZV2tEddz8lbvPsQzG/zlkfvgZkwy0HP1p/2u1aCDToeg1jb9zBpbJdfkV73Itw+w==} 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-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 @@ -6315,8 +6364,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,6 +6908,11 @@ packages: engines: {node: '>=20.16.0'} hasBin: true + srvx@0.11.15: + resolution: {integrity: sha512-iXsux0UcOjdvs0LCMa2Ws3WwcDUozA3JN3BquNXkaFPP7TpRqgunKdEgoZ/uwb1J6xaYHfxtz9Twlh6yzwM6Tg==} + engines: {node: '>=20.16.0'} + hasBin: true + std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} @@ -7061,22 +7115,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==} @@ -7357,17 +7399,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 @@ -7509,69 +7551,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 @@ -7579,37 +7621,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 @@ -7619,10 +7661,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 @@ -7632,14 +7674,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 @@ -7649,20 +7691,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 @@ -7671,10 +7713,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 @@ -7683,23 +7725,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 @@ -7721,7 +7763,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 @@ -7729,61 +7771,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 @@ -7791,10 +7833,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 @@ -7827,16 +7869,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 @@ -7964,7 +8006,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.15)(nanostores@1.2.0)': dependencies: '@better-auth/utils': 0.3.1 '@better-fetch/fetch': 1.1.21 @@ -7973,49 +8015,49 @@ snapshots: '@standard-schema/spec': 1.1.0 better-call: 1.3.2(zod@4.3.6) jose: 6.2.2 - kysely: 0.28.14 + kysely: 0.28.15 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.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.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.15)(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.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.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.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.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.15)(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.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.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.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.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.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.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.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.15)(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.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.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.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.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.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.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.15)(nanostores@1.2.0) '@better-auth/utils': 0.3.1 '@better-fetch/fetch': 1.1.21 @@ -8044,25 +8086,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 @@ -8072,34 +8114,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: @@ -8261,6 +8303,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 @@ -8690,7 +8737,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': @@ -9242,118 +9289,136 @@ snapshots: '@oxc-project/types@0.122.0': {} - '@oxfmt/binding-android-arm-eabi@0.41.0': + '@oxfmt/binding-android-arm-eabi@0.44.0': optional: true - '@oxfmt/binding-android-arm64@0.41.0': + '@oxfmt/binding-android-arm64@0.44.0': optional: true - '@oxfmt/binding-darwin-arm64@0.41.0': + '@oxfmt/binding-darwin-arm64@0.44.0': optional: true - '@oxfmt/binding-darwin-x64@0.41.0': + '@oxfmt/binding-darwin-x64@0.44.0': optional: true - '@oxfmt/binding-freebsd-x64@0.41.0': + '@oxfmt/binding-freebsd-x64@0.44.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.41.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.44.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.41.0': + '@oxfmt/binding-linux-arm-musleabihf@0.44.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.41.0': + '@oxfmt/binding-linux-arm64-gnu@0.44.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.41.0': + '@oxfmt/binding-linux-arm64-musl@0.44.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.41.0': + '@oxfmt/binding-linux-ppc64-gnu@0.44.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.41.0': + '@oxfmt/binding-linux-riscv64-gnu@0.44.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.41.0': + '@oxfmt/binding-linux-riscv64-musl@0.44.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.41.0': + '@oxfmt/binding-linux-s390x-gnu@0.44.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.41.0': + '@oxfmt/binding-linux-x64-gnu@0.44.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.41.0': + '@oxfmt/binding-linux-x64-musl@0.44.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.41.0': + '@oxfmt/binding-openharmony-arm64@0.44.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.41.0': + '@oxfmt/binding-win32-arm64-msvc@0.44.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.41.0': + '@oxfmt/binding-win32-ia32-msvc@0.44.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.41.0': + '@oxfmt/binding-win32-x64-msvc@0.44.0': optional: true - '@oxlint/binding-android-arm-eabi@1.56.0': + '@oxlint-tsgolint/darwin-arm64@0.20.0': optional: true - '@oxlint/binding-android-arm64@1.56.0': + '@oxlint-tsgolint/darwin-x64@0.20.0': optional: true - '@oxlint/binding-darwin-arm64@1.56.0': + '@oxlint-tsgolint/linux-arm64@0.20.0': optional: true - '@oxlint/binding-darwin-x64@1.56.0': + '@oxlint-tsgolint/linux-x64@0.20.0': optional: true - '@oxlint/binding-freebsd-x64@1.56.0': + '@oxlint-tsgolint/win32-arm64@0.20.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.56.0': + '@oxlint-tsgolint/win32-x64@0.20.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.56.0': + '@oxlint/binding-android-arm-eabi@1.59.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.56.0': + '@oxlint/binding-android-arm64@1.59.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.56.0': + '@oxlint/binding-darwin-arm64@1.59.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.56.0': + '@oxlint/binding-darwin-x64@1.59.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.56.0': + '@oxlint/binding-freebsd-x64@1.59.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.56.0': + '@oxlint/binding-linux-arm-gnueabihf@1.59.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.56.0': + '@oxlint/binding-linux-arm-musleabihf@1.59.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.56.0': + '@oxlint/binding-linux-arm64-gnu@1.59.0': optional: true - '@oxlint/binding-linux-x64-musl@1.56.0': + '@oxlint/binding-linux-arm64-musl@1.59.0': optional: true - '@oxlint/binding-openharmony-arm64@1.56.0': + '@oxlint/binding-linux-ppc64-gnu@1.59.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.56.0': + '@oxlint/binding-linux-riscv64-gnu@1.59.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.56.0': + '@oxlint/binding-linux-riscv64-musl@1.59.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.56.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': {} @@ -10502,7 +10567,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': @@ -10542,11 +10607,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 @@ -10556,7 +10616,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 @@ -10564,7 +10624,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 @@ -10611,10 +10671,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 @@ -10622,21 +10682,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 @@ -10653,9 +10713,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 @@ -10702,14 +10761,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': @@ -10750,20 +10809,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 @@ -10782,16 +10841,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 @@ -11136,24 +11195,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.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.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.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.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.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.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.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.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.15))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.2) transitivePeerDependencies: - react-dom @@ -11185,27 +11244,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.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.12)) + '@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.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.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.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.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.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.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) @@ -11296,7 +11355,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.15))(vite@8.0.2)': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 @@ -11307,7 +11366,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.15)) cheerio: 1.2.0 exsolve: 1.0.8 pathe: 2.0.3 @@ -11328,13 +11387,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.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.12)) + h3-v2: h3@2.0.1-rc.16(crossws@0.4.1(srvx@0.11.15)) seroval: 1.5.1 transitivePeerDependencies: - crossws @@ -11697,22 +11756,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.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.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.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 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 @@ -11726,11 +11785,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: @@ -11863,31 +11922,31 @@ snapshots: before-after-hook@4.0.0: {} - better-auth@1.5.6(0b01dc45a13b6e9cf78d5c2991b2aa38): + 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.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.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.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 '@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: '@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.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.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) react: 19.2.4 @@ -11922,7 +11981,7 @@ snapshots: bowser@2.14.1: {} - brace-expansion@2.0.2: + brace-expansion@2.0.3: dependencies: balanced-match: 1.0.2 @@ -11955,7 +12014,7 @@ snapshots: dependencies: chokidar: 4.0.3 confbox: 0.2.4 - defu: 6.1.4 + defu: 6.1.7 dotenv: 16.6.1 exsolve: 1.0.8 giget: 2.0.0 @@ -12032,7 +12091,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: @@ -12250,9 +12309,9 @@ snapshots: dependencies: uncrypto: 0.1.3 - crossws@0.4.1(srvx@0.11.12): + crossws@0.4.1(srvx@0.11.15): optionalDependencies: - srvx: 0.11.12 + srvx: 0.11.15 optional: true css-select@5.2.2: @@ -12348,6 +12407,11 @@ snapshots: defu@6.1.4: {} + defu@6.1.6: {} + + defu@6.1.7: + optional: true + degenerator@5.0.1: dependencies: ast-types: 0.13.4 @@ -12419,14 +12483,14 @@ 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.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.20260317.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 + 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) @@ -12700,18 +12764,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: @@ -12894,12 +12958,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.15)): dependencies: rou3: 0.8.1 - srvx: 0.11.12 + srvx: 0.11.15 optionalDependencies: - crossws: 0.4.1(srvx@0.11.12) + crossws: 0.4.1(srvx@0.11.15) handlebars@4.7.8: dependencies: @@ -13127,6 +13191,8 @@ snapshots: kysely@0.28.14: {} + kysely@0.28.15: {} + launch-editor@2.13.2: dependencies: picocolors: 1.1.1 @@ -13338,12 +13404,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: @@ -13356,7 +13422,7 @@ snapshots: minimatch@9.0.9: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.0.3 minimist@1.2.8: {} @@ -13377,13 +13443,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 @@ -13423,7 +13489,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: @@ -13532,51 +13598,61 @@ snapshots: macos-release: 3.4.0 windows-release: 6.1.0 - oxfmt@0.41.0: + oxfmt@0.44.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.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: @@ -13641,7 +13717,7 @@ snapshots: dependencies: entities: 6.0.1 - path-expression-matcher@1.2.0: {} + path-expression-matcher@1.2.1: {} path-key@3.1.1: {} @@ -14053,7 +14129,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 @@ -14327,6 +14403,8 @@ snapshots: srvx@0.11.12: {} + srvx@0.11.15: {} + std-env@3.10.0: optional: true @@ -14509,17 +14587,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 @@ -14718,26 +14790,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..3120b35 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,10 @@ +autoInstallPeers: true +engineStrict: true +nodeLinker: 'isolated' +strictPeerDependencies: false onlyBuiltDependencies: - esbuild - sharp - workerd +overrides: + undici: 7.18.2 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png index 82f3428..86af1e3 100644 Binary files a/public/apple-touch-icon.png and b/public/apple-touch-icon.png differ diff --git a/public/favicon-96x96.png b/public/favicon-96x96.png index e70ee86..ac40fff 100644 Binary files a/public/favicon-96x96.png and b/public/favicon-96x96.png differ diff --git a/public/favicon.ico b/public/favicon.ico index 551c1a7..4b49187 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ 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 b5e66c6..006e694 100644 Binary files a/public/web-app-manifest-192x192.png and b/public/web-app-manifest-192x192.png differ diff --git a/public/web-app-manifest-512x512.png b/public/web-app-manifest-512x512.png index 7f8e48f..5d47612 100644 Binary files a/public/web-app-manifest-512x512.png and b/public/web-app-manifest-512x512.png differ 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/server.ts b/src/entry.server.ts similarity index 58% rename from src/server.ts rename to src/entry.server.ts index 2194408..4ead1ed 100644 --- a/src/server.ts +++ b/src/entry.server.ts @@ -1,9 +1,9 @@ -import handler from '@tanstack/react-start/server-entry'; +import handler, { createServerEntry } from '@tanstack/react-start/server-entry'; import { paraglideMiddleware } from '~/lib/i18n/server'; -export default { +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 85% rename from src/start.ts rename to src/entry.start.ts index c76cd54..74cd713 100644 --- a/src/start.ts +++ b/src/entry.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/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; 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/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; +} 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/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/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 92e9dc1..1b912da 100644 --- a/src/lib/env/server.ts +++ b/src/lib/env/server.ts @@ -4,6 +4,7 @@ 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(), 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/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/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.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/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/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/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/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 5430a60..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 { authSearchParamsSchema } from '~/modules/auth/auth.schema'; -import { authGuestGuard } from '~/modules/auth/auth.utils'; +import { getSession } from '~/modules/auth/auth.fn'; +import { authSearchParamsSchema } from '~/modules/auth/auth.search'; export const Route = createFileRoute('/auth')({ validateSearch: zodValidator(authSearchParamsSchema), - beforeLoad: async () => await authGuestGuard(), + beforeLoad: async () => { + const session = await getSession(); + if (session) throw redirect({ to: '/app', replace: true }); + }, component: RouteComponent, }); 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 ( - +
({ config }), [config]); return ( - +
item.type !== 'none') .map((item, index) => { + // oxlint-disable-next-line typescript/restrict-template-expressions const key = `${nameKey ?? item.name ?? item.dataKey ?? 'value'}`; const itemConfig = getPayloadConfigFromPayload(config, item, key); const indicatorColor = color ?? item.payload?.fill ?? item.color; @@ -210,10 +213,10 @@ function ChartTooltipContent({ indicator === 'dot' && 'items-center', )} > - {formatter && item?.value !== undefined && item.name ? ( + {formatter && item.value !== undefined && item.name ? ( formatter(item.value, item.name, item, index, item.payload) ) : ( - <> + {itemConfig?.icon ? ( ) : ( @@ -258,7 +261,7 @@ function ChartTooltipContent({ )}
- + )}
); @@ -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..2a558fe 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,10 +6,8 @@ "src/**/*.tsx", ".storybook/**/*.ts", ".storybook/**/*.tsx", - "vite.config.ts", - "alchemy.run.ts", - "eslint.config.ts", - "commitlint.config.ts" + "*.config.ts", + "alchemy.run.ts" ], "exclude": ["node_modules"], "compilerOptions": { diff --git a/vite.config.ts b/vite.config.ts index 65c6707..9038a5c 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 @@ -17,7 +16,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 { clientEnv } = await import('./src/lib/env/client'); + const { posthogCliEnv } = await import('./src/lib/env/posthog-cli'); return defineConfig({ server: { port: 3000 }, @@ -26,13 +26,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: { @@ -48,7 +47,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()] }), @@ -79,11 +84,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: posthogCliEnv.POSTHOG_CLI_HOST, + projectId: posthogCliEnv.POSTHOG_CLI_PROJECT_ID, + personalApiKey: posthogCliEnv.POSTHOG_CLI_TOKEN, + sourcemaps: { + enabled: true, + deleteAfterUpload: true, + }, + }), + ] + : [], ], }); } 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()], });