diff --git a/packages/better-auth/.editorconfig b/packages/better-auth/.editorconfig new file mode 120000 index 0000000..1b3ce07 --- /dev/null +++ b/packages/better-auth/.editorconfig @@ -0,0 +1 @@ +../../.editorconfig \ No newline at end of file diff --git a/packages/better-auth/.gitignore b/packages/better-auth/.gitignore new file mode 100644 index 0000000..0ccb8df --- /dev/null +++ b/packages/better-auth/.gitignore @@ -0,0 +1,141 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.* +!.env.example + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist +.output + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Sveltekit cache directory +.svelte-kit/ + +# vitepress build output +**/.vitepress/dist + +# vitepress cache directory +**/.vitepress/cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# Firebase cache directory +.firebase/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v3 +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +# Vite files +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +.vite/ diff --git a/packages/better-auth/.prettierignore b/packages/better-auth/.prettierignore new file mode 100644 index 0000000..99b0b51 --- /dev/null +++ b/packages/better-auth/.prettierignore @@ -0,0 +1,4 @@ +/dist +/build +/node_modules +/coverage diff --git a/packages/better-auth/README.md b/packages/better-auth/README.md new file mode 100644 index 0000000..db0b2b7 --- /dev/null +++ b/packages/better-auth/README.md @@ -0,0 +1,93 @@ +# @thunderid/better-auth + +ThunderID provider helper for the [Better Auth](https://better-auth.com) +[Generic OAuth plugin](https://better-auth.com/docs/plugins/generic-oauth). + +This is a +[community provider helper](https://better-auth.com/docs/authentication/other-social-providers#community-provider-helpers): +it returns a typed `GenericOAuthConfig` for a ThunderID issuer. All OAuth 2.0 / OIDC handling is performed by Better +Auth itself — this package only supplies configuration, so there is no ThunderID SDK dependency and no protocol logic to +keep in sync. + +## Installation + +```bash +npm install @thunderid/better-auth +``` + +Requires `better-auth` >= 1.7.0 as a peer dependency. + +## Usage + +```ts +import {thunderid} from '@thunderid/better-auth'; +import {betterAuth} from 'better-auth'; +import {genericOAuth} from 'better-auth/plugins'; + +export const auth = betterAuth({ + plugins: [ + genericOAuth({ + config: [ + thunderid({ + clientId: process.env.THUNDERID_CLIENT_ID!, + clientSecret: process.env.THUNDERID_CLIENT_SECRET!, + issuer: process.env.THUNDERID_ISSUER!, + }), + ], + }), + ], +}); +``` + +Sign in from the client with the `thunderid` provider ID: + +```ts +await authClient.signIn.social({ + provider: 'thunderid', + callbackURL: '/dashboard', +}); +``` + +## Callback URL + +Register this redirect URI on your ThunderID application: + +``` +{baseURL}/api/auth/callback/thunderid +``` + +For example, `http://localhost:3000/api/auth/callback/thunderid` in development. + +## Options + +| Option | Type | Default | Description | +| ----------------------- | ---------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `issuer` | `string` | — | **Required.** ThunderID issuer URL, e.g. `https://thunderid.example.com`. A trailing slash is trimmed. The OIDC discovery URL is derived as `{issuer}/.well-known/openid-configuration`, so all endpoints come from the discovery document. | +| `clientId` | `string` | — | **Required.** OAuth client ID. | +| `clientSecret` | `string` | — | OAuth client secret. Omit for public clients using `tokenEndpointAuth: {method: 'none'}`. | +| `scopes` | `string[]` | `['openid', 'profile', 'email']` | Requested scopes. | +| `tokenEndpointAuth` | `object` | provider default | Token endpoint authentication method, e.g. `{method: 'client_secret_post'}`. | +| `pkce` | `boolean` | discovery default | Force PKCE on or off. | +| `redirectURI` | `string` | Better Auth default | Override the callback URL. | +| `endSessionEndpoint` | `string` | discovery default | RP-initiated logout endpoint. | +| `postLogoutRedirectURI` | `string` | — | Where ThunderID returns the user after logout. | +| `disableProviderLogout` | `boolean` | `false` | Skip provider logout on sign-out. | +| `disableImplicitSignUp` | `boolean` | `false` | Require an explicit sign-up request before creating a user. | +| `disableSignUp` | `boolean` | `false` | Reject sign-in for users who do not already exist. | +| `overrideUserInfo` | `boolean` | `false` | Refresh the stored user profile from ThunderID on every sign-in. | + +Every option other than `issuer` is passed through from Better Auth's +[`BaseOAuthProviderOptions`](https://better-auth.com/docs/authentication/other-social-providers#built-in-provider-helpers) +and behaves exactly as it does for the built-in provider helpers. + +## Development + +```bash +pnpm --filter @thunderid/better-auth run build +pnpm --filter @thunderid/better-auth run test +pnpm --filter @thunderid/better-auth run typecheck +``` + +## License + +Apache-2.0. See [LICENSE](../../LICENSE). diff --git a/packages/better-auth/eslint.config.js b/packages/better-auth/eslint.config.js new file mode 100644 index 0000000..1f3ad16 --- /dev/null +++ b/packages/better-auth/eslint.config.js @@ -0,0 +1,12 @@ +// Copyright 2026 The ThunderID Authors +// SPDX-License-Identifier: Apache-2.0 + +import thunderIdPlugin from '@thunderid/eslint-plugin'; + +export default [ + { + ignores: ['dist/**', 'build/**', 'node_modules/**', 'coverage/**'], + }, + ...thunderIdPlugin.configs.typescript, + ...thunderIdPlugin.configs.vitest, +]; diff --git a/packages/better-auth/package.json b/packages/better-auth/package.json new file mode 100644 index 0000000..af32a8f --- /dev/null +++ b/packages/better-auth/package.json @@ -0,0 +1,67 @@ +{ + "name": "@thunderid/better-auth", + "version": "0.0.0", + "description": "ThunderID provider helper for the Better Auth Generic OAuth plugin", + "keywords": [ + "thunderid", + "better-auth", + "oauth", + "oidc", + "generic-oauth" + ], + "homepage": "https://github.com/thunder-id/javascript-sdks/tree/main/packages/better-auth#readme", + "bugs": { + "url": "https://github.com/thunder-id/thunderid/issues" + }, + "author": "The ThunderID Authors", + "license": "Apache-2.0", + "type": "module", + "main": "dist/index.js", + "module": "dist/index.js", + "commonjs": "dist/cjs/index.cjs", + "exports": { + "import": "./dist/index.js", + "require": "./dist/cjs/index.cjs" + }, + "files": [ + "dist", + "README.md", + "LICENSE" + ], + "types": "dist/index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/thunder-id/javascript-sdks", + "directory": "packages/better-auth" + }, + "scripts": { + "build": "pnpm clean:dist && rolldown -c rolldown.config.js && tsc -p tsconfig.lib.json --emitDeclarationOnly --outDir dist", + "clean": "pnpm clean:node_modules && pnpm clean:dist", + "clean:dist": "rimraf dist", + "clean:node_modules": "rimraf node_modules", + "format:check": "prettier --check --cache .", + "format:fix": "prettier --write --cache .", + "lint": "eslint . --ext .js,.jsx,.ts,.tsx,.cjs,.mjs", + "lint:fix": "eslint . --fix --ext .js,.jsx,.ts,.tsx,.cjs,.mjs", + "test": "vitest", + "typecheck": "tsc -p tsconfig.lib.json" + }, + "devDependencies": { + "@thunderid/eslint-plugin": "catalog:", + "@thunderid/prettier-config": "catalog:", + "@types/node": "catalog:", + "better-auth": "^1.7.2", + "eslint": "catalog:", + "prettier": "catalog:", + "rimraf": "catalog:", + "rolldown": "catalog:", + "typescript": "catalog:", + "vitest": "catalog:" + }, + "peerDependencies": { + "better-auth": ">=1.7.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/better-auth/prettier.config.js b/packages/better-auth/prettier.config.js new file mode 100644 index 0000000..f054cd5 --- /dev/null +++ b/packages/better-auth/prettier.config.js @@ -0,0 +1,6 @@ +// Copyright 2026 The ThunderID Authors +// SPDX-License-Identifier: Apache-2.0 + +import config from '@thunderid/prettier-config'; + +export default config; diff --git a/packages/better-auth/rolldown.config.js b/packages/better-auth/rolldown.config.js new file mode 100644 index 0000000..521b00c --- /dev/null +++ b/packages/better-auth/rolldown.config.js @@ -0,0 +1,41 @@ +// Copyright 2026 The ThunderID Authors +// SPDX-License-Identifier: Apache-2.0 + +import {readFileSync} from 'fs'; +import {join} from 'path'; +import {defineConfig} from 'rolldown'; + +const pkg = JSON.parse(readFileSync('./package.json', 'utf8')); + +const external = [...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.peerDependencies || {}), /^better-auth\//]; + +const commonOptions = { + input: [join('src', 'index.ts')], + preserveModules: true, + external, + platform: 'neutral', + target: 'es2020', + sourcemap: true, +}; + +export default defineConfig([ + // ESM build + { + ...commonOptions, + output: { + dir: 'dist', + format: 'esm', + preserveModulesRoot: 'src', + }, + }, + // CommonJS build + { + ...commonOptions, + output: { + dir: join('dist', 'cjs'), + entryFileNames: '[name].cjs', + format: 'cjs', + preserveModulesRoot: 'src', + }, + }, +]); diff --git a/packages/better-auth/src/__tests__/thunderid.test.ts b/packages/better-auth/src/__tests__/thunderid.test.ts new file mode 100644 index 0000000..3dedff1 --- /dev/null +++ b/packages/better-auth/src/__tests__/thunderid.test.ts @@ -0,0 +1,96 @@ +// Copyright 2026 The ThunderID Authors +// SPDX-License-Identifier: Apache-2.0 + +import {betterAuth} from 'better-auth'; +import {genericOAuth} from 'better-auth/plugins'; +import {describe, expect, it} from 'vitest'; +import {thunderid} from '../thunderid'; + +describe('thunderid', () => { + it('should return the correct GenericOAuthConfig', () => { + const config = thunderid({ + clientId: 'thunderid-client-id', + clientSecret: 'thunderid-client-secret', + issuer: 'https://thunderid.example.com', + }); + + expect(config.providerId).toBe('thunderid'); + expect(config.accountIssuer).toBe('https://thunderid.example.com'); + expect(config.discoveryUrl).toBe('https://thunderid.example.com/.well-known/openid-configuration'); + expect(config.scopes).toEqual(['openid', 'profile', 'email']); + expect(config.clientId).toBe('thunderid-client-id'); + expect(config.clientSecret).toBe('thunderid-client-secret'); + expect(config.getUserInfo).toBeUndefined(); + }); + + it('should handle an issuer with a trailing slash', () => { + const config = thunderid({ + clientId: 'thunderid-client-id', + clientSecret: 'thunderid-client-secret', + issuer: 'https://thunderid.example.com/', + }); + + expect(config.accountIssuer).toBe('https://thunderid.example.com'); + expect(config.discoveryUrl).toBe('https://thunderid.example.com/.well-known/openid-configuration'); + }); + + it('should allow overriding scopes', () => { + const config = thunderid({ + clientId: 'thunderid-client-id', + clientSecret: 'thunderid-client-secret', + issuer: 'https://thunderid.example.com', + scopes: ['openid', 'profile'], + }); + + expect(config.scopes).toEqual(['openid', 'profile']); + }); + + it('should forward sign-up and PKCE options', () => { + const config = thunderid({ + clientId: 'thunderid-client-id', + clientSecret: 'thunderid-client-secret', + issuer: 'https://thunderid.example.com', + pkce: true, + disableImplicitSignUp: true, + }); + + expect(config.pkce).toBe(true); + expect(config.disableImplicitSignUp).toBe(true); + }); + + it('should forward token endpoint auth and logout options', () => { + const config = thunderid({ + clientId: 'thunderid-client-id', + clientSecret: 'thunderid-client-secret', + issuer: 'https://thunderid.example.com', + tokenEndpointAuth: {method: 'client_secret_post'}, + endSessionEndpoint: 'https://thunderid.example.com/logout', + postLogoutRedirectURI: 'https://app.example.com/logged-out', + disableProviderLogout: true, + }); + + expect(config.tokenEndpointAuth).toEqual({method: 'client_secret_post'}); + expect(config.endSessionEndpoint).toBe('https://thunderid.example.com/logout'); + expect(config.postLogoutRedirectURI).toBe('https://app.example.com/logged-out'); + expect(config.disableProviderLogout).toBe(true); + }); + + it('should register with the genericOAuth plugin', () => { + const auth = betterAuth({ + baseURL: 'http://localhost:3000', + plugins: [ + genericOAuth({ + config: [ + thunderid({ + clientId: 'thunderid-client-id', + clientSecret: 'thunderid-client-secret', + issuer: 'https://thunderid.example.com', + }), + ], + }), + ], + }); + + expect(auth).toBeDefined(); + }); +}); diff --git a/packages/better-auth/src/index.ts b/packages/better-auth/src/index.ts new file mode 100644 index 0000000..8e60711 --- /dev/null +++ b/packages/better-auth/src/index.ts @@ -0,0 +1,5 @@ +// Copyright 2026 The ThunderID Authors +// SPDX-License-Identifier: Apache-2.0 + +export {thunderid} from './thunderid'; +export type {ThunderIDOptions} from './thunderid'; diff --git a/packages/better-auth/src/thunderid.ts b/packages/better-auth/src/thunderid.ts new file mode 100644 index 0000000..656ab09 --- /dev/null +++ b/packages/better-auth/src/thunderid.ts @@ -0,0 +1,75 @@ +// Copyright 2026 The ThunderID Authors +// SPDX-License-Identifier: Apache-2.0 + +import type {BaseOAuthProviderOptions, GenericOAuthConfig} from 'better-auth/plugins/generic-oauth'; + +/** + * Options accepted by the {@link thunderid} provider helper. + */ +export interface ThunderIDOptions extends BaseOAuthProviderOptions { + /** + * ThunderID issuer URL (e.g. `https://thunderid.example.com`). + * + * The OpenID Connect discovery URL is derived from this value, so every other + * endpoint (authorization, token, userinfo, JWKS, end session) is resolved + * from the issuer's discovery document rather than hardcoded here. + */ + issuer: string; +} + +const DEFAULT_SCOPES: string[] = ['openid', 'profile', 'email']; + +/** + * ThunderID provider helper for the Better Auth Generic OAuth plugin. + * + * Returns a typed `GenericOAuthConfig` for a ThunderID issuer, defaulting to the + * `openid profile email` scopes. All OAuth 2.0 / OIDC handling is performed by + * Better Auth itself — this helper only supplies configuration. + * + * @example + * ```ts + * import {thunderid} from '@thunderid/better-auth'; + * import {betterAuth} from 'better-auth'; + * import {genericOAuth} from 'better-auth/plugins'; + * + * export const auth = betterAuth({ + * plugins: [ + * genericOAuth({ + * config: [ + * thunderid({ + * clientId: process.env.THUNDERID_CLIENT_ID!, + * clientSecret: process.env.THUNDERID_CLIENT_SECRET!, + * issuer: process.env.THUNDERID_ISSUER!, + * }), + * ], + * }), + * ], + * }); + * ``` + * + * The callback URL to register with ThunderID is + * `{baseURL}/api/auth/callback/thunderid`. + */ +export function thunderid(options: ThunderIDOptions): GenericOAuthConfig<'thunderid'> { + // A trailing slash would yield a double slash in the derived discovery URL and + // break issuer comparison against the `iss` claim, which is never slash-suffixed. + const issuer: string = options.issuer.replace(/\/$/, ''); + + return { + providerId: 'thunderid', + accountIssuer: issuer, + discoveryUrl: `${issuer}/.well-known/openid-configuration`, + clientId: options.clientId, + clientSecret: options.clientSecret, + tokenEndpointAuth: options.tokenEndpointAuth, + scopes: options.scopes ?? DEFAULT_SCOPES, + redirectURI: options.redirectURI, + endSessionEndpoint: options.endSessionEndpoint, + postLogoutRedirectURI: options.postLogoutRedirectURI, + disableProviderLogout: options.disableProviderLogout, + pkce: options.pkce, + disableImplicitSignUp: options.disableImplicitSignUp, + disableSignUp: options.disableSignUp, + overrideUserInfo: options.overrideUserInfo, + }; +} diff --git a/packages/better-auth/tsconfig.eslint.json b/packages/better-auth/tsconfig.eslint.json new file mode 100644 index 0000000..d5eefbb --- /dev/null +++ b/packages/better-auth/tsconfig.eslint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["**/.*.js", "**/.*.cjs", "**/.*.ts", "**/*.js", "**/*.cjs", "**/*.ts"] +} diff --git a/packages/better-auth/tsconfig.json b/packages/better-auth/tsconfig.json new file mode 100644 index 0000000..f4cadfe --- /dev/null +++ b/packages/better-auth/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "declaration": false, + "esModuleInterop": true, + "importHelpers": true, + "lib": ["ESNext"], + "module": "ESNext", + "moduleResolution": "bundler", + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "sourceMap": true, + "target": "ESNext", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "exclude": ["node_modules", "tmp", "dist"], + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/packages/better-auth/tsconfig.lib.json b/packages/better-auth/tsconfig.lib.json new file mode 100644 index 0000000..b9638f6 --- /dev/null +++ b/packages/better-auth/tsconfig.lib.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "outDir": "dist", + "declarationDir": "dist", + "types": ["node"] + }, + "exclude": ["**/*.spec.ts", "**/*.test.ts", "**/__tests__/**"], + "include": ["src/**/*.ts"] +} diff --git a/packages/better-auth/tsconfig.spec.json b/packages/better-auth/tsconfig.spec.json new file mode 100644 index 0000000..8222f8a --- /dev/null +++ b/packages/better-auth/tsconfig.spec.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "types": ["node"] + }, + "include": ["vitest.config.ts", "**/*.test.ts", "**/*.spec.ts", "**/*.d.ts"] +} diff --git a/packages/better-auth/vitest.config.ts b/packages/better-auth/vitest.config.ts new file mode 100644 index 0000000..99891b9 --- /dev/null +++ b/packages/better-auth/vitest.config.ts @@ -0,0 +1,8 @@ +// Copyright 2026 The ThunderID Authors +// SPDX-License-Identifier: Apache-2.0 + +import {defineConfig} from 'vitest/config'; + +export default defineConfig({ + test: {}, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb88b05..df3f257 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -354,6 +354,39 @@ importers: specifier: 'catalog:' version: 5.9.3 + packages/better-auth: + devDependencies: + '@thunderid/eslint-plugin': + specifier: 'catalog:' + version: 1.0.0(@typescript-eslint/utils@8.61.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)(vitest@4.1.10)(vue-eslint-parser@10.4.1(eslint@9.39.4(jiti@2.7.0))) + '@thunderid/prettier-config': + specifier: 'catalog:' + version: 1.0.0 + '@types/node': + specifier: 'catalog:' + version: 24.7.2 + better-auth: + specifier: ^1.7.2 + version: 1.7.2(next@15.5.23(@playwright/test@1.60.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@4.1.10)(vue@3.5.41(typescript@5.9.3)) + eslint: + specifier: 'catalog:' + version: 9.39.4(jiti@2.7.0) + prettier: + specifier: 'catalog:' + version: 3.6.2 + rimraf: + specifier: 'catalog:' + version: 6.1.3 + rolldown: + specifier: 'catalog:' + version: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.1) + typescript: + specifier: 'catalog:' + version: 5.9.3 + vitest: + specifier: 'catalog:' + version: 4.1.10(@types/node@24.7.2)(@vitest/browser-playwright@4.1.10)(jsdom@27.0.1)(vite@8.2.1(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + packages/browser: dependencies: '@thunderid/javascript': @@ -1229,6 +1262,88 @@ packages: resolution: {integrity: sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==} engines: {node: ^22.18.0 || >=24.11.0} + '@better-auth/core@1.7.2': + resolution: {integrity: sha512-j0nM4ygsWbF/fcYRoKtDn8gn8uLXkmC+075HqSqsJEAV828cJR9bvYBCUQ1zmxNyRBk6Iz/qXsA0Zm2oksiOTg==} + peerDependencies: + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + '@cloudflare/workers-types': '>=4' + '@opentelemetry/api': ^1.9.0 + better-call: 1.4.0 + jose: ^6.1.0 + kysely: ^0.28.5 || ^0.29.0 + nanostores: ^1.0.1 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + '@opentelemetry/api': + optional: true + + '@better-auth/drizzle-adapter@1.7.2': + resolution: {integrity: sha512-A5wE10PIv3aS5LGePecEHntQylKy6OOF17B4dqlE0DwJeqU/IOBSd7/LZhMop9cNJ3WFjKMpazVSf91yYM/NFg==} + peerDependencies: + '@better-auth/core': ^1.7.2 + '@better-auth/utils': 0.4.2 + drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0 + peerDependenciesMeta: + drizzle-orm: + optional: true + + '@better-auth/kysely-adapter@1.7.2': + resolution: {integrity: sha512-LYdSRLOvZiF+6S0UThu+wE/Qxsq9P2jQs7ZKkY6BIBJqUjYyxVDmi8HFcantBvWWW1/BeQCSsD7YVDG4gICMIQ==} + peerDependencies: + '@better-auth/core': ^1.7.2 + '@better-auth/utils': 0.4.2 + kysely: ^0.28.17 || ^0.29.0 + peerDependenciesMeta: + kysely: + optional: true + + '@better-auth/memory-adapter@1.7.2': + resolution: {integrity: sha512-0q1SXMzm5esH9L0xVuM6IxCk59E4G+3HySX4My9gvEwqtmUobykn+iuc/si3Y4xwUO7JODqQ5o+/pPcLDDMIrA==} + peerDependencies: + '@better-auth/core': ^1.7.2 + '@better-auth/utils': 0.4.2 + + '@better-auth/mongo-adapter@1.7.2': + resolution: {integrity: sha512-4879SmUWHUs0OYlvHoCFbycZ7i1bqytkcgAUdt9RLQMvZ5H3LRMTgax2YVlGZEXgwNjY/X7xAoXOecWLhlQWeA==} + peerDependencies: + '@better-auth/core': ^1.7.2 + '@better-auth/utils': 0.4.2 + mongodb: ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + mongodb: + optional: true + + '@better-auth/prisma-adapter@1.7.2': + resolution: {integrity: sha512-mXTr/83WrNWLrvzIjtgDgdu9iXhOcSG1+qBQOAKlbGSFiOB+z4IMRneQ2wmMOiB8mKY9qGkClVUjKRFXqtHnFQ==} + peerDependencies: + '@better-auth/core': ^1.7.2 + '@better-auth/utils': 0.4.2 + '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 + prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + '@prisma/client': + optional: true + prisma: + optional: true + + '@better-auth/telemetry@1.7.2': + resolution: {integrity: sha512-LcWu+O0zrxYDQj8E36vfkJwGPW4k9ZDA/rCo0zST6ihzL+juR7pBowoZIM9E6tK0Vit52mf6412bGT4XM4eTjQ==} + peerDependencies: + '@better-auth/core': ^1.7.2 + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + + '@better-auth/utils@0.4.2': + resolution: {integrity: sha512-AUxrvu+HaaODsUyzDxFgwd/8RZ1yZaYo42LXKSrU2oGgR38pS1ij8nqQKNgtTWoYGpNevNXtCfgTy6loHveW9A==} + + '@better-auth/utils@0.5.0': + resolution: {integrity: sha512-BL8W4EfIZFwlu0r54m3v1ztjDhu6dDe/amLTm0xybmbZaNgYUqhD3SjpAsnq0q8YD6/ki4iwIgxJNLP/N3TxiA==} + + '@better-fetch/fetch@1.3.1': + resolution: {integrity: sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g==} + '@blazediff/core@1.9.1': resolution: {integrity: sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==} @@ -2157,6 +2272,14 @@ packages: cpu: [x64] os: [win32] + '@noble/ciphers@2.4.0': + resolution: {integrity: sha512-AnjFn0Jv92laAkvMrghlFZq4qQCIN/4DxFV/eooqtC2YTjB7kBeLMS2T9KJX4Dn+ZVXLOwK0lSgqDtx9gvxtiw==} + engines: {node: '>= 20.19.0'} + + '@noble/hashes@2.4.0': + resolution: {integrity: sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==} + engines: {node: '>= 20.19.0'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2327,6 +2450,10 @@ packages: '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + '@oxc-minify/binding-android-arm-eabi@0.143.0': resolution: {integrity: sha512-/UEp7vlZSeB5kkcspO93fec1NnPfdkF0JmKUSKm6ZLBhkh+Ua6hHmGU5tBJYF3LeuDDVpe+RIjBlmSu4d0kmKg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4186,6 +4313,76 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + better-auth@1.7.2: + resolution: {integrity: sha512-gKapKBEvYIGcMxi74RjQ7EbFLiqyQt58vdoJmL1qAlWSkY1Bc2Vqshl524/3u1NxauiOU03M/Ebh762Brmac9A==} + peerDependencies: + '@lynx-js/react': '*' + '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 + '@sveltejs/kit': ^2.0.0 + '@tanstack/react-start': ^1.0.0 + '@tanstack/solid-start': ^1.0.0 + better-sqlite3: ^12.0.0 + drizzle-kit: '>=0.31.4 || >=1.0.0-beta.1' + drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0 + mongodb: ^6.0.0 || ^7.0.0 + mysql2: ^3.0.0 + next: ^14.0.0 || ^15.0.0 || ^16.0.0 + pg: ^8.0.0 + prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + solid-js: ^1.0.0 + svelte: ^4.0.0 || ^5.0.0 + vitest: ^2.0.0 || ^3.0.0 || ^4.0.0 + vue: ^3.0.0 + peerDependenciesMeta: + '@lynx-js/react': + optional: true + '@prisma/client': + optional: true + '@sveltejs/kit': + optional: true + '@tanstack/react-start': + optional: true + '@tanstack/solid-start': + optional: true + better-sqlite3: + optional: true + drizzle-kit: + optional: true + drizzle-orm: + optional: true + mongodb: + optional: true + mysql2: + optional: true + next: + optional: true + pg: + optional: true + prisma: + optional: true + react: + optional: true + react-dom: + optional: true + solid-js: + optional: true + svelte: + optional: true + vitest: + optional: true + vue: + optional: true + + better-call@1.4.0: + resolution: {integrity: sha512-bBKOT4vv1kZLDgxVePdilk/Jwkn+dtRRsmi3DzHcDP+WnswyVl6dR59l2HEeP/0cB+bDoopASAesWDPIdd/zZA==} + peerDependencies: + zod: ^4.0.0 + peerDependenciesMeta: + zod: + optional: true + bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} @@ -4959,6 +5156,7 @@ packages: eslint@9.39.4: resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true peerDependencies: jiti: '*' @@ -5669,6 +5867,10 @@ packages: knitwork@1.3.0: resolution: {integrity: sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==} + kysely@0.29.5: + resolution: {integrity: sha512-ooa+eSbBNPTo3MycPEuW5jdrxQdQwdtB3LC3h43FiXQbIry5tR0C5lDG7eealK0E4D7XjrnOP5DIUg/LyjRMYQ==} + engines: {node: '>=22.0.0'} + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -5977,6 +6179,10 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanostores@1.5.2: + resolution: {integrity: sha512-B0UbxzK1s0CN8Xht6r+7iT5+xV8PTaRERR1nATeplRv1Rw5YLWfVAid0hkqY3EceqpG4RjTk8GAwIxQY39Rnwg==} + engines: {node: ^20.0.0 || >=22.0.0} + nanotar@0.3.0: resolution: {integrity: sha512-Kv2JYYiCzt16Kt5QwAc9BFG89xfPNBx+oQL4GQXD9nLqPkZBiNaqaCWtwnbk/q7UVsTYevvM1b0UF8zmEI4pCg==} @@ -7000,6 +7206,9 @@ packages: set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + set-cookie-parser@3.1.2: + resolution: {integrity: sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -7116,9 +7325,6 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - std-env@4.1.0: - resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} - std-env@4.2.0: resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} @@ -8454,6 +8660,61 @@ snapshots: '@babel/helper-string-parser': 8.0.0 '@babel/helper-validator-identifier': 8.0.2 + '@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2)': + dependencies: + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + '@opentelemetry/semantic-conventions': 1.43.0 + '@standard-schema/spec': 1.1.0 + better-call: 1.4.0(zod@4.4.3) + jose: 6.2.3 + kysely: 0.29.5 + nanostores: 1.5.2 + zod: 4.4.3 + + '@better-auth/drizzle-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)': + dependencies: + '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2) + '@better-auth/utils': 0.4.2 + + '@better-auth/kysely-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(kysely@0.29.5)': + dependencies: + '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2) + '@better-auth/utils': 0.4.2 + optionalDependencies: + kysely: 0.29.5 + + '@better-auth/memory-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)': + dependencies: + '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2) + '@better-auth/utils': 0.4.2 + + '@better-auth/mongo-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)': + dependencies: + '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2) + '@better-auth/utils': 0.4.2 + + '@better-auth/prisma-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)': + dependencies: + '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2) + '@better-auth/utils': 0.4.2 + + '@better-auth/telemetry@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)': + dependencies: + '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2) + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + + '@better-auth/utils@0.4.2': + dependencies: + '@noble/hashes': 2.4.0 + + '@better-auth/utils@0.5.0': + dependencies: + '@noble/hashes': 2.4.0 + + '@better-fetch/fetch@1.3.1': {} + '@blazediff/core@1.9.1': {} '@bomb.sh/tab@0.0.19(cac@6.7.14)(citty@0.2.2)': @@ -9130,6 +9391,10 @@ snapshots: '@next/swc-win32-x64-msvc@15.5.23': optional: true + '@noble/ciphers@2.4.0': {} + + '@noble/hashes@2.4.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -9736,7 +10001,7 @@ snapshots: consola: 3.4.2 ofetch: 2.0.0-alpha.3 rc9: 3.0.1 - std-env: 4.1.0 + std-env: 4.2.0 '@nuxt/telemetry@2.8.0(@nuxt/kit@4.5.2(magic-string@1.1.0)(magicast@0.5.4)(oxc-parser@0.143.0)(rolldown@1.2.3)(unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.2)(vite@8.2.1(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))))': dependencies: @@ -9745,7 +10010,7 @@ snapshots: consola: 3.4.2 ofetch: 2.0.0-alpha.3 rc9: 3.0.1 - std-env: 4.1.0 + std-env: 4.2.0 '@nuxt/test-utils@3.17.2(@playwright/test@1.60.0)(@types/node@24.7.2)(@vue/test-utils@2.4.6)(jiti@2.7.0)(jsdom@27.0.1)(lightningcss@1.33.0)(magicast@0.5.4)(playwright-core@1.60.0)(terser@5.48.0)(typescript@5.9.3)(vitest@4.1.10)(yaml@2.9.0)': dependencies: @@ -9923,6 +10188,8 @@ snapshots: '@one-ini/wasm@0.1.1': {} + '@opentelemetry/semantic-conventions@1.43.0': {} + '@oxc-minify/binding-android-arm-eabi@0.143.0': optional: true @@ -10294,10 +10561,10 @@ snapshots: '@rollup/pluginutils': 5.4.0(rollup@4.62.2) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.5.0(picomatch@4.0.4) + fdir: 6.5.0(picomatch@4.0.5) is-reference: 1.2.1 magic-string: 0.30.21 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: rollup: 4.62.2 @@ -10306,10 +10573,10 @@ snapshots: '@rollup/pluginutils': 5.4.0(rollup@4.62.2) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.5.0(picomatch@4.0.4) + fdir: 6.5.0(picomatch@4.0.5) is-reference: 1.2.1 magic-string: 0.30.21 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: rollup: 4.62.2 @@ -10356,7 +10623,7 @@ snapshots: dependencies: '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: rollup: 4.62.2 @@ -10938,7 +11205,7 @@ snapshots: glob: 13.0.6 graceful-fs: 4.2.11 node-gyp-build: 4.8.4 - picomatch: 4.0.4 + picomatch: 4.0.5 resolve-from: 5.0.0 transitivePeerDependencies: - encoding @@ -11324,7 +11591,7 @@ snapshots: alien-signals: 3.2.1 muggle-string: 0.4.1 path-browserify: 1.0.1 - picomatch: 4.0.4 + picomatch: 4.0.5 '@vue/reactivity@3.5.30': dependencies: @@ -11645,6 +11912,44 @@ snapshots: baseline-browser-mapping@2.11.13: {} + better-auth@1.7.2(next@15.5.23(@playwright/test@1.60.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@4.1.10)(vue@3.5.41(typescript@5.9.3)): + dependencies: + '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2) + '@better-auth/drizzle-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2) + '@better-auth/kysely-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(kysely@0.29.5) + '@better-auth/memory-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2) + '@better-auth/mongo-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2) + '@better-auth/prisma-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2) + '@better-auth/telemetry': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.3)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + '@noble/ciphers': 2.4.0 + '@noble/hashes': 2.4.0 + better-call: 1.4.0(zod@4.4.3) + defu: 6.1.5 + jose: 6.2.3 + kysely: 0.29.5 + nanostores: 1.5.2 + zod: 4.4.3 + optionalDependencies: + next: 15.5.23(@playwright/test@1.60.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + vitest: 4.1.10(@types/node@24.7.2)(@vitest/browser-playwright@4.1.10)(jsdom@27.0.1)(vite@8.2.1(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + vue: 3.5.41(typescript@5.9.3) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@opentelemetry/api' + + better-call@1.4.0(zod@4.4.3): + dependencies: + '@better-auth/utils': 0.5.0 + '@better-fetch/fetch': 1.3.1 + rou3: 0.9.1 + set-cookie-parser: 3.1.2 + optionalDependencies: + zod: 4.4.3 + bidi-js@1.0.3: dependencies: require-from-string: 2.0.2 @@ -13425,6 +13730,8 @@ snapshots: knitwork@1.3.0: {} + kysely@0.29.5: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -13699,6 +14006,8 @@ snapshots: nanoid@3.3.18: {} + nanostores@1.5.2: {} + nanotar@0.3.0: {} napi-postinstall@0.3.4: {} @@ -13713,7 +14022,7 @@ snapshots: dependencies: '@next/env': 15.5.23 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001799 + caniuse-lite: 1.0.30001809 postcss: 8.5.23 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -13792,7 +14101,7 @@ snapshots: serve-placeholder: 2.0.2 serve-static: 2.2.1 source-map: 0.7.6 - std-env: 4.1.0 + std-env: 4.2.0 ufo: 1.6.4 ultrahtml: 1.6.0 uncrypto: 0.1.3 @@ -15151,6 +15460,8 @@ snapshots: set-cookie-parser@2.7.2: {} + set-cookie-parser@3.1.2: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -15297,8 +15608,6 @@ snapshots: std-env@3.10.0: {} - std-env@4.1.0: {} - std-env@4.2.0: {} stop-iteration-iterator@1.1.0: @@ -15749,7 +16058,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.2 pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.5 pkg-types: 2.3.1 scule: 1.3.0 strip-literal: 3.1.0 @@ -15794,12 +16103,12 @@ snapshots: unplugin-utils@0.3.1: dependencies: pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.5 unplugin-utils@0.3.2: dependencies: pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.5 unplugin-vue-router@0.19.2(@vue/compiler-sfc@3.5.41)(vue-router@4.6.4(vue@3.5.41(typescript@5.9.3)))(vue@3.5.41(typescript@5.9.3)): dependencies: @@ -15815,7 +16124,7 @@ snapshots: mlly: 1.8.2 muggle-string: 0.4.1 pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.5 scule: 1.3.0 tinyglobby: 0.2.17 unplugin: 2.3.11 @@ -15835,13 +16144,13 @@ snapshots: dependencies: '@jridgewell/remapping': 2.3.5 acorn: 8.17.0 - picomatch: 4.0.4 + picomatch: 4.0.5 webpack-virtual-modules: 0.6.2 unplugin@3.0.0: dependencies: '@jridgewell/remapping': 2.3.5 - picomatch: 4.0.4 + picomatch: 4.0.5 webpack-virtual-modules: 0.6.2 unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.2.3)(rollup@4.62.2)(vite@8.2.1(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): @@ -16013,7 +16322,7 @@ snapshots: chokidar: 5.0.0 npm-run-path: 6.0.0 picocolors: 1.1.1 - picomatch: 4.0.4 + picomatch: 4.0.5 proper-lockfile: 4.1.2 tiny-invariant: 1.3.3 vite: 7.3.6(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.48.0)(yaml@2.9.0) @@ -16028,7 +16337,7 @@ snapshots: chokidar: 5.0.0 npm-run-path: 6.0.0 picocolors: 1.1.1 - picomatch: 4.0.4 + picomatch: 4.0.5 proper-lockfile: 4.1.2 tiny-invariant: 1.3.3 vite: 8.2.1(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) @@ -16106,8 +16415,8 @@ snapshots: vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.48.0)(yaml@2.9.0): dependencies: esbuild: 0.27.7 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 postcss: 8.5.23 rollup: 4.62.2 tinyglobby: 0.2.17 @@ -16122,8 +16431,8 @@ snapshots: vite@7.3.6(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.48.0)(yaml@2.9.0): dependencies: esbuild: 0.28.1 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 postcss: 8.5.23 rollup: 4.62.2 tinyglobby: 0.2.17