diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 24badde..48f71de 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -84,6 +84,12 @@ on: type: boolean default: false + sdk_svelte: + description: '@thunderid/svelte' + required: false + type: boolean + default: false + permissions: contents: write # IMPORTANT: DO NOT REMOVE. `id-token` is required for OIDC publishing. @@ -530,6 +536,63 @@ jobs: --generate-notes \ "${{ steps.pack.outputs.archive }}" + release-sveltekit: + name: ๐Ÿงก Release @thunderid/sveltekit + needs: [validate, release-browser] + if: ${{ always() && needs.validate.result == 'success' && (needs.release-browser.result == 'success' || needs.release-browser.result == 'skipped') && github.event.inputs.sdk_svelte == 'true' }} + runs-on: ubuntu-latest + steps: + - name: ๐Ÿ“ฅ Checkout Code + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + token: ${{ secrets.THUNDERID_AUTOMATION_BOT }} + + - name: ๐Ÿ“ฆ Set up pnpm + uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4.3.0 + with: + version: latest + + - name: โš™๏ธ Set up Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + with: + node-version: ${{ env.NODE_VERSION }} + registry-url: 'https://registry.npmjs.org' + cache: 'pnpm' + + - name: ๐Ÿ“ฆ Install Dependencies + run: pnpm install --frozen-lockfile + + - name: ๐Ÿท๏ธ Bump Version + id: bump + run: | + cd packages/sveltekit + pnpm version ${{ github.event.inputs.bump_type }} --no-git-tag-version + echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT + + - name: ๐Ÿ”จ Build + run: pnpm turbo run build --filter=@thunderid/sveltekit + + - name: ๐Ÿ“ค Commit, Tag & Push + run: | + git config user.name "${{ env.RELEASE_GIT_USER_NAME }}" + git config user.email "${{ env.RELEASE_GIT_USER_EMAIL }}" + git add packages/sveltekit/package.json + git diff --cached --quiet || git commit -m "[Release] @thunderid/sveltekit@${{ steps.bump.outputs.version }}" + for i in $(seq 1 5); do + git pull --rebase origin ${{ github.ref_name }} + git push origin HEAD:${{ github.ref_name }} && break + [ "$i" -eq 5 ] && exit 1 + sleep $((i * 3)) + done + git tag "sdk/sveltekit/v${{ steps.bump.outputs.version }}" + git push origin "sdk/sveltekit/v${{ steps.bump.outputs.version }}" + + - name: ๐Ÿ“ฆ Publish to npm + run: pnpm publish --no-git-checks --access public --provenance + working-directory: packages/sveltekit + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + # โ”€โ”€ Level 3: depends on react / node+react / browser+node+vue โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ release-react-router: name: ๐Ÿ”€ Release @thunderid/react-router diff --git a/.gitignore b/.gitignore index 005cdd1..c5197f3 100644 --- a/.gitignore +++ b/.gitignore @@ -147,5 +147,12 @@ vite.config.ts.timestamp-* .DS_Store Thumbs.db +# Test apps +/apps/ + +# Nx +.nx/cache +.nx/workspace-data + # Turbo .turbo diff --git a/AGENTS.md b/AGENTS.md index 11bd555..c100c7c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -35,6 +35,7 @@ shared utils). Every other package depends on it, directly or transitively: - `@thunderid/nextjs` โ†’ `@thunderid/node` + `@thunderid/react`. - `@thunderid/nuxt` โ†’ `@thunderid/node` + `@thunderid/vue`. - `@thunderid/express` โ†’ `@thunderid/node`. +- `@thunderid/sveltekit` โ†’ `@thunderid/browser`. - `@thunderid/react-router`, `@thunderid/tanstack-router` โ†’ `@thunderid/react`. **Before adding a helper/util/constant to a framework package, check whether it belongs lower in this @@ -80,6 +81,7 @@ packages/ nextjs/ Next.js SDK (client + server) nuxt/ Nuxt module express/ Express middleware + sveltekit/ SvelteKit SDK (client + server) react-router/ React Router integration tanstack-router/ TanStack Router integration samples/ Standalone quickstart demo apps, one per framework diff --git a/README.md b/README.md index 122bc4e..749ef9f 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ JavaScript SDKs for ThunderID. Provides authentication and user management for b | [`@thunderid/nextjs`](packages/nextjs) | ![npm](https://img.shields.io/npm/v/@thunderid/nextjs) | Next.js SDK | | [`@thunderid/react-router`](packages/react-router) | ![npm](https://img.shields.io/npm/v/@thunderid/react-router) | React Router integration | | [`@thunderid/vue`](packages/vue) | ![npm](https://img.shields.io/npm/v/@thunderid/vue) | Vue SDK | +| [`@thunderid/sveltekit`](packages/sveltekit) | ![npm](https://img.shields.io/npm/v/@thunderid/sveltekit) | SvelteKit SDK | | [`@thunderid/nuxt`](packages/nuxt) | ![npm](https://img.shields.io/npm/v/@thunderid/nuxt) | Nuxt SDK | | [`@thunderid/express`](packages/express) | ![npm](https://img.shields.io/npm/v/@thunderid/express) | Express.js SDK | | [`@thunderid/tanstack-router`](packages/tanstack-router) | ![npm](https://img.shields.io/npm/v/@thunderid/tanstack-router) | TanStack Router integration | diff --git a/packages/sveltekit/.gitignore b/packages/sveltekit/.gitignore new file mode 100644 index 0000000..5ee898e --- /dev/null +++ b/packages/sveltekit/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.svelte-kit/ +dist/ +*.log diff --git a/packages/sveltekit/README.md b/packages/sveltekit/README.md new file mode 100644 index 0000000..b59412b --- /dev/null +++ b/packages/sveltekit/README.md @@ -0,0 +1,83 @@ +![ThunderID SvelteKit SDK](https://raw.githubusercontent.com/thunder-id/thunderid/refs/heads/main/docs/static/assets/images/readme/repo-banner-sveltekit-sdk.png) + +SvelteKit SDK for ThunderID. Provides hooks, components, and server-side utilities for authentication in SvelteKit applications. + +## Installation + +```bash +npm install @thunderid/sveltekit +``` + +```bash +pnpm add @thunderid/sveltekit +``` + +```bash +yarn add @thunderid/sveltekit +``` + +## Quick Start + +### 1. Configure the server hook + +```ts +// src/hooks.server.ts +import {createThunderIDHandle} from '@thunderid/sveltekit/server'; + +export const handle = createThunderIDHandle({ + baseUrl: 'https://localhost:8090', + clientId: 'YOUR_CLIENT_ID', + clientSecret: 'YOUR_CLIENT_SECRET', + sessionSecret: 'YOUR_SESSION_SECRET', +}); +``` + +### 2. Load session data on the server + +```ts +// src/routes/+layout.server.ts +import {loadThunderID} from '@thunderid/sveltekit/server'; +import type {LayoutServerLoad} from './$types'; + +export const load: LayoutServerLoad = (event) => { + return {thunderid: loadThunderID(event)}; +}; +``` + +### 3. Wrap your app with the provider + +```svelte + + + + + {@render children()} + +``` + +### 4. Use components and hooks + +```svelte + + + + +

Welcome, {tid.user?.name}!

+ +
+ + + + +``` + +## License + +This project is licensed under the [Apache License 2.0](https://github.com/thunder-id/thunderid/blob/main/LICENSE). diff --git a/packages/sveltekit/eslint.config.js b/packages/sveltekit/eslint.config.js new file mode 100644 index 0000000..a6d562c --- /dev/null +++ b/packages/sveltekit/eslint.config.js @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import thunderIdPlugin from '@thunderid/eslint-plugin'; + +export default [ + { + ignores: ['.svelte-kit/**', 'dist/**', 'build/**', 'node_modules/**', 'coverage/**'], + }, + ...thunderIdPlugin.configs.typescript, +]; diff --git a/packages/sveltekit/package.json b/packages/sveltekit/package.json new file mode 100644 index 0000000..bc1da7d --- /dev/null +++ b/packages/sveltekit/package.json @@ -0,0 +1,78 @@ +{ + "name": "@thunderid/sveltekit", + "version": "0.1.0", + "description": "SvelteKit SDK for ThunderID โ€” Svelte 5 / SvelteKit authentication with CSR and SSR support", + "keywords": [ + "thunderid", + "svelte", + "sveltekit", + "auth", + "oauth", + "oidc" + ], + "homepage": "https://github.com/thunder-id/javascript-sdks/tree/main/packages/sveltekit#readme", + "bugs": { + "url": "https://github.com/thunder-id/thunderid/issues" + }, + "author": "WSO2", + "license": "Apache-2.0", + "type": "module", + "svelte": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "svelte": "./dist/index.js", + "default": "./dist/index.js" + }, + "./server": { + "types": "./dist/server/index.d.ts", + "default": "./dist/server/index.js" + } + }, + "files": [ + "dist", + "README.md", + "LICENSE" + ], + "scripts": { + "build": "pnpm clean:dist && svelte-package -i src -o 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 .", + "lint:fix": "eslint . --fix", + "test": "vitest --passWithNoTests", + "typecheck": "svelte-check --tsconfig ./tsconfig.lib.json" + }, + "devDependencies": { + "@sveltejs/kit": "catalog:", + "@sveltejs/package": "catalog:", + "@sveltejs/vite-plugin-svelte": "catalog:", + "@thunderid/eslint-plugin": "catalog:", + "@thunderid/prettier-config": "catalog:", + "@types/node": "catalog:", + "eslint": "catalog:", + "prettier": "catalog:", + "rimraf": "catalog:", + "svelte": "catalog:", + "svelte-check": "catalog:", + "typescript": "catalog:", + "vitest": "catalog:" + }, + "peerDependencies": { + "@sveltejs/kit": ">=2.0.0", + "svelte": ">=5.0.0" + }, + "dependencies": { + "@thunderid/browser": "workspace:^", + "@thunderid/node": "workspace:^", + "jose": "catalog:", + "tslib": "catalog:" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/sveltekit/src/ThunderID.svelte b/packages/sveltekit/src/ThunderID.svelte new file mode 100644 index 0000000..407cc5e --- /dev/null +++ b/packages/sveltekit/src/ThunderID.svelte @@ -0,0 +1,297 @@ + + +{@render children?.()} diff --git a/packages/sveltekit/src/ThunderIDSvelteClient.ts b/packages/sveltekit/src/ThunderIDSvelteClient.ts new file mode 100644 index 0000000..28959e6 --- /dev/null +++ b/packages/sveltekit/src/ThunderIDSvelteClient.ts @@ -0,0 +1,622 @@ +import { + ThunderIDBrowserClient, + type AuthClientConfig, + type BrandingPreference, + type GetBrandingPreferenceConfig, + type IdToken, + type SPATokenExchangeConfig, + type Storage, + type StorageManager, + type TokenResponse, + type UpdateMeProfileConfig, + type User, + type UserProfile, + getBrandingPreference, + updateMeProfile, +} from '@thunderid/browser'; +import {emit, on, off, clearListeners, SDKEvent} from './events/EventBus'; +import type {SDKEventListener} from './events/EventBus'; +import {IAMError, ErrorCode} from './errors/IAMError'; +import {getLogger, type LoggerAdapter} from './logger/LoggerAdapter'; +import {verifyIdToken, type IdTokenValidationResult} from './validation/IdTokenValidator'; +import {DefaultHTTPAdapter, type HTTPAdapter, type HTTPResponse} from './adapters/HTTPAdapter'; +import type {ThunderIDSvelteKitConfig} from './models/config'; + +class ThunderIDSvelteClient extends ThunderIDBrowserClient> { + private static instance: ThunderIDSvelteClient; + + private _clientInitialized = false; + private _isLoading = false; + private logger: LoggerAdapter = getLogger(); + private httpAdapter?: HTTPAdapter; + + private constructor() { + super(); + } + + public static getInstance(): ThunderIDSvelteClient { + if (!ThunderIDSvelteClient.instance) { + ThunderIDSvelteClient.instance = new ThunderIDSvelteClient(); + } + return ThunderIDSvelteClient.instance; + } + + override async isInitialized(): Promise { + return this._clientInitialized; + } + + override async initialize(config: ThunderIDSvelteKitConfig, storage?: Storage): Promise { + if (this._clientInitialized) { + throw new IAMError({ + code: ErrorCode.ALREADY_INITIALIZED, + message: 'ThunderID SDK is already initialized. Call reset() first if you need to re-initialize.', + }); + } + + if (!config.baseUrl) { + throw new IAMError({ + code: ErrorCode.INVALID_CONFIGURATION, + message: 'baseUrl is required. Set THUNDERID_BASE_URL environment variable or pass it in the config.', + }); + } + + if (!config.baseUrl.startsWith('https://')) { + throw new IAMError({ + code: ErrorCode.INVALID_CONFIGURATION, + message: 'baseUrl must use HTTPS.', + }); + } + + if (!config.clientId) { + throw new IAMError({ + code: ErrorCode.INVALID_CONFIGURATION, + message: 'clientId is required. Set THUNDERID_CLIENT_ID environment variable or pass it in the config.', + }); + } + + const authConfig: AuthClientConfig = { + afterSignInUrl: config.afterSignInUrl ?? '/', + afterSignOutUrl: config.afterSignOutUrl ?? '/', + allowedExternalUrls: config.allowedExternalUrls, + applicationId: config.applicationId, + baseUrl: config.baseUrl, + clientId: config.clientId, + clientSecret: config.clientSecret ?? undefined, + discovery: config.discovery, + enablePKCE: true, + endpoints: { + ...(config.discovery?.wellKnown?.enabled !== false + ? {wellKnown: `${config.baseUrl}/.well-known/openid-configuration`} + : {}), + ...(config.endpoints ?? {}), + } as any, + instanceId: config.instanceId, + mode: config.mode, + + platform: config.platform, + preferences: config.preferences, + prompt: config.prompt, + responseMode: config.responseMode, + scopes: config.scopes ?? ['openid'], + sendCookiesInRequests: config.sendCookiesInRequests, + sendIdTokenInLogoutRequest: config.sendIdTokenInLogoutRequest, + signInOptions: config.signInOptions, + signInUrl: config.signInUrl, + signOutOptions: config.signOutOptions, + signUpOptions: config.signUpOptions, + signUpUrl: config.signUpUrl, + storage: config.storage, + syncSession: config.syncSession, + tokenLifecycle: config.tokenLifecycle, + tokenRequest: config.tokenRequest ?? {authMethod: 'client_secret_post'}, + tokenValidation: config.tokenValidation, + } as AuthClientConfig; + + this.httpAdapter = config.httpAdapter; + + this._isLoading = true; + try { + await super.initialize(authConfig as any, storage); + + this._clientInitialized = true; + emit(SDKEvent.INITIALIZED); + return true; + } finally { + this._isLoading = false; + } + } + + override async reInitialize(config: Partial): Promise { + if (!this._clientInitialized) { + throw new IAMError({ + code: ErrorCode.SDK_NOT_INITIALIZED, + message: 'SDK is not initialized. Call initialize() first.', + }); + } + await super.reInitialize(config as any); + return true; + } + + async reset(): Promise { + this._clientInitialized = false; + this._isLoading = false; + try { + await super.clearSession(); + const sm = this.getStorageManager(); + await sm.removeConfigData(); + await sm.removeOIDCProviderMetaData(); + await sm.removeTemporaryData(); + await sm.removeHybridData(); + } catch { + // ignore โ€” session may not exist + } + } + + addEventListener(event: SDKEvent | string, listener: SDKEventListener): void { + on(event, listener); + } + + removeEventListener(event: SDKEvent | string, listener: SDKEventListener): void { + off(event, listener); + } + + clearEventListeners(event?: SDKEvent | string): void { + clearListeners(event); + } + + override isLoading(): boolean { + return this._isLoading; + } + + override getConfiguration(): AuthClientConfig { + return this.getStorageManager().getConfigData() as unknown as AuthClientConfig; + } + + override async signIn( + config?: any, + authorizationCode?: string, + sessionState?: string, + state?: string, + tokenRequestConfig?: {params: Record}, + onSuccess?: (user: any) => void, + ): Promise { + const arg0: unknown = config; + + if (typeof arg0 === 'object' && arg0 !== null) { + if ('_subject' in arg0 || 'stepType' in arg0) { + emit(SDKEvent.MFA_STEP_REQUIRED, { + message: 'App-Native (embedded) sign-in mode is not yet implemented. Multi-factor authentication steps will be emitted here in a future release.', + }); + throw new IAMError({ + code: ErrorCode.NOT_IMPLEMENTED, + message: 'App-Native (embedded) sign-in mode is not yet implemented. This will be available in a future release.', + }); + } + + if ('code' in arg0 || 'state' in arg0) { + const payload: {code?: unknown; session_state?: unknown; state?: unknown} = arg0 as { + code?: unknown; + session_state?: unknown; + state?: unknown; + }; + const code: string | undefined = typeof payload.code === 'string' ? payload.code : undefined; + const ss: string | undefined = typeof payload.session_state === 'string' ? payload.session_state : undefined; + const st: string | undefined = typeof payload.state === 'string' ? payload.state : undefined; + + try { + const user = await super.signIn(undefined, code, ss, st); + if (user && onSuccess) { + onSuccess(user); + } + return user; + } catch (err: unknown) { + emit(SDKEvent.SIGN_IN_FAILED, {error: err instanceof Error ? err.message : String(err)}); + throw err; + } + } + } + + const nonce: string = crypto.randomUUID(); + if (typeof sessionStorage !== 'undefined') { + sessionStorage.setItem('thunderid-nonce', nonce); + } + try { + const user = await super.signIn({...(config || {}), nonce}, authorizationCode, sessionState, state, tokenRequestConfig); + if (user) { + emit(SDKEvent.SIGN_IN, {user}); + onSuccess?.(user); + } + return user; + } catch (err: unknown) { + emit(SDKEvent.SIGN_IN_FAILED, {error: err instanceof Error ? err.message : String(err)}); + throw err; + } + } + + override async signOut(...args: any[]): Promise { + const configData: any = await this.getStorageManager().getConfigData(); + const afterSignOutUrl: string = + (configData?.afterSignOutUrl as string) || (configData?.afterSignInUrl as string) || '/'; + emit(SDKEvent.SIGN_OUT, {afterSignOutUrl}); + + return super.signOut(args[0], args[1], args[2]); + } + + override async revokeAccessToken(userId?: string): Promise { + // Bypass BrowserClient._validateMethod() which calls isSignedIn() without userId + const jsProto = Object.getPrototypeOf(ThunderIDBrowserClient.prototype); + return (jsProto as any).revokeAccessToken.call(this, userId); + } + + override async signUp(options?: Record): Promise { + const configData: any = await this.getStorageManager().getConfigData(); + const signUpUrl: string | undefined = configData?.signUpUrl as string | undefined; + const baseUrl: string | undefined = configData?.baseUrl as string | undefined; + const applicationId: string | undefined = configData?.applicationId as string | undefined; + + if (signUpUrl) { + window.location.href = signUpUrl; + return; + } + + if (baseUrl) { + let url: string = `${baseUrl}/accountrecoveryendpoint/register.do`; + if (applicationId) { + url += `?spId=${applicationId}`; + } + window.location.href = url; + return; + } + + throw new IAMError({ + code: ErrorCode.INVALID_CONFIGURATION, + message: 'Cannot sign up: no signUpUrl or baseUrl configured.', + }); + } + + override async signInSilently(_options?: Record): Promise { + if (!this._clientInitialized) { + throw new IAMError({ + code: ErrorCode.SDK_NOT_INITIALIZED, + message: 'SDK is not initialized. Call initialize() first.', + }); + } + + try { + const nonce: string = crypto.randomUUID(); + const authUrl: string = await this.getSignInUrl({...(_options as any), nonce}); + const url: URL = new URL(authUrl); + url.searchParams.set('prompt', 'none'); + const stateParam: string | null = url.searchParams.get('state'); + const origin: string = window.location.origin; + + const iframe: HTMLIFrameElement = document.createElement('iframe'); + iframe.style.display = 'none'; + document.body.appendChild(iframe); + + const code: string | null = await new Promise((resolve) => { + let attempts = 0; + + const interval = setInterval((): void => { + attempts++; + try { + const href: string | undefined = iframe.contentWindow?.location?.href; + if (href && href.startsWith(origin)) { + const parsed: URL = new URL(href); + const c: string | null = parsed.searchParams.get('code'); + if (c) { + clearInterval(interval); + resolve(c); + return; + } + if (parsed.searchParams.get('error')) { + clearInterval(interval); + resolve(null); + return; + } + } + } catch { + // cross-origin โ€” keep polling + } + if (attempts >= 100) { + clearInterval(interval); + resolve(null); + } + }, 100); + }); + + document.body.removeChild(iframe); + + if (code) { + await (this as any).requestAccessToken(code, '', stateParam ?? ''); + const idToken: string = await this.getIdToken(); + if (idToken) { + const payload: Record = await this.decodeJwtToken(idToken); + if (payload['nonce'] !== nonce) { + throw new IAMError({ + code: ErrorCode.AUTHENTICATION_FAILED, + message: 'ID token nonce mismatch in silent sign-in', + }); + } + } + const user: User = await this.getUser(); + emit(SDKEvent.SIGN_IN, {user}); + return user; + } + + return false; + } catch { + return false; + } + } + + async changePassword(_currentPassword?: string, _newPassword?: string): Promise { + const configData: any = await this.getStorageManager().getConfigData(); + const changePasswordUrl: string | undefined = configData?.changePasswordUrl as string | undefined; + const baseUrl: string | undefined = configData?.baseUrl as string | undefined; + + if (changePasswordUrl) { + window.location.href = changePasswordUrl; + return; + } + + if (baseUrl) { + window.location.href = `${baseUrl}/myaccount/security`; + return; + } + + throw new IAMError({ + code: ErrorCode.INVALID_CONFIGURATION, + message: 'Cannot change password: no changePasswordUrl or baseUrl configured.', + }); + } + + async forgotPassword(options?: Record): Promise { + const configData: any = await this.getStorageManager().getConfigData(); + const forgotPasswordUrl: string | undefined = configData?.forgotPasswordUrl as string | undefined; + const baseUrl: string | undefined = configData?.baseUrl as string | undefined; + const applicationId: string | undefined = configData?.applicationId as string | undefined; + + const effectiveUrl: string | undefined = forgotPasswordUrl ?? (options?.['forgotPasswordUrl'] as string | undefined); + + if (effectiveUrl) { + window.location.href = effectiveUrl; + return; + } + + if (baseUrl) { + let url: string = `${baseUrl}/accountrecoveryendpoint/recoverpassword.do`; + if (applicationId) { + url += `?spId=${applicationId}`; + } + window.location.href = url; + return; + } + + throw new IAMError({ + code: ErrorCode.INVALID_CONFIGURATION, + message: 'Cannot initiate password recovery: no forgotPasswordUrl or baseUrl configured.', + }); + } + + async forgotUsername(options?: Record): Promise { + const configData: any = await this.getStorageManager().getConfigData(); + const forgotUsernameUrl: string | undefined = configData?.forgotUsernameUrl as string | undefined; + const baseUrl: string | undefined = configData?.baseUrl as string | undefined; + const applicationId: string | undefined = configData?.applicationId as string | undefined; + + const effectiveUrl: string | undefined = forgotUsernameUrl ?? (options?.['forgotUsernameUrl'] as string | undefined); + + if (effectiveUrl) { + window.location.href = effectiveUrl; + return; + } + + if (baseUrl) { + let url: string = `${baseUrl}/accountrecoveryendpoint/recoverusername.do`; + if (applicationId) { + url += `?spId=${applicationId}`; + } + window.location.href = url; + return; + } + + throw new IAMError({ + code: ErrorCode.INVALID_CONFIGURATION, + message: 'Cannot initiate username recovery: no forgotUsernameUrl or baseUrl configured.', + }); + } + + override async decodeJwtToken>(token: string): Promise { + return super.decodeJwtToken(token); + } + + override async setSession(sessionData: Record, sessionId?: string): Promise { + return super.setSession(sessionData, sessionId); + } + + override clearSession(sessionId?: string): void { + super.clearSession(sessionId); + } + + override async updateUserProfile(payload: any, userId?: string): Promise { + const accessToken: string = await this.getAccessToken(userId); + const configData: any = await this.getStorageManager().getConfigData(); + const baseUrl: string = (configData?.baseUrl ?? '') as string; + + const updateConfig: UpdateMeProfileConfig = { + url: `${baseUrl}/scim2/Me`, + payload, + headers: {Authorization: `Bearer ${accessToken}`}, + }; + + return updateMeProfile(updateConfig) as Promise as Promise; + } + + async verifyIdToken( + idToken: string, + options?: { + clientId?: string; + issuer?: string; + clockTolerance?: number; + validateIssuer?: boolean; + nonce?: string; + }, + ): Promise { + const configData: any = await this.getStorageManager().getConfigData(); + return verifyIdToken(idToken, configData as ThunderIDSvelteKitConfig, options); + } + + public async getAuthorizeRequestUrl(customParams: Record, userId?: string): Promise { + return this.getSignInUrl(customParams, userId); + } + + async createOrganization( + payload: {description: string; name: string; orgHandle?: string; parentId: string; type: 'TENANT'}, + userId?: string, + ): Promise<{id: string; name: string; orgHandle: string; ref?: string; status?: string}> { + const configData: any = await this.getStorageManager().getConfigData(); + const baseUrl: string = (configData?.baseUrl ?? '') as string; + const accessToken: string = await this.getAccessToken(userId); + const adapter: HTTPAdapter = this.httpAdapter ?? new DefaultHTTPAdapter(); + const res: HTTPResponse = await adapter.request('POST', `${baseUrl}/api/server/v1/organizations`, { + Authorization: `Bearer ${accessToken}`, + 'Content-Type': 'application/json', + }, payload); + if (res.statusCode !== 201) { + throw new IAMError({ + code: ErrorCode.SERVER_ERROR, + message: `Failed to create organization: ${res.statusCode}`, + requestId: res.headers['x-request-id'] || res.headers['correlation-id'] || undefined, + statusCode: res.statusCode, + }); + } + return JSON.parse(res.body); + } + + async getOrganization( + organizationId: string, + userId?: string, + ): Promise<{ + attributes?: Record; created?: string; description?: string; id: string; + lastModified?: string; name: string; orgHandle: string; parent?: {id: string; ref: string}; + permissions?: string[]; status?: string; type?: string; + }> { + const configData: any = await this.getStorageManager().getConfigData(); + const baseUrl: string = (configData?.baseUrl ?? '') as string; + const accessToken: string = await this.getAccessToken(userId); + const adapter: HTTPAdapter = this.httpAdapter ?? new DefaultHTTPAdapter(); + const res: HTTPResponse = await adapter.request('GET', `${baseUrl}/api/server/v1/organizations/${organizationId}`, { + Authorization: `Bearer ${accessToken}`, + }); + if (res.statusCode !== 200) { + throw new IAMError({ + code: ErrorCode.SERVER_ERROR, + message: `Failed to fetch organization ${organizationId}: ${res.statusCode}`, + requestId: res.headers['x-request-id'] || res.headers['correlation-id'] || undefined, + statusCode: res.statusCode, + }); + } + return JSON.parse(res.body); + } + + async getUserInfo(sessionId?: string): Promise { + const accessToken: string = await this.getAccessToken(sessionId); + const configData: any = await this.getStorageManager().getConfigData(); + const baseUrl: string = (configData?.baseUrl ?? '') as string; + const adapter: HTTPAdapter = this.httpAdapter ?? new DefaultHTTPAdapter(); + const res: HTTPResponse = await adapter.request('GET', `${baseUrl}/oauth2/userinfo`, { + Authorization: `Bearer ${accessToken}`, + }); + if (res.statusCode !== 200) { + throw new IAMError({ + code: ErrorCode.AUTHENTICATION_FAILED, + message: `Failed to fetch user info: ${res.statusCode}`, + requestId: res.headers['x-request-id'] || res.headers['correlation-id'] || undefined, + statusCode: res.statusCode, + }); + } + return JSON.parse(res.body) as User; + } + + override async getUser(sessionId?: string): Promise { + // Bypass BrowserClient._validateMethod() which calls isSignedIn() without userId + const sessionData: any = await (this as any).storageManager.getSessionData(sessionId); + const user: any = (this as any).authHelper.getAuthenticatedUserInfo(sessionData?.id_token); + Object.keys(user).forEach((key: string) => { + if (user[key] === undefined || user[key] === '' || user[key] === null) { + delete user[key]; + } + }); + return user; + } + + override getAccessToken(sessionId?: string): Promise { + return super.getAccessToken(sessionId); + } + + override async getIdToken(sessionId?: string): Promise { + // Bypass BrowserClient._validateMethod() which calls isSignedIn() without userId + const sessionData = await (this as any).storageManager.getSessionData(sessionId); + return sessionData?.id_token; + } + + override async getDecodedIdToken(sessionId?: string, idToken?: string): Promise { + // Bypass BrowserClient._validateMethod() which calls isSignedIn() without userId + const sessionData = await (this as any).storageManager.getSessionData(sessionId); + const storedIdToken = sessionData?.id_token; + return (this as any).cryptoHelper.decodeJwtToken(storedIdToken ?? idToken) as Promise; + } + + override isSignedIn(sessionId?: string): Promise { + return super.isSignedIn(sessionId); + } + + override async exchangeToken(config: SPATokenExchangeConfig): Promise { + if (!config.id) { + return Promise.reject( + new Error('The custom grant request id not found. Set the `id` attribute on the token exchange config.'), + ); + } + + const response = await (this as any)._authHelper!.exchangeToken(config, (cfg: any) => + (this as any)._enableRetrievingSignOutURLFromSession(cfg), + ); + + const cb = (this as any)._onCustomGrant.get(config.id); + cb?.(response); + + return response; + } + + override async getUserProfile(sessionId?: string): Promise { + const user: User = await this.getUser(sessionId); + return {flattenedProfile: user, profile: user, schemas: []}; + } + + async exchangeCodeForTokens( + authorizationCode: string, + sessionState: string, + state: string, + userId: string, + ): Promise { + if (!this._clientInitialized) { + throw new IAMError({ + code: ErrorCode.SDK_NOT_INITIALIZED, + message: 'SDK is not initialized. Call initialize() first.', + }); + } + + return (this as any).requestAccessToken(authorizationCode, sessionState, state, userId); + } + + async getBrandingPreference(config: GetBrandingPreferenceConfig): Promise { + return getBrandingPreference(config); + } + + public override getStorageManager(): StorageManager> { + return super.getStorageManager() as StorageManager>; + } +} + +export default ThunderIDSvelteClient; diff --git a/packages/sveltekit/src/__tests__/ThunderIDSvelteClient.test.ts b/packages/sveltekit/src/__tests__/ThunderIDSvelteClient.test.ts new file mode 100644 index 0000000..bbf4e3b --- /dev/null +++ b/packages/sveltekit/src/__tests__/ThunderIDSvelteClient.test.ts @@ -0,0 +1,193 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {describe, it, expect, vi, beforeEach} from 'vitest'; + +vi.mock('@thunderid/browser', () => { + const getBrandingPreference = vi.fn().mockResolvedValue(null); + const updateMeProfile = vi.fn().mockResolvedValue({}); + + class MockBrowserClient { + private _initialized = false; + private _config: any = null; + private _storage: any = null; + + async initialize(config: any, storage?: any): Promise { + this._config = config; + this._storage = storage; + this._initialized = true; + return true; + } + + async reInitialize(_config: any): Promise { + return true; + } + + getStorageManager(): any { + return { + setSessionData: vi.fn().mockResolvedValue(undefined), + getSessionData: vi.fn().mockResolvedValue(null), + getConfigData: vi.fn().mockResolvedValue({baseUrl: 'https://example.com', clientId: 'cid'}), + }; + } + + isSignedIn(_sessionId?: string): Promise { + return Promise.resolve(true); + } + + getUser(_sessionId?: string): Promise { + return Promise.resolve({id: 'u1', name: 'Test User'}); + } + + getAccessToken(_sessionId?: string): Promise { + return Promise.resolve('mock-access-token'); + } + + getDecodedIdToken(_sessionId?: string, _idToken?: string): Promise { + return Promise.resolve({sub: 'user-001'}); + } + + getUserProfile(_sessionId: string): Promise { + return Promise.resolve({flattenedProfile: {id: 'u1'}, profile: {id: 'u1'}, schemas: []}); + } + + getSignInUrl(_customParams?: any, _userId?: string): Promise { + return Promise.resolve('https://idp.example.com/authorize'); + } + + exchangeToken(_config: any, _sessionId?: string): Promise { + return Promise.resolve({accessToken: 'new-at'}); + } + + signOut(_sessionId?: string): Promise { + return Promise.resolve('/'); + } + + revokeAccessToken(_userId?: string): Promise { + return Promise.resolve(true); + } + + getInstanceId(): number { + return 0; + } + + clearSession(_sessionId?: string): void { + // no-op + } + } + + return { + ThunderIDBrowserClient: MockBrowserClient, + getBrandingPreference, + updateMeProfile, + } as any; +}); + +const {default: ThunderIDSvelteClient} = await import('../ThunderIDSvelteClient'); + +describe('ThunderIDSvelteClient', () => { + beforeEach(() => { + (ThunderIDSvelteClient as any).instance = undefined; + }); + + describe('singleton', () => { + it('should return the same instance on getInstance()', () => { + const a = ThunderIDSvelteClient.getInstance(); + const b = ThunderIDSvelteClient.getInstance(); + expect(a).toBe(b); + }); + + it('should create new instances via constructor', () => { + const a = ThunderIDSvelteClient.getInstance(); + const b = new (ThunderIDSvelteClient as any)(); + expect(a).not.toBe(b); + }); + }); + + describe('reset', () => { + it('should reset initialized state', async () => { + const client = ThunderIDSvelteClient.getInstance(); + await client.initialize({baseUrl: 'https://example.com', clientId: 'cid'}); + expect(await client.isInitialized()).toBe(true); + await client.reset(); + expect(await client.isInitialized()).toBe(false); + }); + + it('should allow re-initialization after reset', async () => { + const client = ThunderIDSvelteClient.getInstance(); + await client.initialize({baseUrl: 'https://example.com', clientId: 'cid'}); + expect(await client.isInitialized()).toBe(true); + await client.reset(); + expect(await client.isInitialized()).toBe(false); + const r2 = await client.initialize({baseUrl: 'https://example.com', clientId: 'cid'}); + expect(r2).toBe(true); + expect(await client.isInitialized()).toBe(true); + }); + + it('should not throw when resetting uninitialized client', async () => { + const client = ThunderIDSvelteClient.getInstance(); + await expect(client.reset()).resolves.toBeUndefined(); + }); + }); + + describe('app-native signIn skeleton', () => { + it('should throw NOT_IMPLEMENTED for app-native payload with _subject', async () => { + const client = ThunderIDSvelteClient.getInstance(); + await client.initialize({baseUrl: 'https://example.com', clientId: 'cid'}); + const payload = {_subject: 'user', stepType: 'authenticate', authType: 'basic'}; + await expect(client.signIn(payload)).rejects.toThrow('not yet implemented'); + }); + + it('should throw NOT_IMPLEMENTED for app-native payload with stepType', async () => { + const client = ThunderIDSvelteClient.getInstance(); + await client.initialize({baseUrl: 'https://example.com', clientId: 'cid'}); + const payload = {stepType: 'authenticate', authType: 'basic', properties: {}}; + await expect(client.signIn(payload)).rejects.toThrow('not yet implemented'); + }); + }); + + describe('initialize', () => { + it('should initialize successfully with valid config', async () => { + const client = ThunderIDSvelteClient.getInstance(); + const r1 = await client.initialize({baseUrl: 'https://example.com', clientId: 'cid'}); + expect(r1).toBe(true); + expect(await client.isInitialized()).toBe(true); + }); + + it('should throw AlreadyInitialized on second call', async () => { + const client = ThunderIDSvelteClient.getInstance(); + await client.initialize({baseUrl: 'https://example.com', clientId: 'cid'}); + await expect(client.initialize({baseUrl: 'https://example.com', clientId: 'cid'})).rejects.toThrow(); + }); + + it('should throw InvalidConfiguration when baseUrl is missing', async () => { + const client = ThunderIDSvelteClient.getInstance(); + await expect(client.initialize({} as any)).rejects.toThrow(); + }); + + it('should throw InvalidConfiguration when baseUrl uses HTTP', async () => { + const client = ThunderIDSvelteClient.getInstance(); + await expect(client.initialize({baseUrl: 'http://example.com', clientId: 'cid'})).rejects.toThrow(); + }); + + it('should throw InvalidConfiguration when clientId is missing', async () => { + const client = ThunderIDSvelteClient.getInstance(); + await expect(client.initialize({baseUrl: 'https://example.com'} as any)).rejects.toThrow(); + }); + }); +}); diff --git a/packages/sveltekit/src/__tests__/sanitizer.test.ts b/packages/sveltekit/src/__tests__/sanitizer.test.ts new file mode 100644 index 0000000..1262331 --- /dev/null +++ b/packages/sveltekit/src/__tests__/sanitizer.test.ts @@ -0,0 +1,106 @@ +import {describe, it, expect} from 'vitest'; +import {sanitizeForLog, sanitizeTokenForLog} from '../logger/sanitizer'; + +describe('sanitizeForLog', () => { + it('should mask email addresses', () => { + expect(sanitizeForLog('user@example.com')).toBe('u***@*******.com'); + }); + + it('should mask phone numbers', () => { + const result = sanitizeForLog('+1 (555) 123-4567'); + expect(result).not.toContain('5551234567'); + expect(result).toContain('4567'); + }); + + it('should mask password in JSON format', () => { + const result = sanitizeForLog('{"password":"mySecret123"}'); + expect(result).toBe('{"password":"***"}'); + }); + + it('should mask newPassword in JSON format', () => { + const result = sanitizeForLog('{"newPassword":"newSecret456"}'); + expect(result).toBe('{"newPassword":"***"}'); + }); + + it('should mask currentPassword in JSON format', () => { + const result = sanitizeForLog('{"currentPassword":"oldPass789"}'); + expect(result).toBe('{"currentPassword":"***"}'); + }); + + it('should mask secret in JSON format', () => { + const result = sanitizeForLog('{"secret":"very-secret-value"}'); + expect(result).toBe('{"secret":"***"}'); + }); + + it('should mask otp in JSON format', () => { + const result = sanitizeForLog('{"otp":"123456"}'); + expect(result).toBe('{"otp":"***"}'); + }); + + it('should mask pin in JSON format', () => { + const result = sanitizeForLog('{"pin":"7890"}'); + expect(result).toBe('{"pin":"***"}'); + }); + + it('should mask verificationCode in JSON format', () => { + const result = sanitizeForLog('{"verificationCode":"abc123"}'); + expect(result).toBe('{"verificationCode":"***"}'); + }); + + it('should mask mfaToken in JSON format', () => { + const result = sanitizeForLog('{"mfaToken":"some-token"}'); + expect(result).toBe('{"mfaToken":"***"}'); + }); + + it('should mask password in query string format', () => { + const result = sanitizeForLog('password=mySecret123&grant_type=password'); + expect(result).toBe('password=***&grant_type=password'); + }); + + it('should mask otp in query string format', () => { + const result = sanitizeForLog('otp=123456&user=test'); + expect(result).toBe('otp=***&user=test'); + }); + + it('should mask code in query string format', () => { + const result = sanitizeForLog('code=abc123&state=xyz'); + expect(result).toBe('code=***&state=xyz'); + }); + + it('should mask secret in query string format', () => { + const result = sanitizeForLog('client_secret=supersecret&client_id=myapp'); + expect(result).toBe('client_secret=***&client_id=myapp'); + }); + + it('should mask multiple sensitive fields', () => { + const result = sanitizeForLog('{"password":"pass","otp":"123456","email":"test@example.com"}'); + expect(result).toContain('"password":"***"'); + expect(result).toContain('"otp":"***"'); + expect(result).toContain('"email"'); + expect(result).toMatch(/"password":"\*\*\*"/); + expect(result).not.toMatch(/"password":"pass"/); + expect(result).not.toContain('123456'); + }); + + it('should not modify safe strings', () => { + const safe = '{"name":"John","role":"admin"}'; + expect(sanitizeForLog(safe)).toBe(safe); + }); + + it('should not modify safe strings containing JWT-like patterns (inline tokens not masked by sanitizeForLog)', () => { + const msg = 'Processing token for user 123'; + expect(sanitizeForLog(msg)).toBe(msg); + }); +}); + +describe('sanitizeTokenForLog', () => { + it('should mask JWT token preserving header and first 8 chars of payload', () => { + const token = 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8'; + const result = sanitizeTokenForLog(token); + expect(result).toBe('eyJhbGciOiJIUzI1NiJ9.eyJzdWIi...'); + }); + + it('should return masked string for non-JWT input', () => { + expect(sanitizeTokenForLog('not-a-token')).toBe(''); + }); +}); diff --git a/packages/sveltekit/src/adapters/HTTPAdapter.ts b/packages/sveltekit/src/adapters/HTTPAdapter.ts new file mode 100644 index 0000000..3bfb8d3 --- /dev/null +++ b/packages/sveltekit/src/adapters/HTTPAdapter.ts @@ -0,0 +1,43 @@ +export interface HTTPResponse { + statusCode: number; + headers: Record; + body: string; +} + +export interface HTTPAdapter { + request(method: string, url: string, headers?: Record, body?: unknown): Promise; +} + +export class DefaultHTTPAdapter implements HTTPAdapter { + async request( + method: string, + url: string, + headers?: Record, + body?: unknown, + ): Promise { + const init: RequestInit = { + method, + headers: { + 'Content-Type': 'application/json', + ...headers, + }, + }; + + if (body !== undefined) { + init.body = typeof body === 'string' ? body : JSON.stringify(body); + } + + const response: Response = await fetch(url, init); + + const responseHeaders: Record = {}; + response.headers.forEach((value: string, key: string) => { + responseHeaders[key] = value; + }); + + return { + body: await response.text(), + headers: responseHeaders, + statusCode: response.status, + }; + } +} diff --git a/packages/sveltekit/src/adapters/StorageAdapter.ts b/packages/sveltekit/src/adapters/StorageAdapter.ts new file mode 100644 index 0000000..9053211 --- /dev/null +++ b/packages/sveltekit/src/adapters/StorageAdapter.ts @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface StorageAdapter { + getData(key: string): Promise; + setData(key: string, value: string): Promise; + removeData(key: string): Promise; + clear(): Promise; +} + +export class DefaultStorage implements StorageAdapter { + private store: Map = new Map(); + + async getData(key: string): Promise { + return this.store.get(key) ?? null; + } + + async setData(key: string, value: string): Promise { + this.store.set(key, value); + } + + async removeData(key: string): Promise { + this.store.delete(key); + } + + async clear(): Promise { + this.store.clear(); + } +} diff --git a/packages/sveltekit/src/adapters/index.ts b/packages/sveltekit/src/adapters/index.ts new file mode 100644 index 0000000..90a03b1 --- /dev/null +++ b/packages/sveltekit/src/adapters/index.ts @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export type {StorageAdapter} from './StorageAdapter'; +export {DefaultStorage} from './StorageAdapter'; +export type {HTTPAdapter, HTTPResponse} from './HTTPAdapter'; +export {DefaultHTTPAdapter} from './HTTPAdapter'; diff --git a/packages/sveltekit/src/api/getSchemas.ts b/packages/sveltekit/src/api/getSchemas.ts new file mode 100644 index 0000000..1728e76 --- /dev/null +++ b/packages/sveltekit/src/api/getSchemas.ts @@ -0,0 +1,30 @@ +import { + type Schema, + getSchemas as baseGetSchemas, + type GetSchemasConfig as BaseGetSchemasConfig, +} from '@thunderid/node'; + +export interface GetSchemasConfig extends Omit { + fetcher?: (url: string, config: RequestInit) => Promise; +} + +const getSchemas = async ({fetcher, ...requestConfig}: GetSchemasConfig): Promise => { + const defaultFetcher = async (url: string, config: RequestInit): Promise => { + const response: globalThis.Response = await fetch(url, config); + const data: unknown = await response.json(); + return { + json: () => Promise.resolve(data), + ok: response.ok, + status: response.status, + statusText: response.statusText, + text: () => Promise.resolve(typeof data === 'string' ? data : JSON.stringify(data)), + } as Response; + }; + + return baseGetSchemas({ + ...requestConfig, + fetcher: fetcher || defaultFetcher, + }); +}; + +export default getSchemas; diff --git a/packages/sveltekit/src/api/getScim2Me.ts b/packages/sveltekit/src/api/getScim2Me.ts new file mode 100644 index 0000000..7359624 --- /dev/null +++ b/packages/sveltekit/src/api/getScim2Me.ts @@ -0,0 +1,30 @@ +import { + type User, + getScim2Me as baseGetScim2Me, + type GetScim2MeConfig as BaseGetScim2MeConfig, +} from '@thunderid/node'; + +export interface GetScim2MeConfig extends Omit { + fetcher?: (url: string, config: RequestInit) => Promise; +} + +const getScim2Me = async ({fetcher, ...requestConfig}: GetScim2MeConfig): Promise => { + const defaultFetcher = async (url: string, config: RequestInit): Promise => { + const response: globalThis.Response = await fetch(url, config); + const data: unknown = await response.json(); + return { + json: () => Promise.resolve(data), + ok: response.ok, + status: response.status, + statusText: response.statusText, + text: () => Promise.resolve(typeof data === 'string' ? data : JSON.stringify(data)), + } as Response; + }; + + return baseGetScim2Me({ + ...requestConfig, + fetcher: fetcher || defaultFetcher, + }); +}; + +export default getScim2Me; diff --git a/packages/sveltekit/src/api/index.ts b/packages/sveltekit/src/api/index.ts new file mode 100644 index 0000000..ba2fe36 --- /dev/null +++ b/packages/sveltekit/src/api/index.ts @@ -0,0 +1,2 @@ +export {default as getSchemas} from './getSchemas'; +export {default as getScim2Me} from './getScim2Me'; diff --git a/packages/sveltekit/src/components/actions/BaseSignInButton.svelte b/packages/sveltekit/src/components/actions/BaseSignInButton.svelte new file mode 100644 index 0000000..fb4c655 --- /dev/null +++ b/packages/sveltekit/src/components/actions/BaseSignInButton.svelte @@ -0,0 +1,46 @@ + + +{@render children({loading, handleClick})} diff --git a/packages/sveltekit/src/components/actions/BaseSignOutButton.svelte b/packages/sveltekit/src/components/actions/BaseSignOutButton.svelte new file mode 100644 index 0000000..97372b1 --- /dev/null +++ b/packages/sveltekit/src/components/actions/BaseSignOutButton.svelte @@ -0,0 +1,45 @@ + + +{@render children({loading, handleClick})} diff --git a/packages/sveltekit/src/components/actions/BaseSignUpButton.svelte b/packages/sveltekit/src/components/actions/BaseSignUpButton.svelte new file mode 100644 index 0000000..be895d4 --- /dev/null +++ b/packages/sveltekit/src/components/actions/BaseSignUpButton.svelte @@ -0,0 +1,46 @@ + + +{@render children({loading, handleClick})} diff --git a/packages/sveltekit/src/components/actions/SignInButton.svelte b/packages/sveltekit/src/components/actions/SignInButton.svelte new file mode 100644 index 0000000..fd9e139 --- /dev/null +++ b/packages/sveltekit/src/components/actions/SignInButton.svelte @@ -0,0 +1,55 @@ + + + diff --git a/packages/sveltekit/src/components/actions/SignOutButton.svelte b/packages/sveltekit/src/components/actions/SignOutButton.svelte new file mode 100644 index 0000000..eb8c5c2 --- /dev/null +++ b/packages/sveltekit/src/components/actions/SignOutButton.svelte @@ -0,0 +1,54 @@ + + + diff --git a/packages/sveltekit/src/components/actions/SignUpButton.svelte b/packages/sveltekit/src/components/actions/SignUpButton.svelte new file mode 100644 index 0000000..1be2b5c --- /dev/null +++ b/packages/sveltekit/src/components/actions/SignUpButton.svelte @@ -0,0 +1,54 @@ + + + diff --git a/packages/sveltekit/src/components/auth/Callback.svelte b/packages/sveltekit/src/components/auth/Callback.svelte new file mode 100644 index 0000000..ecd93a5 --- /dev/null +++ b/packages/sveltekit/src/components/auth/Callback.svelte @@ -0,0 +1,122 @@ + + +{#if status === 'loading'} +
+ {#if loadingComponent} + {@render loadingComponent()} + {:else if children} + {@render children()} + {:else} + {tid.t('callback.signingIn')} + {/if} +
+{:else if status === 'error'} +
+ {#if errorComponent} + {@render errorComponent({error: error ?? ''})} + {:else} + {tid.t('callback.signInFailed', {error: error ?? ''})} + {/if} +
+{:else if status === 'success'} +
+ {#if children} + {@render children()} + {:else} + {tid.t('callback.signedIn')} + {/if} +
+{/if} diff --git a/packages/sveltekit/src/components/control/Loading.svelte b/packages/sveltekit/src/components/control/Loading.svelte new file mode 100644 index 0000000..7a8c1f1 --- /dev/null +++ b/packages/sveltekit/src/components/control/Loading.svelte @@ -0,0 +1,36 @@ + + +{#if tid.isLoading} + {@render children?.()} +{:else} + {@render fallback?.()} +{/if} diff --git a/packages/sveltekit/src/components/control/SignedIn.svelte b/packages/sveltekit/src/components/control/SignedIn.svelte new file mode 100644 index 0000000..e044cd7 --- /dev/null +++ b/packages/sveltekit/src/components/control/SignedIn.svelte @@ -0,0 +1,36 @@ + + +{#if tid.isSignedIn} + {@render children?.()} +{:else} + {@render fallback?.()} +{/if} diff --git a/packages/sveltekit/src/components/control/SignedOut.svelte b/packages/sveltekit/src/components/control/SignedOut.svelte new file mode 100644 index 0000000..df2dda9 --- /dev/null +++ b/packages/sveltekit/src/components/control/SignedOut.svelte @@ -0,0 +1,36 @@ + + +{#if !tid.isSignedIn} + {@render children?.()} +{:else} + {@render fallback?.()} +{/if} diff --git a/packages/sveltekit/src/components/presentation/AcceptInvite.svelte b/packages/sveltekit/src/components/presentation/AcceptInvite.svelte new file mode 100644 index 0000000..9f5952d --- /dev/null +++ b/packages/sveltekit/src/components/presentation/AcceptInvite.svelte @@ -0,0 +1,31 @@ + + + + {#snippet children({acceptInvite, loading, error})} + {#if customChildren} + {@render customChildren({acceptInvite, loading, error})} + {:else} +
+

{tid.t('acceptInvite.title')}

+ {#if error} + + {/if} + +
+ {/if} + {/snippet} +
diff --git a/packages/sveltekit/src/components/presentation/BaseAcceptInvite.svelte b/packages/sveltekit/src/components/presentation/BaseAcceptInvite.svelte new file mode 100644 index 0000000..c0c1a83 --- /dev/null +++ b/packages/sveltekit/src/components/presentation/BaseAcceptInvite.svelte @@ -0,0 +1,25 @@ + + +{@render children({acceptInvite, loading, error})} diff --git a/packages/sveltekit/src/components/presentation/BaseInviteUser.svelte b/packages/sveltekit/src/components/presentation/BaseInviteUser.svelte new file mode 100644 index 0000000..d4bf5de --- /dev/null +++ b/packages/sveltekit/src/components/presentation/BaseInviteUser.svelte @@ -0,0 +1,24 @@ + + +{@render children({inviteUser, loading, error})} diff --git a/packages/sveltekit/src/components/presentation/BaseLanguageSwitcher.svelte b/packages/sveltekit/src/components/presentation/BaseLanguageSwitcher.svelte new file mode 100644 index 0000000..2a9cfba --- /dev/null +++ b/packages/sveltekit/src/components/presentation/BaseLanguageSwitcher.svelte @@ -0,0 +1,16 @@ + + +{@render children({currentLanguage, switchLanguage, languages})} diff --git a/packages/sveltekit/src/components/presentation/BaseSignIn.svelte b/packages/sveltekit/src/components/presentation/BaseSignIn.svelte new file mode 100644 index 0000000..7b15524 --- /dev/null +++ b/packages/sveltekit/src/components/presentation/BaseSignIn.svelte @@ -0,0 +1,29 @@ + + +{@render children({signIn: handleSignIn, loading, error})} diff --git a/packages/sveltekit/src/components/presentation/BaseSignUp.svelte b/packages/sveltekit/src/components/presentation/BaseSignUp.svelte new file mode 100644 index 0000000..7abf5de --- /dev/null +++ b/packages/sveltekit/src/components/presentation/BaseSignUp.svelte @@ -0,0 +1,29 @@ + + +{@render children({signUp: handleSignUp, loading, error})} diff --git a/packages/sveltekit/src/components/presentation/BaseUser.svelte b/packages/sveltekit/src/components/presentation/BaseUser.svelte new file mode 100644 index 0000000..a18bed2 --- /dev/null +++ b/packages/sveltekit/src/components/presentation/BaseUser.svelte @@ -0,0 +1,16 @@ + + +{@render children({user: userData, isSignedIn: signedIn})} diff --git a/packages/sveltekit/src/components/presentation/BaseUserDropdown.svelte b/packages/sveltekit/src/components/presentation/BaseUserDropdown.svelte new file mode 100644 index 0000000..878d5ad --- /dev/null +++ b/packages/sveltekit/src/components/presentation/BaseUserDropdown.svelte @@ -0,0 +1,56 @@ + + +{@render children({user: userData, isSignedIn: tid.isSignedIn, open, toggle, close, triggerRef, menuRef, triggerId, menuId, signOut: tid.signOut, handleTriggerKeydown, handleMenuKeydown})} diff --git a/packages/sveltekit/src/components/presentation/BaseUserProfile.svelte b/packages/sveltekit/src/components/presentation/BaseUserProfile.svelte new file mode 100644 index 0000000..0ea1cf7 --- /dev/null +++ b/packages/sveltekit/src/components/presentation/BaseUserProfile.svelte @@ -0,0 +1,13 @@ + + +{@render children({profile: tid.userProfile, user: tid.user})} diff --git a/packages/sveltekit/src/components/presentation/InviteUser.svelte b/packages/sveltekit/src/components/presentation/InviteUser.svelte new file mode 100644 index 0000000..0240694 --- /dev/null +++ b/packages/sveltekit/src/components/presentation/InviteUser.svelte @@ -0,0 +1,43 @@ + + + + {#snippet children({inviteUser, loading, error})} + {#if customChildren} + {@render customChildren({inviteUser, loading, error})} + {:else} +
+

{tid.t('inviteUser.title')}

+ {#if error} + + {/if} + + +
+ {/if} + {/snippet} +
diff --git a/packages/sveltekit/src/components/presentation/LanguageSwitcher.svelte b/packages/sveltekit/src/components/presentation/LanguageSwitcher.svelte new file mode 100644 index 0000000..8ebdb23 --- /dev/null +++ b/packages/sveltekit/src/components/presentation/LanguageSwitcher.svelte @@ -0,0 +1,27 @@ + + + + {#snippet children({currentLanguage, switchLanguage, languages})} + {#if customChildren} + {@render customChildren({currentLanguage, switchLanguage, languages})} + {:else} + + {/if} + {/snippet} + diff --git a/packages/sveltekit/src/components/presentation/SignIn.svelte b/packages/sveltekit/src/components/presentation/SignIn.svelte new file mode 100644 index 0000000..8c5bcf9 --- /dev/null +++ b/packages/sveltekit/src/components/presentation/SignIn.svelte @@ -0,0 +1,59 @@ + + +{#if children} + {@render children({signIn: handleSignIn, loading})} +{:else} + +{/if} diff --git a/packages/sveltekit/src/components/presentation/SignUp.svelte b/packages/sveltekit/src/components/presentation/SignUp.svelte new file mode 100644 index 0000000..b8df963 --- /dev/null +++ b/packages/sveltekit/src/components/presentation/SignUp.svelte @@ -0,0 +1,59 @@ + + +{#if children} + {@render children({signUp: handleSignUp, loading})} +{:else} + +{/if} diff --git a/packages/sveltekit/src/components/presentation/User.svelte b/packages/sveltekit/src/components/presentation/User.svelte new file mode 100644 index 0000000..cffb361 --- /dev/null +++ b/packages/sveltekit/src/components/presentation/User.svelte @@ -0,0 +1,42 @@ + + +{#if children} + {@render children({user: userData, isSignedIn: signedIn})} +{:else if signedIn && userData} +
+ {userData['displayName'] ?? userData['userName'] ?? tid.t('user.displayName')} +
+{:else} +
{tid.t('user.notSignedIn')}
+{/if} diff --git a/packages/sveltekit/src/components/presentation/UserDropdown.svelte b/packages/sveltekit/src/components/presentation/UserDropdown.svelte new file mode 100644 index 0000000..09b9c6c --- /dev/null +++ b/packages/sveltekit/src/components/presentation/UserDropdown.svelte @@ -0,0 +1,52 @@ + + + + {#snippet children({user, isSignedIn, open, toggle, close, triggerRef, menuRef, triggerId, menuId, signOut, handleTriggerKeydown, handleMenuKeydown})} + {#if customChildren} + {@render customChildren({user, isSignedIn, open, toggle, close, triggerRef, menuRef, triggerId, menuId, signOut, handleTriggerKeydown, handleMenuKeydown})} + {:else if isSignedIn} +
+ + {#if open} + + {/if} +
+ {/if} + {/snippet} +
diff --git a/packages/sveltekit/src/components/presentation/UserProfile.svelte b/packages/sveltekit/src/components/presentation/UserProfile.svelte new file mode 100644 index 0000000..00d058d --- /dev/null +++ b/packages/sveltekit/src/components/presentation/UserProfile.svelte @@ -0,0 +1,44 @@ + + +{#if children} + {@render children({profile: tid.userProfile, user: tid.user})} +{:else} + +{/if} diff --git a/packages/sveltekit/src/composables/useThunderID.ts b/packages/sveltekit/src/composables/useThunderID.ts new file mode 100644 index 0000000..343f956 --- /dev/null +++ b/packages/sveltekit/src/composables/useThunderID.ts @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {getThunderIDContext} from '../context'; +import type {ThunderIDContext} from '../models/contexts'; +import {authState} from '../state.svelte'; + +export function useThunderID(): ThunderIDContext { + const context = getThunderIDContext(); + + return { + ...context, + get brandingPreference() { + return context.brandingPreference; + }, + get isSignedIn() { + return authState.isSignedIn; + }, + get isLoading() { + return authState.isLoading; + }, + get isInitialized() { + return authState.isInitialized; + }, + get user() { + return authState.user; + }, + get userProfile() { + return authState.userProfile; + }, + + get resolvedBaseUrl() { + return authState.resolvedBaseUrl; + }, + get locale() { + return authState.locale; + }, + }; +} diff --git a/packages/sveltekit/src/composables/useUser.ts b/packages/sveltekit/src/composables/useUser.ts new file mode 100644 index 0000000..fe168d6 --- /dev/null +++ b/packages/sveltekit/src/composables/useUser.ts @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {getUserContext} from '../context'; +import type {UserContextValue} from '../models/contexts'; +import {authState} from '../state.svelte'; + +export function useUser(): UserContextValue { + const context = getUserContext(); + + return { + ...context, + get profile() { + return authState.userProfile; + }, + get flattenedProfile() { + return authState.user; + }, + get schemas() { + return authState.userProfile?.schemas ?? null; + }, + }; +} diff --git a/packages/sveltekit/src/context.ts b/packages/sveltekit/src/context.ts new file mode 100644 index 0000000..cec8042 --- /dev/null +++ b/packages/sveltekit/src/context.ts @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {getContext, setContext} from 'svelte'; +import type {ThunderIDContext, UserContextValue} from './models/contexts'; + +export const THUNDERID_KEY = Symbol('thunderid'); +export const USER_KEY = Symbol('thunderid-user'); + +export function setThunderIDContext(context: ThunderIDContext): void { + setContext(THUNDERID_KEY, context); +} + +export function getThunderIDContext(): ThunderIDContext { + const context = getContext(THUNDERID_KEY); + if (!context) { + throw new Error( + '[ThunderID] No ThunderID context found. Ensure you are inside a provider component.', + ); + } + return context; +} + +export function setUserContext(context: UserContextValue): void { + setContext(USER_KEY, context); +} + +export function getUserContext(): UserContextValue { + const context = getContext(USER_KEY); + if (!context) { + throw new Error( + '[ThunderID] useUser() was called outside of . ' + + 'Make sure to wrap your app with the ThunderID provider.', + ); + } + return context; +} diff --git a/packages/sveltekit/src/errors/IAMError.ts b/packages/sveltekit/src/errors/IAMError.ts new file mode 100644 index 0000000..c30c393 --- /dev/null +++ b/packages/sveltekit/src/errors/IAMError.ts @@ -0,0 +1,67 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export enum ErrorCode { + SDK_NOT_INITIALIZED = 'SDK_NOT_INITIALIZED', + ALREADY_INITIALIZED = 'ALREADY_INITIALIZED', + INVALID_CONFIGURATION = 'INVALID_CONFIGURATION', + INVALID_REDIRECT_URI = 'INVALID_REDIRECT_URI', + AUTHENTICATION_FAILED = 'AUTHENTICATION_FAILED', + USER_ACCOUNT_LOCKED = 'USER_ACCOUNT_LOCKED', + USER_ACCOUNT_DISABLED = 'USER_ACCOUNT_DISABLED', + SESSION_EXPIRED = 'SESSION_EXPIRED', + MFA_REQUIRED = 'MFA_REQUIRED', + MFA_FAILED = 'MFA_FAILED', + INVALID_GRANT = 'INVALID_GRANT', + CONSENT_REQUIRED = 'CONSENT_REQUIRED', + USER_ALREADY_EXISTS = 'USER_ALREADY_EXISTS', + INVALID_INPUT = 'INVALID_INPUT', + INVITATION_CODE_INVALID = 'INVITATION_CODE_INVALID', + INVITATION_CODE_EXPIRED = 'INVITATION_CODE_EXPIRED', + REGISTRATION_DISABLED = 'REGISTRATION_DISABLED', + RECOVERY_FAILED = 'RECOVERY_FAILED', + CONFIRMATION_CODE_INVALID = 'CONFIRMATION_CODE_INVALID', + CONFIRMATION_CODE_EXPIRED = 'CONFIRMATION_CODE_EXPIRED', + NETWORK_ERROR = 'NETWORK_ERROR', + REQUEST_TIMEOUT = 'REQUEST_TIMEOUT', + SERVER_ERROR = 'SERVER_ERROR', + UNKNOWN_ERROR = 'UNKNOWN_ERROR', + NOT_IMPLEMENTED = 'NOT_IMPLEMENTED', +} + +export class IAMError extends Error { + public readonly code: ErrorCode; + public readonly requestId?: string; + public override readonly cause?: Error; + public readonly statusCode?: number; + + constructor(opts: { + code: ErrorCode; + message: string; + cause?: Error; + requestId?: string; + statusCode?: number; + }) { + super(opts.message); + this.name = 'IAMError'; + this.code = opts.code; + this.cause = opts.cause; + this.requestId = opts.requestId; + this.statusCode = opts.statusCode; + } +} diff --git a/packages/sveltekit/src/errors/index.ts b/packages/sveltekit/src/errors/index.ts new file mode 100644 index 0000000..04fb294 --- /dev/null +++ b/packages/sveltekit/src/errors/index.ts @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export {IAMError, ErrorCode} from './IAMError'; +export type {ErrorCode as ErrorCodeType} from './IAMError'; diff --git a/packages/sveltekit/src/events/EventBus.ts b/packages/sveltekit/src/events/EventBus.ts new file mode 100644 index 0000000..f77e7ee --- /dev/null +++ b/packages/sveltekit/src/events/EventBus.ts @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {getLogger} from '../logger/LoggerAdapter'; + +export enum SDKEvent { + SIGN_IN = 'signIn', + SIGN_IN_FAILED = 'signInFailed', + SIGN_OUT = 'signOut', + SIGN_UP = 'signUp', + SESSION_EXPIRED = 'sessionExpired', + TOKEN_REFRESHED = 'tokenRefreshed', + TOKEN_REFRESH_FAILED = 'tokenRefreshFailed', + MFA_STEP_REQUIRED = 'mfaStepRequired', + + INITIALIZED = 'initialized', + ERROR = 'error', +} + +export type SDKEventListener = (data?: unknown) => void; + +type EventHandlers = Map>; + +let _handlers: EventHandlers = new Map(); + +export function on(event: SDKEvent | string, listener: SDKEventListener): void { + const key: string = typeof event === 'string' ? event : event; + if (!_handlers.has(key)) { + _handlers.set(key, new Set()); + } + _handlers.get(key)!.add(listener); +} + +export function off(event: SDKEvent | string, listener: SDKEventListener): void { + const key: string = typeof event === 'string' ? event : event; + _handlers.get(key)?.delete(listener); +} + +export function emit(event: SDKEvent | string, data?: unknown): void { + const key: string = typeof event === 'string' ? event : event; + const logger = getLogger(); + _handlers.get(key)?.forEach((listener: SDKEventListener) => { + try { + listener(data); + } catch (error: unknown) { + logger.warn(`[EventBus] Listener error for event "${key}": ${(error as any)?.message ?? String(error)}`); + } + }); +} + +export function clearListeners(event?: SDKEvent | string): void { + if (event) { + _handlers.delete(typeof event === 'string' ? event : event); + } else { + _handlers.clear(); + } +} diff --git a/packages/sveltekit/src/events/index.ts b/packages/sveltekit/src/events/index.ts new file mode 100644 index 0000000..05e30a2 --- /dev/null +++ b/packages/sveltekit/src/events/index.ts @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export {SDKEvent, on, off, emit, clearListeners} from './EventBus'; +export type {SDKEventListener} from './EventBus'; diff --git a/packages/sveltekit/src/i18n/index.ts b/packages/sveltekit/src/i18n/index.ts new file mode 100644 index 0000000..c67b9ea --- /dev/null +++ b/packages/sveltekit/src/i18n/index.ts @@ -0,0 +1,2 @@ +export {createTranslator, DEFAULT_BUNDLES} from './translations'; +export type {TranslationBundle, TranslationBundles} from './translations'; diff --git a/packages/sveltekit/src/i18n/translations.ts b/packages/sveltekit/src/i18n/translations.ts new file mode 100644 index 0000000..7e58c0a --- /dev/null +++ b/packages/sveltekit/src/i18n/translations.ts @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import type {I18nPreferences} from '../models/config'; + +export type TranslationBundle = Record; + +export interface TranslationBundles { + [locale: string]: TranslationBundle; +} + +export const DEFAULT_BUNDLES: TranslationBundles = { + en: { + 'signIn.button': 'Sign In', + 'signIn.loading': 'Signing in...', + 'signIn.title': 'Sign In', + 'signIn.error': 'Sign in failed: {{error}}', + 'signOut.button': 'Sign Out', + 'signOut.loading': 'Signing out...', + 'signUp.button': 'Sign Up', + 'signUp.loading': 'Redirecting...', + 'signUp.title': 'Create Account', + 'signUp.error': 'Sign up failed: {{error}}', + 'user.notSignedIn': 'Not signed in', + 'user.displayName': 'User', + 'userProfile.empty': 'No user profile available.', + 'callback.signingIn': 'Signing you in...', + 'callback.signedIn': 'Signed in successfully! Redirecting...', + 'callback.signInFailed': 'Sign-in failed: {{error}}', + 'callback.noCode': 'No authorization code received.', + 'acceptInvite.title': 'Accept Invitation', + 'acceptInvite.button': 'Accept Invitation', + 'acceptInvite.loading': 'Accepting...', + 'inviteUser.title': 'Invite User', + 'inviteUser.button': 'Send Invitation', + 'inviteUser.loading': 'Sending...', + 'inviteUser.emailPlaceholder': 'email@example.com', + 'userDropdown.signOut': 'Sign Out', + }, +}; + +export function createTranslator(preferences?: I18nPreferences): (key: string, params?: Record) => string { + const lang = preferences?.language ?? 'en'; + const fallback = preferences?.fallbackLanguage ?? 'en'; + const userBundles = preferences?.bundles ?? {}; + const mergedBundles: TranslationBundles = {}; + + for (const locale of new Set([...Object.keys(DEFAULT_BUNDLES), ...Object.keys(userBundles)])) { + mergedBundles[locale] = {...DEFAULT_BUNDLES[locale], ...userBundles[locale]}; + } + + return (key: string, params?: Record): string => { + let text = mergedBundles[lang]?.[key] ?? mergedBundles[fallback]?.[key] ?? key; + if (params) { + for (const [k, v] of Object.entries(params)) { + text = text.replace(`{{${k}}}`, String(v)); + } + } + return text; + }; +} diff --git a/packages/sveltekit/src/index.ts b/packages/sveltekit/src/index.ts new file mode 100644 index 0000000..5bb06eb --- /dev/null +++ b/packages/sveltekit/src/index.ts @@ -0,0 +1,114 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// โ”€โ”€ Components โ”€โ”€ +export {default as ThunderID} from './ThunderID.svelte'; +export {default as SignedIn} from './components/control/SignedIn.svelte'; +export {default as SignedOut} from './components/control/SignedOut.svelte'; +export {default as Loading} from './components/control/Loading.svelte'; +export {default as SignInButton} from './components/actions/SignInButton.svelte'; +export {default as SignOutButton} from './components/actions/SignOutButton.svelte'; +export {default as SignUpButton} from './components/actions/SignUpButton.svelte'; +export {default as Callback} from './components/auth/Callback.svelte'; +export {default as BaseSignInButton} from './components/actions/BaseSignInButton.svelte'; +export {default as BaseSignOutButton} from './components/actions/BaseSignOutButton.svelte'; +export {default as BaseSignUpButton} from './components/actions/BaseSignUpButton.svelte'; + +// โ”€โ”€ Presentation Components โ”€โ”€ +export {default as UserProfile} from './components/presentation/UserProfile.svelte'; +export {default as BaseUserProfile} from './components/presentation/BaseUserProfile.svelte'; +export {default as User} from './components/presentation/User.svelte'; +export {default as BaseUser} from './components/presentation/BaseUser.svelte'; +export {default as SignIn} from './components/presentation/SignIn.svelte'; +export {default as BaseSignIn} from './components/presentation/BaseSignIn.svelte'; +export {default as SignUp} from './components/presentation/SignUp.svelte'; +export {default as BaseSignUp} from './components/presentation/BaseSignUp.svelte'; +export {default as AcceptInvite} from './components/presentation/AcceptInvite.svelte'; +export {default as BaseAcceptInvite} from './components/presentation/BaseAcceptInvite.svelte'; +export {default as InviteUser} from './components/presentation/InviteUser.svelte'; +export {default as BaseInviteUser} from './components/presentation/BaseInviteUser.svelte'; +export {default as UserDropdown} from './components/presentation/UserDropdown.svelte'; +export {default as BaseUserDropdown} from './components/presentation/BaseUserDropdown.svelte'; +export {default as LanguageSwitcher} from './components/presentation/LanguageSwitcher.svelte'; +export {default as BaseLanguageSwitcher} from './components/presentation/BaseLanguageSwitcher.svelte'; + +// โ”€โ”€ Client โ”€โ”€ +export {default as ThunderIDSvelteClient} from './ThunderIDSvelteClient'; + +// โ”€โ”€ Context โ”€โ”€ +export {THUNDERID_KEY, USER_KEY, setThunderIDContext, setUserContext} from './context'; + +// โ”€โ”€ Composables โ”€โ”€ +export {useThunderID} from './composables/useThunderID'; +export {useUser} from './composables/useUser'; + +// โ”€โ”€ State โ”€โ”€ +export {authState} from './state.svelte'; + +// โ”€โ”€ Models / Types โ”€โ”€ +export type {ThunderIDSvelteKitConfig, ThunderIDSveltePreferences, ThemePreferences, I18nPreferences} from './models/config'; +export type {ThunderIDSSRData, ThunderIDSessionPayload} from './models/session'; +export type {BrandingPreference} from '@thunderid/browser'; +export type {ThunderIDContext, UserContextValue, NavigateFn} from './models/contexts'; + +// โ”€โ”€ Errors โ”€โ”€ +export {IAMError, ErrorCode} from './errors/IAMError'; + +// โ”€โ”€ Logger โ”€โ”€ +export {DefaultLogger, setLogger, getLogger} from './logger/LoggerAdapter'; +export type {LoggerAdapter} from './logger/LoggerAdapter'; +export {sanitizeForLog, sanitizeTokenForLog} from './logger/sanitizer'; + +// โ”€โ”€ Adapters โ”€โ”€ +export type {StorageAdapter} from './adapters/StorageAdapter'; +export {DefaultStorage} from './adapters/StorageAdapter'; +export type {HTTPAdapter, HTTPResponse} from './adapters/HTTPAdapter'; +export {DefaultHTTPAdapter} from './adapters/HTTPAdapter'; + +// โ”€โ”€ Events โ”€โ”€ +export {SDKEvent, on, off, emit, clearListeners} from './events/EventBus'; +export type {SDKEventListener} from './events/EventBus'; + +// โ”€โ”€ Validation โ”€โ”€ +export {verifyIdToken, validateIdTokenClaims, clearJWKSCache} from './validation/IdTokenValidator'; +export type {IdTokenValidationResult} from './validation/IdTokenValidator'; + +// โ”€โ”€ i18n โ”€โ”€ +export {createTranslator, DEFAULT_BUNDLES} from './i18n/translations'; +export type {TranslationBundle, TranslationBundles} from './i18n/translations'; + +// โ”€โ”€ Server โ”€โ”€ +export {createThunderIDHandle, loadThunderID} from './server/hooks'; +export {resolveConfig} from './server/config'; +export {requireServerSession, isGuardRedirect, GuardRedirect} from './server/guard'; +export {getClient, resetClient} from './server/getClient'; +export {getValidAccessToken, maybeRefreshToken} from './server/refresh'; +export {createSignInHandler} from './server/routes/signin'; +export {createCallbackHandler} from './server/routes/callback'; +export {createSignOutHandler} from './server/routes/signout'; +export { + createSessionToken, + createTempSessionToken, + verifySessionToken, + verifyTempSessionToken, + getSessionCookieName, + getTempSessionCookieName, + getSessionCookieOptions, + getTempSessionCookieOptions, + issueSessionCookie, +} from './server/session'; diff --git a/packages/sveltekit/src/logger/LoggerAdapter.ts b/packages/sveltekit/src/logger/LoggerAdapter.ts new file mode 100644 index 0000000..43b979e --- /dev/null +++ b/packages/sveltekit/src/logger/LoggerAdapter.ts @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {sanitizeForLog} from './sanitizer'; + +/* eslint-disable no-console -- DefaultLogger intentionally wraps console as the default log transport */ + +export interface LoggerAdapter { + debug(message: string, context?: Record): void; + info(message: string, context?: Record): void; + warn(message: string, context?: Record): void; + error(message: string, error?: Error, context?: Record): void; +} + +export class DefaultLogger implements LoggerAdapter { + private prefix: string; + + constructor(prefix = '[thunderid]') { + this.prefix = prefix; + } + + debug(message: string, context?: Record): void { + console.debug(this.prefix, sanitizeForLog(message), this.sanitizeContext(context)); + } + + info(message: string, context?: Record): void { + console.info(this.prefix, sanitizeForLog(message), this.sanitizeContext(context)); + } + + warn(message: string, context?: Record): void { + console.warn(this.prefix, sanitizeForLog(message), this.sanitizeContext(context)); + } + + error(message: string, error?: Error, context?: Record): void { + console.error(this.prefix, sanitizeForLog(message), error ?? '', this.sanitizeContext(context)); + } + + private sanitizeContext(context?: Record): Record | undefined { + if (!context) return undefined; + const sanitized: Record = {}; + for (const [key, value] of Object.entries(context)) { + if (typeof value === 'string') { + sanitized[key] = sanitizeForLog(value); + } else { + sanitized[key] = value; + } + } + return sanitized; + } +} + +let _logger: LoggerAdapter = new DefaultLogger(); + +export function setLogger(logger: LoggerAdapter): void { + _logger = logger; +} + +export function getLogger(): LoggerAdapter { + return _logger; +} diff --git a/packages/sveltekit/src/logger/index.ts b/packages/sveltekit/src/logger/index.ts new file mode 100644 index 0000000..39ff4f6 --- /dev/null +++ b/packages/sveltekit/src/logger/index.ts @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export {DefaultLogger, setLogger, getLogger} from './LoggerAdapter'; +export type {LoggerAdapter} from './LoggerAdapter'; +export {sanitizeForLog, sanitizeTokenForLog} from './sanitizer'; diff --git a/packages/sveltekit/src/logger/sanitizer.ts b/packages/sveltekit/src/logger/sanitizer.ts new file mode 100644 index 0000000..b308b4c --- /dev/null +++ b/packages/sveltekit/src/logger/sanitizer.ts @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +const TOKEN_PATTERN = /^[A-Za-z0-9\-_.]+\.[A-Za-z0-9\-_.]+\.[A-Za-z0-9\-_.]+$/; +const EMAIL_PATTERN = /([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/g; +const PHONE_PATTERN = /(\+?\d[\d\s\-().]{6,}\d)/g; +const SENSITIVE_JSON_FIELD_PATTERN = /"(password|newPassword|currentPassword|secret|otp|pin|verificationCode|mfaToken)"\s*:\s*"[^"]+"/gi; +const SENSITIVE_PARAM_PATTERN = /(password|secret|otp|pin|code)=[^&\s]+/gi; + +export function sanitizeForLog(input: string): string { + let result: string = input; + + result = result.replace(EMAIL_PATTERN, (_match: string, local: string, domain: string) => { + const maskedLocal: string = local.length > 1 ? local[0] + '*'.repeat(local.length - 1) : local[0]; + const domainParts: string[] = domain.split('.'); + const maskedDomain: string = domainParts.map((part: string, i: number) => + i === domainParts.length - 1 ? part : '*'.repeat(part.length), + ).join('.'); + return `${maskedLocal}@${maskedDomain}`; + }); + + result = result.replace(PHONE_PATTERN, (match: string) => { + const digits: string = match.replace(/\D/g, ''); + if (digits.length <= 4) return match; + const last4: string = digits.slice(-4); + const prefix: string = digits.length > 4 ? digits[0] : ''; + return prefix + '*'.repeat(digits.length - 4 - (prefix ? 1 : 0)) + last4; + }); + + result = result.replace(SENSITIVE_JSON_FIELD_PATTERN, (_match: string, key: string) => { + return `"${key}":"***"`; + }); + + result = result.replace(SENSITIVE_PARAM_PATTERN, (match: string, key: string) => { + return `${key}=***`; + }); + + return result; +} + +export function sanitizeTokenForLog(token: string): string { + if (TOKEN_PATTERN.test(token)) { + const parts: string[] = token.split('.'); + return `${parts[0]}.${parts[1].substring(0, 8)}...`; + } + return ''; +} diff --git a/packages/sveltekit/src/models/config.ts b/packages/sveltekit/src/models/config.ts new file mode 100644 index 0000000..d6d9d80 --- /dev/null +++ b/packages/sveltekit/src/models/config.ts @@ -0,0 +1,111 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import type {OAuthResponseMode} from '@thunderid/browser'; +import type {SessionCookieConfig} from '@thunderid/node'; +import type {HTTPAdapter} from '../adapters/HTTPAdapter'; +export interface ThemePreferences { + mode?: string; + direction?: 'ltr' | 'rtl'; + inheritFromBranding?: boolean; + overrides?: Record; +} + +export interface I18nPreferences { + language?: string; + fallbackLanguage?: string; + bundles?: Record; + storageStrategy?: 'cookie' | 'localStorage' | 'none'; + storageKey?: string; + cookieDomain?: string; + urlParam?: string | false; +} + +export interface ThunderIDSveltePreferences { + theme?: ThemePreferences; + i18n?: I18nPreferences; + resolveFromMeta?: boolean; + user?: { + fetchUserProfile?: boolean; + }; +} + +export interface ThunderIDSvelteKitConfig { + afterSignInUrl?: string; + afterSignOutUrl?: string; + allowedExternalUrls?: string[]; + applicationId?: string; + organizationHandle?: string; + baseUrl?: string; + clientId?: string; + clientSecret?: string; + discovery?: { + wellKnown?: { + enabled?: boolean; + }; + }; + endpoints?: { + authorization?: string; + endSession?: string; + introspection?: string; + jwks?: string; + token?: string; + userInfo?: string; + wellKnown?: string; + }; + instanceId?: number; + mode?: 'redirect' | 'embedded'; + + platform?: string; + preferences?: ThunderIDSveltePreferences; + prompt?: string; + responseMode?: OAuthResponseMode; + scopes?: string | string[]; + sendCookiesInRequests?: boolean; + sendIdTokenInLogoutRequest?: boolean; + sessionCookie?: SessionCookieConfig; + sessionSecret?: string; + signInOptions?: Record; + signInUrl?: string; + signOutOptions?: Record; + signUpOptions?: Record; + signUpUrl?: string; + forgotPasswordUrl?: string; + forgotUsernameUrl?: string; + changePasswordUrl?: string; + /** Custom storage backend. Pass a StorageAdapter implementation. */ + storage?: unknown; + httpAdapter?: HTTPAdapter; + syncSession?: boolean; + tokenLifecycle?: { + refreshToken?: { + autoRefresh?: boolean; + }; + }; + tokenRequest?: { + authMethod?: 'client_secret_basic' | 'client_secret_post' | 'private_key_jwt' | 'none'; + params?: Record; + }; + tokenValidation?: { + idToken?: { + clockTolerance?: number; + validate?: boolean; + validateIssuer?: boolean; + }; + }; +} diff --git a/packages/sveltekit/src/models/contexts.ts b/packages/sveltekit/src/models/contexts.ts new file mode 100644 index 0000000..f4e98ab --- /dev/null +++ b/packages/sveltekit/src/models/contexts.ts @@ -0,0 +1,91 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import type { + BrandingPreference, + GetBrandingPreferenceConfig, + IdToken, + SPATokenExchangeConfig, + TokenResponse, + User, + UserProfile, +} from '@thunderid/browser'; +import type {IdTokenValidationResult} from '../validation/IdTokenValidator'; +import type {ThunderIDSvelteKitConfig} from './config'; + +export type NavigateFn = (url: string) => void; +export type TranslateFn = (key: string, params?: Record) => string; + +export interface ThunderIDContext { + afterSignInUrl?: string; + afterSignOutUrl?: string; + applicationId?: string; + baseUrl?: string; + brandingPreference: BrandingPreference | null; + clientId?: string; + isInitialized: boolean; + isLoading: boolean; + isSignedIn: boolean; + + resolvedBaseUrl: string; + scopes?: string | string[]; + signInUrl?: string; + signUpUrl?: string; + user: User | null; + userProfile: UserProfile | null; + locale: string; + + t: TranslateFn; + + signIn: (options?: Record) => Promise; + signOut: (options?: Record) => Promise; + signUp: (options?: Record) => Promise; + + getAccessToken: (sessionId?: string) => Promise; + getIdToken: (sessionId?: string) => Promise; + getDecodedIdToken: (sessionId?: string, idToken?: string) => Promise; + + getUser: (sessionId?: string) => Promise; + getUserProfile: (sessionId?: string) => Promise; + updateUserProfile: (payload: Record, userId?: string) => Promise; + getUserInfo: (sessionId?: string) => Promise; + verifyIdToken: ( + idToken: string, + options?: { + clientId?: string; + issuer?: string; + clockTolerance?: number; + validateIssuer?: boolean; + nonce?: string; + }, + ) => Promise; + getBrandingPreference: (config: GetBrandingPreferenceConfig) => Promise; + revokeAccessToken: (userId?: string) => Promise; + + exchangeToken: (config: SPATokenExchangeConfig) => Promise; + signInSilently: (options?: Record) => Promise; + reInitialize: (config: Partial) => Promise; + reset: () => Promise; + getConfiguration: () => ThunderIDSvelteKitConfig; +} + +export interface UserContextValue { + flattenedProfile: User | null; + profile: UserProfile | null; + schemas: any[] | null; +} diff --git a/packages/sveltekit/src/models/session.ts b/packages/sveltekit/src/models/session.ts new file mode 100644 index 0000000..770c4e8 --- /dev/null +++ b/packages/sveltekit/src/models/session.ts @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import type {BrandingPreference, User, UserProfile} from '@thunderid/browser'; +import type {JWTPayload} from 'jose'; + +/** + * Payload stored in the session JWT cookie. + */ +export interface ThunderIDSessionPayload extends JWTPayload { + accessToken: string; + accessTokenExpiresAt?: number; + exp: number; + iat: number; + idToken?: string; + + refreshToken?: string; + scopes: string; + sessionId: string; + sub: string; +} + +/** + * Full SSR payload resolved by the handle hook on each page request. + * Written to `event.locals.thunderid` and returned from `+layout.server.ts`. + */ +export interface ThunderIDSSRData { + brandingPreference: BrandingPreference | null; + isSignedIn: boolean; + resolvedBaseUrl: string | null; + session: ThunderIDSessionPayload | null; + user: User | null; + userProfile: UserProfile | null; +} diff --git a/packages/sveltekit/src/server/__tests__/guard.test.ts b/packages/sveltekit/src/server/__tests__/guard.test.ts new file mode 100644 index 0000000..fd79673 --- /dev/null +++ b/packages/sveltekit/src/server/__tests__/guard.test.ts @@ -0,0 +1,139 @@ +import type {RequestEvent} from '@sveltejs/kit'; +import {describe, it, expect} from 'vitest'; +import type {ThunderIDSSRData} from '../../models/session'; + +const {requireServerSession, GuardRedirect, isGuardRedirect} = await import('../guard'); + +function createMockEvent(ssrData: ThunderIDSSRData | undefined, path = '/'): RequestEvent { + return { + locals: {thunderid: ssrData}, + url: {pathname: path, search: ''}, + } as unknown as RequestEvent; +} + +describe('requireServerSession', () => { + it('should return SSR data when signed in', () => { + const ssrData: ThunderIDSSRData = { + brandingPreference: null, + isSignedIn: true, + resolvedBaseUrl: null, + session: null, + user: {id: 'u1'} as any, + userProfile: null, + }; + + const result = requireServerSession(createMockEvent(ssrData)); + expect(result).toBe(ssrData); + }); + + it('should throw GuardRedirect when not signed in', () => { + const ssrData: ThunderIDSSRData = { + brandingPreference: null, + isSignedIn: false, + resolvedBaseUrl: null, + session: null, + user: null, + userProfile: null, + }; + + expect(() => requireServerSession(createMockEvent(ssrData))).toThrow(GuardRedirect); + }); + + it('should append returnTo with custom redirectTo path', () => { + const ssrData: ThunderIDSSRData = { + brandingPreference: null, + isSignedIn: false, + resolvedBaseUrl: null, + session: null, + user: null, + userProfile: null, + }; + + let err: unknown; + try { + requireServerSession(createMockEvent(ssrData, '/protected'), '/custom/signin'); + } catch (e) { + err = e; + } + expect(isGuardRedirect(err)).toBe(true); + if (isGuardRedirect(err)) { + expect(err.location).toBe('/custom/signin?returnTo=%2Fprotected'); + expect(err.status).toBe(307); + } + }); + + it('should append returnTo with default sign-in path', () => { + const ssrData: ThunderIDSSRData = { + brandingPreference: null, + isSignedIn: false, + resolvedBaseUrl: null, + session: null, + user: null, + userProfile: null, + }; + + let err: unknown; + try { + requireServerSession(createMockEvent(ssrData, '/dashboard')); + } catch (e) { + err = e; + } + expect(isGuardRedirect(err)).toBe(true); + if (isGuardRedirect(err)) { + expect(err.location).toBe('/api/auth/signin?returnTo=%2Fdashboard'); + expect(err.status).toBe(307); + } + }); + + it('should include query string in returnTo', () => { + const ssrData: ThunderIDSSRData = { + brandingPreference: null, + isSignedIn: false, + resolvedBaseUrl: null, + session: null, + user: null, + userProfile: null, + }; + + const event = { + locals: {thunderid: ssrData}, + url: {pathname: '/search', search: '?q=test'}, + } as unknown as RequestEvent; + + let err: unknown; + try { + requireServerSession(event); + } catch (e) { + err = e; + } + expect(isGuardRedirect(err)).toBe(true); + if (isGuardRedirect(err)) { + expect(err.location).toBe('/api/auth/signin?returnTo=%2Fsearch%3Fq%3Dtest'); + expect(err.status).toBe(307); + } + }); + + it('should throw GuardRedirect when not signed in (custom path)', () => { + const ssrData: ThunderIDSSRData = { + brandingPreference: null, + isSignedIn: false, + resolvedBaseUrl: null, + session: null, + user: null, + userProfile: null, + }; + + let err: unknown; + try { + requireServerSession(createMockEvent(ssrData), '/custom/signin'); + } catch (e) { + err = e; + } + expect(isGuardRedirect(err)).toBe(true); + }); + + it('should throw IAMError when SSR data is undefined', () => { + const event = {locals: {}} as RequestEvent; + expect(() => requireServerSession(event)).toThrow('ThunderID SSR data not found'); + }); +}); diff --git a/packages/sveltekit/src/server/__tests__/session.test.ts b/packages/sveltekit/src/server/__tests__/session.test.ts new file mode 100644 index 0000000..2ce2f37 --- /dev/null +++ b/packages/sveltekit/src/server/__tests__/session.test.ts @@ -0,0 +1,139 @@ +import {describe, it, expect, beforeAll} from 'vitest'; +import { + createSessionToken, + createTempSessionToken, + verifySessionToken, + verifyTempSessionToken, + getSessionCookieName, + getTempSessionCookieName, + getSessionCookieOptions, + getTempSessionCookieOptions, +} from '../session'; + +const TEST_SECRET = 'test-session-secret-at-least-32-chars!!'; + +describe('Session token utilities', () => { + beforeAll(() => { + process.env['THUNDERID_SESSION_SECRET'] = TEST_SECRET; + }); + + describe('createSessionToken / verifySessionToken', () => { + it('should create and verify a session token', async () => { + const token = await createSessionToken({ + accessToken: 'at-123', + accessTokenExpiresAt: Math.floor(Date.now() / 1000) + 3600, + scopes: 'openid profile', + sessionId: 'sess-001', + userId: 'user-001', + }); + + const payload = await verifySessionToken(token); + expect(payload.accessToken).toBe('at-123'); + expect(payload.scopes).toBe('openid profile'); + expect(payload.sessionId).toBe('sess-001'); + expect(payload.sub).toBe('user-001'); + expect(payload['type']).toBe('session'); + }); + + it('should include idToken and refreshToken when provided', async () => { + const token = await createSessionToken({ + accessToken: 'at-456', + idToken: 'id-token-value', + refreshToken: 'rt-789', + scopes: 'openid', + sessionId: 'sess-002', + userId: 'user-002', + }); + + const payload = await verifySessionToken(token); + expect(payload.idToken).toBe('id-token-value'); + expect(payload.refreshToken).toBe('rt-789'); + }); + + it('should respect custom expirySeconds', async () => { + const token = await createSessionToken({ + accessToken: 'at', + expirySeconds: 60, + scopes: 'openid', + sessionId: 'sess-003', + userId: 'user-003', + }); + + const payload = await verifySessionToken(token); + const ttl = payload.exp - payload.iat; + expect(ttl).toBeLessThanOrEqual(65); + expect(ttl).toBeGreaterThanOrEqual(55); + }); + + it('should reject a token signed with a different secret', async () => { + const token = await createSessionToken( + { + accessToken: 'at', + scopes: 'openid', + sessionId: 'sess-004', + userId: 'user-004', + }, + 'different-secret-that-is-long-enough-for-test', + ); + + await expect(verifySessionToken(token)).rejects.toThrow(); + }); + }); + + describe('createTempSessionToken / verifyTempSessionToken', () => { + it('should create and verify a temp session token', async () => { + const token = await createTempSessionToken('sess-temp-001'); + const payload = await verifyTempSessionToken(token); + expect(payload.sessionId).toBe('sess-temp-001'); + expect(payload.returnTo).toBeUndefined(); + }); + + it('should store returnTo when provided', async () => { + const token = await createTempSessionToken('sess-temp-002', undefined, '/dashboard'); + const payload = await verifyTempSessionToken(token); + expect(payload.sessionId).toBe('sess-temp-002'); + expect(payload.returnTo).toBe('/dashboard'); + }); + + it('should store and return nonce when provided', async () => { + const nonce: string = crypto.randomUUID(); + const token = await createTempSessionToken('sess-temp-003', undefined, undefined, nonce); + const payload = await verifyTempSessionToken(token); + expect(payload.sessionId).toBe('sess-temp-003'); + expect(payload.nonce).toBe(nonce); + }); + + it('should omit nonce from payload when not provided', async () => { + const token = await createTempSessionToken('sess-temp-004'); + const payload = await verifyTempSessionToken(token); + expect(payload.nonce).toBeUndefined(); + }); + + it('should reject an expired temp token', async () => { + const token = await createTempSessionToken('sess-temp-005'); + const payload = await verifyTempSessionToken(token); + expect(payload.sessionId).toBe('sess-temp-005'); + }); + }); + + describe('Cookie helpers', () => { + it('should return consistent cookie names', () => { + expect(getSessionCookieName()).toBe('__thunderid__session'); + expect(getTempSessionCookieName()).toBe('__thunderid__temp.session'); + }); + + it('should return session cookie options', () => { + const opts = getSessionCookieOptions(); + expect(opts.httpOnly).toBe(true); + expect(opts.sameSite).toBe('lax'); + expect(opts.path).toBe('/'); + expect(opts.maxAge).toBeGreaterThan(0); + }); + + it('should return temp session cookie options with 15m maxAge', () => { + const opts = getTempSessionCookieOptions(); + expect(opts.httpOnly).toBe(true); + expect(opts.maxAge).toBe(15 * 60); + }); + }); +}); diff --git a/packages/sveltekit/src/server/app.d.ts b/packages/sveltekit/src/server/app.d.ts new file mode 100644 index 0000000..00e4cb2 --- /dev/null +++ b/packages/sveltekit/src/server/app.d.ts @@ -0,0 +1,9 @@ +import type {ThunderIDSSRData} from '../models/session'; + +declare global { + namespace App { + interface Locals { + thunderid: ThunderIDSSRData; + } + } +} diff --git a/packages/sveltekit/src/server/config.ts b/packages/sveltekit/src/server/config.ts new file mode 100644 index 0000000..742e729 --- /dev/null +++ b/packages/sveltekit/src/server/config.ts @@ -0,0 +1,68 @@ +import {IAMError, ErrorCode} from '../errors/IAMError'; +import type {ThunderIDSvelteKitConfig} from '../models/config'; + +export type {ThunderIDSvelteKitConfig} from '../models/config'; + +export function resolveConfig(config?: ThunderIDSvelteKitConfig): ThunderIDSvelteKitConfig { + const baseUrl: string = config?.baseUrl || process.env['THUNDERID_BASE_URL'] || ''; + + const resolved: ThunderIDSvelteKitConfig = { + afterSignInUrl: config?.afterSignInUrl ?? '/', + afterSignOutUrl: config?.afterSignOutUrl ?? '/', + allowedExternalUrls: config?.allowedExternalUrls, + applicationId: config?.applicationId, + baseUrl, + clientId: config?.clientId || process.env['THUNDERID_CLIENT_ID'], + clientSecret: config?.clientSecret || process.env['THUNDERID_CLIENT_SECRET'], + discovery: config?.discovery, + endpoints: { + wellKnown: `${baseUrl}/.well-known/openid-configuration`, + ...config?.endpoints, + } as any, + instanceId: config?.instanceId, + mode: config?.mode, + + preferences: config?.preferences, + prompt: config?.prompt, + responseMode: config?.responseMode, + scopes: config?.scopes ?? ['openid'], + sendCookiesInRequests: config?.sendCookiesInRequests, + sendIdTokenInLogoutRequest: config?.sendIdTokenInLogoutRequest, + sessionCookie: config?.sessionCookie, + sessionSecret: config?.sessionSecret || process.env['THUNDERID_SESSION_SECRET'], + signInOptions: config?.signInOptions, + signInUrl: config?.signInUrl, + signOutOptions: config?.signOutOptions, + signUpOptions: config?.signUpOptions, + signUpUrl: config?.signUpUrl, + storage: config?.storage, + httpAdapter: config?.httpAdapter, + syncSession: config?.syncSession, + tokenLifecycle: config?.tokenLifecycle, + tokenRequest: config?.tokenRequest ?? {authMethod: 'client_secret_post'}, + tokenValidation: config?.tokenValidation, + }; + + if (!resolved.baseUrl) { + throw new IAMError({ + code: ErrorCode.INVALID_CONFIGURATION, + message: 'baseUrl is required. Set THUNDERID_BASE_URL environment variable or pass it in config.', + }); + } + + if (!resolved.baseUrl.startsWith('https://')) { + throw new IAMError({ + code: ErrorCode.INVALID_CONFIGURATION, + message: 'baseUrl must use HTTPS.', + }); + } + + if (!resolved.clientId) { + throw new IAMError({ + code: ErrorCode.INVALID_CONFIGURATION, + message: 'clientId is required. Set THUNDERID_CLIENT_ID environment variable or pass it in config.', + }); + } + + return resolved; +} diff --git a/packages/sveltekit/src/server/getClient.ts b/packages/sveltekit/src/server/getClient.ts new file mode 100644 index 0000000..f4a2962 --- /dev/null +++ b/packages/sveltekit/src/server/getClient.ts @@ -0,0 +1,19 @@ +import {ThunderIDJavaScriptClient} from '@thunderid/node'; +import type {ThunderIDSvelteKitConfig} from './config'; + +let cachedClient: ThunderIDJavaScriptClient | null = null; + +export async function getClient(config: ThunderIDSvelteKitConfig): Promise { + if (cachedClient) { + return cachedClient; + } + + const client = new ThunderIDJavaScriptClient(); + await client.initialize(config as any); + cachedClient = client; + return cachedClient; +} + +export function resetClient(): void { + cachedClient = null; +} diff --git a/packages/sveltekit/src/server/guard.ts b/packages/sveltekit/src/server/guard.ts new file mode 100644 index 0000000..687faa2 --- /dev/null +++ b/packages/sveltekit/src/server/guard.ts @@ -0,0 +1,44 @@ +import type {RequestEvent} from '@sveltejs/kit'; +import {IAMError, ErrorCode} from '../errors/IAMError'; +import type {ThunderIDSSRData} from '../models/session'; + +export class GuardRedirect extends Error { + status: number; + location: string; + + constructor(status: number, location: string) { + super(); + this.name = 'GuardRedirect'; + this.status = status; + this.location = location; + } +} + +export function isGuardRedirect(err: unknown): err is GuardRedirect { + return err instanceof GuardRedirect; +} + +export function requireServerSession( + event: RequestEvent, + redirectTo?: string, +): ThunderIDSSRData { + const ssrData: ThunderIDSSRData | undefined = event.locals.thunderid; + + if (!ssrData) { + throw new IAMError({ + code: ErrorCode.SDK_NOT_INITIALIZED, + message: + 'ThunderID SSR data not found in event.locals. Ensure createThunderIDHandle() is configured in hooks.server.ts.', + }); + } + + if (!ssrData.isSignedIn) { + const signInUrl: string = redirectTo || '/api/auth/signin'; + const returnTo: string = encodeURIComponent(event.url.pathname + event.url.search); + const separator: string = signInUrl.includes('?') ? '&' : '?'; + + throw new GuardRedirect(307, `${signInUrl}${separator}returnTo=${returnTo}`); + } + + return ssrData; +} diff --git a/packages/sveltekit/src/server/hooks.ts b/packages/sveltekit/src/server/hooks.ts new file mode 100644 index 0000000..725c414 --- /dev/null +++ b/packages/sveltekit/src/server/hooks.ts @@ -0,0 +1,112 @@ +import type {Handle, RequestEvent} from '@sveltejs/kit'; +import type {BrandingPreference} from '@thunderid/node'; +import {getBrandingPreference} from '@thunderid/node'; +import {resolveConfig} from './config'; +import type {ThunderIDSvelteKitConfig} from './config'; +import {maybeRefreshToken} from './refresh'; +import {verifySessionToken, getSessionCookieName} from './session'; +import {getLogger} from '../logger/LoggerAdapter'; +import {DefaultHTTPAdapter, type HTTPAdapter, type HTTPResponse} from '../adapters/HTTPAdapter'; +import type {ThunderIDSSRData, ThunderIDSessionPayload} from '../models/session'; + +export function createThunderIDHandle(config?: ThunderIDSvelteKitConfig): Handle { + const resolvedConfig: ThunderIDSvelteKitConfig = resolveConfig(config); + + return async ({event, resolve}) => { + const sessionCookie: string | undefined = event.cookies.get(getSessionCookieName()); + let session: ThunderIDSessionPayload | null = null; + + if (sessionCookie) { + try { + session = await verifySessionToken(sessionCookie, resolvedConfig.sessionSecret); + + session = await maybeRefreshToken(session, resolvedConfig, event); + + if (session) { + event.locals.thunderid = { + isSignedIn: true, + session, + user: null, + userProfile: null, + brandingPreference: null, + resolvedBaseUrl: resolvedConfig.baseUrl ?? null, + } as ThunderIDSSRData; + } + } catch { + event.cookies.delete(getSessionCookieName(), {path: '/'}); + session = null; + } + } + + const isSignedIn: boolean = session !== null; + + const shouldFetchBranding: boolean = resolvedConfig.preferences?.theme?.inheritFromBranding !== false; + + let ssrData: ThunderIDSSRData; + + if (isSignedIn && session) { + const accessToken: string = session.accessToken; + const baseUrl: string = resolvedConfig.baseUrl!; + + const adapter: HTTPAdapter = resolvedConfig.httpAdapter ?? new DefaultHTTPAdapter(); + + const [userResponse, branding] = await Promise.all([ + adapter.request('GET', `${baseUrl}/oauth2/userinfo`, {Authorization: `Bearer ${accessToken}`}).then((r: HTTPResponse) => { + if (r.statusCode !== 200) { + getLogger().error( + `[hooks] userinfo fetch failed (${r.statusCode})`, + undefined, + {requestId: r.headers['x-request-id'] || r.headers['correlation-id'] || undefined, statusCode: r.statusCode}, + ); + return null; + } + return JSON.parse(r.body) as any; + }), + shouldFetchBranding + ? getBrandingPreference({baseUrl} as any).catch(() => null) + : Promise.resolve(null), + ]); + + const user = userResponse; + const userProfile = user ? {flattenedProfile: user, profile: user, schemas: [] as string[]} : null; + + ssrData = { + brandingPreference: (branding!) ?? null, + isSignedIn: true, + resolvedBaseUrl: resolvedConfig.baseUrl ?? null, + session, + user: user as any, + userProfile: userProfile as any, + }; + } else { + let branding: BrandingPreference | null = null; + + if (shouldFetchBranding) { + try { + branding = await getBrandingPreference({baseUrl: resolvedConfig.baseUrl!} as any); + } catch { + // branding fetch failed โ€” continue without + } + } + + ssrData = { + brandingPreference: branding, + isSignedIn: false, + resolvedBaseUrl: null, + session: null, + user: null, + userProfile: null, + }; + } + + event.locals.thunderid = ssrData; + + return resolve(event); + }; +} + +export function loadThunderID(event: RequestEvent): ThunderIDSSRData { + return event.locals.thunderid; +} + + diff --git a/packages/sveltekit/src/server/index.ts b/packages/sveltekit/src/server/index.ts new file mode 100644 index 0000000..1a5e0b7 --- /dev/null +++ b/packages/sveltekit/src/server/index.ts @@ -0,0 +1,18 @@ +export {resolveConfig} from './config'; +export {createThunderIDHandle} from './hooks'; +export {loadThunderID} from './load'; +export {getClient, resetClient} from './getClient'; +export { + createSessionToken, + createTempSessionToken, + verifySessionToken, + verifyTempSessionToken, + issueSessionCookie, + getSessionCookieName, + getTempSessionCookieName, + getSessionCookieOptions, + getTempSessionCookieOptions, +} from './session'; +export {maybeRefreshToken, getValidAccessToken} from './refresh'; +export {requireServerSession, GuardRedirect, isGuardRedirect} from './guard'; +export {createSignInHandler, createCallbackHandler, createSignOutHandler} from './routes'; diff --git a/packages/sveltekit/src/server/load.ts b/packages/sveltekit/src/server/load.ts new file mode 100644 index 0000000..cbcd4d8 --- /dev/null +++ b/packages/sveltekit/src/server/load.ts @@ -0,0 +1,6 @@ +import type {RequestEvent} from '@sveltejs/kit'; +import type {ThunderIDSSRData} from '../models/session'; + +export function loadThunderID(event: RequestEvent): ThunderIDSSRData { + return event.locals.thunderid; +} diff --git a/packages/sveltekit/src/server/refresh.ts b/packages/sveltekit/src/server/refresh.ts new file mode 100644 index 0000000..5e303f6 --- /dev/null +++ b/packages/sveltekit/src/server/refresh.ts @@ -0,0 +1,150 @@ +import type {RequestEvent} from '@sveltejs/kit'; +import type {ThunderIDSvelteKitConfig} from './config'; +import {createSessionToken, getSessionCookieName, getSessionCookieOptions} from './session'; +import {emit, SDKEvent} from '../events/EventBus'; +import {getLogger} from '../logger/LoggerAdapter'; +import {DefaultHTTPAdapter, type HTTPAdapter, type HTTPResponse} from '../adapters/HTTPAdapter'; +import type {ThunderIDSessionPayload} from '../models/session'; + +const REFRESH_SKEW_SECONDS = 60; + +interface OIDCTokenRefreshResponse { + access_token: string; + expires_in?: number; + id_token?: string; + refresh_token?: string; + scope?: string; + token_type?: string; +} + +const inFlightRefreshes = new Map>(); + +export async function maybeRefreshToken( + session: ThunderIDSessionPayload, + config: ThunderIDSvelteKitConfig, + event: Pick, +): Promise { + const now: number = Math.floor(Date.now() / 1000); + const logger = getLogger(); + + if (!session.accessTokenExpiresAt || session.accessTokenExpiresAt - REFRESH_SKEW_SECONDS > now) { + return session; + } + + if (!session.refreshToken) { + return null; + } + + const dedupKey: string = session.sessionId || session.sub || 'default'; + + const existing = inFlightRefreshes.get(dedupKey); + if (existing) { + return existing; + } + + const promise = doRefresh(session, config, event, logger); + inFlightRefreshes.set(dedupKey, promise); + + try { + return await promise; + } finally { + inFlightRefreshes.delete(dedupKey); + } +} + +async function doRefresh( + session: ThunderIDSessionPayload, + config: ThunderIDSvelteKitConfig, + event: Pick, + logger: ReturnType, +): Promise { + const now: number = Math.floor(Date.now() / 1000); + const tokenEndpoint = `${config.baseUrl}/oauth2/token`; + + const body: string = new URLSearchParams({ + client_id: config.clientId!, + grant_type: 'refresh_token', + refresh_token: session.refreshToken ?? '', + ...(config.clientSecret ? {client_secret: config.clientSecret} : {}), + }).toString(); + + let refreshed: OIDCTokenRefreshResponse; + try { + const adapter: HTTPAdapter = config.httpAdapter ?? new DefaultHTTPAdapter(); + const res: HTTPResponse = await adapter.request('POST', tokenEndpoint, { + 'Content-Type': 'application/x-www-form-urlencoded', + }, body); + + const requestId: string | undefined = res.headers['x-request-id'] || res.headers['correlation-id'] || undefined; + + if (res.statusCode !== 200) { + logger.error(`Token refresh failed (${res.statusCode})`, undefined, { + statusCode: res.statusCode, + requestId, + sessionId: session.sessionId, + }); + emit(SDKEvent.TOKEN_REFRESH_FAILED, { + statusCode: res.statusCode, + requestId, + sessionId: session.sessionId, + }); + return null; + } + + refreshed = JSON.parse(res.body) as OIDCTokenRefreshResponse; + } catch (err: unknown) { + logger.error('Token refresh network error', err instanceof Error ? err : new Error(String(err)), { + sessionId: session.sessionId, + }); + emit(SDKEvent.TOKEN_REFRESH_FAILED, { + error: err instanceof Error ? err.message : String(err), + sessionId: session.sessionId, + }); + return null; + } + + const newSessionToken: string = await createSessionToken( + { + accessToken: refreshed.access_token, + accessTokenExpiresAt: now + (refreshed.expires_in ?? 3600), + idToken: refreshed.id_token ?? session.idToken, + refreshToken: refreshed.refresh_token ?? session.refreshToken, + scopes: refreshed.scope ?? session.scopes, + sessionId: session.sessionId, + userId: session.sub, + }, + config.sessionSecret, + ); + + event.cookies.set(getSessionCookieName(), newSessionToken, getSessionCookieOptions()); + emit(SDKEvent.TOKEN_REFRESHED, {sessionId: session.sessionId}); + + return { + ...session, + accessToken: refreshed.access_token, + accessTokenExpiresAt: now + (refreshed.expires_in ?? 3600), + idToken: refreshed.id_token ?? session.idToken, + refreshToken: refreshed.refresh_token ?? session.refreshToken, + scopes: refreshed.scope ?? session.scopes, + }; +} + +export async function getValidAccessToken( + event: RequestEvent, + config: ThunderIDSvelteKitConfig, +): Promise { + const {loadThunderID} = await import('./load'); + const ssrData = loadThunderID(event); + + if (!ssrData.session) { + throw new Error('Not authenticated'); + } + + const refreshed = await maybeRefreshToken(ssrData.session, config, event); + + if (!refreshed) { + throw new Error('Session expired'); + } + + return refreshed.accessToken; +} diff --git a/packages/sveltekit/src/server/routes/callback.ts b/packages/sveltekit/src/server/routes/callback.ts new file mode 100644 index 0000000..20016b2 --- /dev/null +++ b/packages/sveltekit/src/server/routes/callback.ts @@ -0,0 +1,111 @@ +import type {TokenResponse} from '@thunderid/node'; +import {decodeJwt} from 'jose'; +import {getLogger} from '../../logger/LoggerAdapter'; +import {resolveConfig} from '../config'; +import type {ThunderIDSvelteKitConfig} from '../config'; +import {getClient} from '../getClient'; +import {issueSessionCookie, verifyTempSessionToken, getTempSessionCookieName, getSessionCookieName} from '../session'; + +export function createCallbackHandler(config?: ThunderIDSvelteKitConfig): (event: {url: URL; cookies: any}) => Promise { + const resolvedConfig: ThunderIDSvelteKitConfig = resolveConfig(config); + const logger = getLogger(); + + return async (event) => { + try { + const client = await getClient(resolvedConfig); + + const tempCookie: string | undefined = event.cookies.get(getTempSessionCookieName()); + + if (!tempCookie) { + return new Response(null, {status: 302, headers: {Location: resolvedConfig.afterSignInUrl || '/'}}); + } + + let sessionId: string; + let returnTo: string | undefined; + let storedNonce: string | undefined; + + try { + const tempPayload = await verifyTempSessionToken(tempCookie, resolvedConfig.sessionSecret); + sessionId = tempPayload.sessionId; + returnTo = tempPayload.returnTo; + storedNonce = tempPayload.nonce; + } catch { + event.cookies.delete(getTempSessionCookieName(), {path: '/'}); + return new Response(null, {status: 302, headers: {Location: resolvedConfig.afterSignInUrl || '/'}}); + } + + const code: string | null = event.url.searchParams.get('code'); + const state: string | null = event.url.searchParams.get('state'); + const sessionState: string | null = event.url.searchParams.get('session_state'); + + if (code) { + let tokenResponse: TokenResponse; + + try { + tokenResponse = await (client as any).requestAccessToken( + code, + sessionState ?? '', + state ?? '', + sessionId, + ); + } catch (err: unknown) { + const message: string = (err as any)?.message ?? String(err); + logger.error('callback requestAccessToken failed', err instanceof Error ? err : new Error(message)); + return new Response(JSON.stringify({error: message, details: (err as any)?.name ?? ''}), { + status: 500, + headers: {'content-type': 'application/json'}, + }); + } + + if (tokenResponse.accessToken) { + const nonceFromQuery: string | null = event.url.searchParams.get('nonce'); + const nonceToValidate: string | undefined = nonceFromQuery ?? storedNonce; + + if (nonceToValidate && tokenResponse.idToken) { + try { + const idTokenPayload = decodeJwt(tokenResponse.idToken); + if (idTokenPayload['nonce'] !== nonceToValidate) { + const errMsg = `ID token nonce mismatch: expected ${nonceToValidate}, got ${idTokenPayload['nonce']}`; + logger.error(errMsg); + return new Response(JSON.stringify({error: errMsg}), { + status: 401, + headers: {'content-type': 'application/json'}, + }); + } + } catch (decodeErr: unknown) { + const errMsg = `Failed to decode ID token for nonce validation: ${(decodeErr as any)?.message ?? String(decodeErr)}`; + logger.error(errMsg); + return new Response(JSON.stringify({error: errMsg}), { + status: 401, + headers: {'content-type': 'application/json'}, + }); + } + } + + const sessionPayload = await issueSessionCookie(event, sessionId, tokenResponse, resolvedConfig.sessionSecret); + + event.cookies.delete(getTempSessionCookieName(), {path: '/'}); + + return new Response(null, { + status: 302, + headers: {Location: returnTo || resolvedConfig.afterSignInUrl || '/'}, + }); + } + } + + const error: string | null = event.url.searchParams.get('error'); + if (error) { + return new Response(null, {status: 302, headers: {Location: `${resolvedConfig.afterSignInUrl || '/'}?error=${error}`}}); + } + + return new Response(null, {status: 302, headers: {Location: resolvedConfig.afterSignInUrl || '/'}}); + } catch (err: unknown) { + const message: string = (err as any)?.message ?? String(err); + logger.error('callback unhandled error', err instanceof Error ? err : new Error(message)); + return new Response(JSON.stringify({error: message, details: (err as any)?.name ?? ''}), { + status: 500, + headers: {'content-type': 'application/json'}, + }); + } + }; +} diff --git a/packages/sveltekit/src/server/routes/index.ts b/packages/sveltekit/src/server/routes/index.ts new file mode 100644 index 0000000..0a1c0e3 --- /dev/null +++ b/packages/sveltekit/src/server/routes/index.ts @@ -0,0 +1,3 @@ +export {createSignInHandler} from './signin'; +export {createCallbackHandler} from './callback'; +export {createSignOutHandler} from './signout'; diff --git a/packages/sveltekit/src/server/routes/signin.ts b/packages/sveltekit/src/server/routes/signin.ts new file mode 100644 index 0000000..9fe7dba --- /dev/null +++ b/packages/sveltekit/src/server/routes/signin.ts @@ -0,0 +1,40 @@ +import {generateSessionId} from '@thunderid/node'; +import {getLogger} from '../../logger/LoggerAdapter'; +import {resolveConfig} from '../config'; +import type {ThunderIDSvelteKitConfig} from '../config'; +import {getClient} from '../getClient'; +import {createTempSessionToken, getTempSessionCookieName, getTempSessionCookieOptions} from '../session'; + +export function createSignInHandler(config?: ThunderIDSvelteKitConfig): (event: {url: URL; cookies: any}) => Promise { + const resolvedConfig: ThunderIDSvelteKitConfig = resolveConfig(config); + const logger = getLogger(); + + return async (event) => { + try { + const client = await getClient(resolvedConfig); + const sessionId: string = generateSessionId(); + + const returnTo: string = event.url.searchParams.get('returnTo') || resolvedConfig.afterSignInUrl || '/'; + + const nonce: string = crypto.randomUUID(); + + const authorizeUrl: string = await (client as any).getSignInUrl({nonce}, sessionId); + + const tempToken: string = await createTempSessionToken(sessionId, resolvedConfig.sessionSecret, returnTo, nonce); + + event.cookies.set(getTempSessionCookieName(), tempToken, getTempSessionCookieOptions()); + + return new Response(null, { + status: 302, + headers: {Location: authorizeUrl}, + }); + } catch (err: unknown) { + const message: string = (err as any)?.message ?? String(err); + logger.error('sign-in failed', err instanceof Error ? err : new Error(message)); + return new Response(JSON.stringify({error: message}), { + status: 500, + headers: {'content-type': 'application/json'}, + }); + } + }; +} diff --git a/packages/sveltekit/src/server/routes/signout.ts b/packages/sveltekit/src/server/routes/signout.ts new file mode 100644 index 0000000..1c2bd03 --- /dev/null +++ b/packages/sveltekit/src/server/routes/signout.ts @@ -0,0 +1,34 @@ +import {getLogger} from '../../logger/LoggerAdapter'; +import {resolveConfig} from '../config'; +import type {ThunderIDSvelteKitConfig} from '../config'; +import {getClient} from '../getClient'; +import {getSessionCookieName, verifySessionToken} from '../session'; + +export function createSignOutHandler(config?: ThunderIDSvelteKitConfig): (event: {cookies: any}) => Promise { + const resolvedConfig: ThunderIDSvelteKitConfig = resolveConfig(config); + const logger = getLogger(); + + return async (event) => { + const redirectUrl: string = resolvedConfig.afterSignOutUrl || '/'; + + const sessionCookie: string | undefined = event.cookies.get(getSessionCookieName()); + + if (sessionCookie) { + try { + const client = await getClient(resolvedConfig); + const session = await verifySessionToken(sessionCookie, resolvedConfig.sessionSecret); + await (client as any).revokeAccessToken(session.sessionId); + await client.signOut({sessionId: session.sessionId} as any); + } catch (err: unknown) { + logger.warn('sign-out encountered an issue', {error: (err as any)?.message ?? String(err)}); + } + } + + event.cookies.delete(getSessionCookieName(), {path: '/'}); + + return new Response(null, { + status: 302, + headers: {Location: redirectUrl}, + }); + }; +} diff --git a/packages/sveltekit/src/server/session.ts b/packages/sveltekit/src/server/session.ts new file mode 100644 index 0000000..d594d49 --- /dev/null +++ b/packages/sveltekit/src/server/session.ts @@ -0,0 +1,188 @@ +import {CookieConfig} from '@thunderid/node'; +import type {IdToken, TokenResponse} from '@thunderid/node'; +import {SignJWT, jwtVerify, decodeJwt} from 'jose'; +import {getLogger} from '../logger/LoggerAdapter'; +import type {ThunderIDSessionPayload} from '../models/session'; + +const DEFAULT_EXPIRY_SECONDS = 3600; + +function getSecret(sessionSecret?: string): Uint8Array { + const secret: string | undefined = sessionSecret || process.env['THUNDERID_SESSION_SECRET']; + const logger = getLogger(); + + if (!secret) { + if (process.env['NODE_ENV'] === 'production') { + throw new Error( + '[thunderid] THUNDERID_SESSION_SECRET environment variable is required in production. ' + + 'Set it to a secure random string of at least 32 characters.', + ); + } + logger.warn('Using default session secret for development. Set THUNDERID_SESSION_SECRET for production.'); + return new TextEncoder().encode('thunderid-dev-secret-not-for-production'); + } + + return new TextEncoder().encode(secret); +} + +export async function createSessionToken( + params: { + accessToken: string; + accessTokenExpiresAt?: number; + expirySeconds?: number; + idToken?: string; + refreshToken?: string; + scopes: string; + sessionId: string; + userId: string; + }, + sessionSecret?: string, +): Promise { + const secret: Uint8Array = getSecret(sessionSecret); + + return new SignJWT({ + accessToken: params.accessToken, + accessTokenExpiresAt: params.accessTokenExpiresAt, + idToken: params.idToken, + refreshToken: params.refreshToken, + scopes: params.scopes, + sessionId: params.sessionId, + type: 'session', + } as Omit) + .setProtectedHeader({alg: 'HS256'}) + .setSubject(params.userId) + .setIssuedAt() + .setExpirationTime(Date.now() / 1000 + (params.expirySeconds ?? DEFAULT_EXPIRY_SECONDS)) + .sign(secret); +} + +export async function createTempSessionToken( + sessionId: string, + sessionSecret?: string, + returnTo?: string, + nonce?: string, +): Promise { + const secret: Uint8Array = getSecret(sessionSecret); + + const payload: Record = { + sessionId, + type: 'temp', + }; + + if (returnTo) { + payload['returnTo'] = returnTo; + } + + if (nonce) { + payload['nonce'] = nonce; + } + + return new SignJWT(payload).setProtectedHeader({alg: 'HS256'}).setIssuedAt().setExpirationTime('15m').sign(secret); +} + +export async function verifySessionToken( + token: string, + sessionSecret?: string, +): Promise { + const secret: Uint8Array = getSecret(sessionSecret); + const {payload} = await jwtVerify(token, secret); + return payload as ThunderIDSessionPayload; +} + +export async function verifyTempSessionToken( + token: string, + sessionSecret?: string, +): Promise<{returnTo?: string; sessionId: string; nonce?: string}> { + const secret: Uint8Array = getSecret(sessionSecret); + const {payload} = await jwtVerify(token, secret); + + if (payload['type'] !== 'temp') { + throw new Error('Invalid token type: expected temp session'); + } + + return { + returnTo: payload['returnTo'] as string | undefined, + sessionId: payload['sessionId'] as string, + nonce: payload['nonce'] as string | undefined, + }; +} + +export function getSessionCookieName(): string { + return CookieConfig.SESSION_COOKIE_NAME; +} + +export function getTempSessionCookieName(): string { + return CookieConfig.TEMP_SESSION_COOKIE_NAME; +} + +export function getSessionCookieOptions(): { + httpOnly: boolean; + maxAge: number; + path: string; + sameSite: 'lax'; + secure: boolean; +} { + return { + httpOnly: true, + maxAge: DEFAULT_EXPIRY_SECONDS, + path: '/', + sameSite: 'lax' as const, + secure: process.env['NODE_ENV'] === 'production', + }; +} + +export function getTempSessionCookieOptions(): { + httpOnly: boolean; + maxAge: number; + path: string; + sameSite: 'lax'; + secure: boolean; +} { + return { + httpOnly: true, + maxAge: 15 * 60, + path: '/', + sameSite: 'lax' as const, + secure: process.env['NODE_ENV'] === 'production', + }; +} + +export async function issueSessionCookie( + event: {cookies: {set: (name: string, value: string, options: any) => void}}, + sessionId: string, + tokenResponse: TokenResponse, + sessionSecret?: string, +): Promise { + const idToken: IdToken = decodeJwt(tokenResponse.idToken) as IdToken; + + const userId: string = idToken.sub || sessionId; + const expiresInSeconds: number = parseInt(tokenResponse.expiresIn ?? '3600', 10); + const accessTokenExpiresAt: number = + Math.floor(Date.now() / 1000) + (Number.isFinite(expiresInSeconds) ? expiresInSeconds : 3600); + + const sessionToken: string = await createSessionToken( + { + accessToken: tokenResponse.accessToken, + accessTokenExpiresAt, + idToken: tokenResponse.idToken || undefined, + refreshToken: tokenResponse.refreshToken || undefined, + scopes: tokenResponse.scope || '', + sessionId, + userId, + }, + sessionSecret, + ); + + event.cookies.set(getSessionCookieName(), sessionToken, getSessionCookieOptions()); + + return { + accessToken: tokenResponse.accessToken, + accessTokenExpiresAt, + exp: Math.floor(Date.now() / 1000) + expiresInSeconds, + iat: Math.floor(Date.now() / 1000), + idToken: tokenResponse.idToken || undefined, + refreshToken: tokenResponse.refreshToken || undefined, + scopes: tokenResponse.scope || '', + sessionId, + sub: userId, + } as ThunderIDSessionPayload; +} diff --git a/packages/sveltekit/src/state.svelte.ts b/packages/sveltekit/src/state.svelte.ts new file mode 100644 index 0000000..67f01d7 --- /dev/null +++ b/packages/sveltekit/src/state.svelte.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import type {User, UserProfile} from '@thunderid/browser'; + +class AuthState { + isSignedIn = $state(false); + isLoading = $state(true); + isInitialized = $state(false); + user: User | null = $state(null); + userProfile: UserProfile | null = $state(null); + + resolvedBaseUrl = $state(''); + locale = $state('en'); +} + +export const authState = new AuthState(); diff --git a/packages/sveltekit/src/validation/IdTokenValidator.ts b/packages/sveltekit/src/validation/IdTokenValidator.ts new file mode 100644 index 0000000..d026fae --- /dev/null +++ b/packages/sveltekit/src/validation/IdTokenValidator.ts @@ -0,0 +1,141 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {createRemoteJWKSet, jwtVerify, type JWTPayload} from 'jose'; +import type {JWK} from 'jose'; +import {IAMError, ErrorCode} from '../errors/IAMError'; +import type {ThunderIDSvelteKitConfig} from '../models/config'; + +export interface IdTokenValidationResult { + valid: boolean; + payload: JWTPayload | null; + error?: string; +} + +let _jwksCache: ReturnType | null = null; +let _jwksUrl: string | null = null; + +export async function verifyIdToken( + idToken: string, + config: ThunderIDSvelteKitConfig, + options?: { + clientId?: string; + issuer?: string; + clockTolerance?: number; + validateIssuer?: boolean; + nonce?: string; + }, +): Promise { + try { + const jwksUrl: string | undefined = config.endpoints?.jwks; + + if (!jwksUrl) { + return {valid: false, payload: null, error: 'JWKS endpoint not configured'}; + } + + if (_jwksUrl !== jwksUrl || !_jwksCache) { + _jwksUrl = jwksUrl; + _jwksCache = createRemoteJWKSet(new URL(jwksUrl)); + } + + let payload: JWTPayload; + + try { + const result = await jwtVerify(idToken, _jwksCache, { + issuer: options?.validateIssuer !== false ? options?.issuer : undefined, + audience: options?.clientId, + clockTolerance: options?.clockTolerance, + }); + payload = result.payload; + } catch { + clearJWKSCache(); + _jwksUrl = jwksUrl; + _jwksCache = createRemoteJWKSet(new URL(jwksUrl)); + const result = await jwtVerify(idToken, _jwksCache, { + issuer: options?.validateIssuer !== false ? options?.issuer : undefined, + audience: options?.clientId, + clockTolerance: options?.clockTolerance, + }); + payload = result.payload; + } + + if (options?.nonce !== undefined && payload['nonce'] !== options.nonce) { + return { + valid: false, + payload, + error: `ID token nonce mismatch: expected ${options.nonce}, got ${payload['nonce']}`, + }; + } + + return {valid: true, payload}; + } catch (error: unknown) { + return { + valid: false, + payload: null, + error: (error as any)?.message ?? String(error), + }; + } +} + +export function clearJWKSCache(): void { + _jwksCache = null; + _jwksUrl = null; +} + +/** + * Validates the basic structural claims of an ID token (exp, iat, iss, aud) + * without requiring a JWKS fetch. Useful for quick client-side checks. + */ +export function validateIdTokenClaims( + payload: JWTPayload, + options?: { + clientId?: string; + issuer?: string; + clockTolerance?: number; + nonce?: string; + }, +): IdTokenValidationResult { + const now: number = Math.floor(Date.now() / 1000); + const tolerance: number = options?.clockTolerance ?? 0; + + if (payload.exp && payload.exp + tolerance < now) { + return {valid: false, payload, error: 'ID token has expired'}; + } + + if (payload.nbf && payload.nbf - tolerance > now) { + return {valid: false, payload, error: 'ID token is not yet valid (nbf)'}; + } + + if (options?.issuer && payload.iss !== options.issuer) { + return {valid: false, payload, error: `ID token issuer mismatch: expected ${options.issuer}, got ${payload.iss}`}; + } + + if (options?.clientId && payload.aud !== options.clientId && !Array.isArray(payload.aud)) { + return {valid: false, payload, error: `ID token audience mismatch: expected ${options.clientId}, got ${payload.aud}`}; + } + + if (Array.isArray(payload.aud) && options?.clientId && !payload.aud.includes(options.clientId)) { + return {valid: false, payload, error: `ID token audience mismatch: ${options.clientId} not in ${payload.aud}`}; + } + + if (options?.nonce !== undefined && payload['nonce'] !== options.nonce) { + return {valid: false, payload, error: `ID token nonce mismatch: expected ${options.nonce}, got ${payload['nonce']}`}; + } + + return {valid: true, payload}; +} diff --git a/packages/sveltekit/src/validation/index.ts b/packages/sveltekit/src/validation/index.ts new file mode 100644 index 0000000..082620a --- /dev/null +++ b/packages/sveltekit/src/validation/index.ts @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export {verifyIdToken, validateIdTokenClaims, clearJWKSCache} from './IdTokenValidator'; +export type {IdTokenValidationResult} from './IdTokenValidator'; diff --git a/packages/sveltekit/tsconfig.json b/packages/sveltekit/tsconfig.json new file mode 100644 index 0000000..ba6587f --- /dev/null +++ b/packages/sveltekit/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "declaration": false, + "emitDecoratorMetadata": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "importHelpers": true, + "lib": ["ESNext", "DOM"], + "module": "ESNext", + "moduleResolution": "bundler", + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "sourceMap": true, + "target": "ESNext", + "forceConsistentCasingInFileNames": true, + "strict": false, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "strictNullChecks": true + }, + "exclude": ["node_modules", "tmp", "dist"], + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/packages/sveltekit/tsconfig.lib.json b/packages/sveltekit/tsconfig.lib.json new file mode 100644 index 0000000..e3443f2 --- /dev/null +++ b/packages/sveltekit/tsconfig.lib.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "outDir": "dist", + "declarationDir": "dist", + "types": ["node", "svelte"] + }, + "include": ["src/**/*.js", "src/**/*.ts", "src/**/*.svelte"] +} diff --git a/packages/sveltekit/vitest.config.ts b/packages/sveltekit/vitest.config.ts new file mode 100644 index 0000000..4011268 --- /dev/null +++ b/packages/sveltekit/vitest.config.ts @@ -0,0 +1,10 @@ +import {defineConfig} from 'vitest/config'; +import {svelte} from '@sveltejs/vite-plugin-svelte'; + +export default defineConfig({ + plugins: [svelte({hot: false}) as any], + test: { + passWithNoTests: true, + exclude: ['dist/**', 'node_modules/**'], + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ef86b2d..d162623 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,202 +1,3 @@ ---- -lockfileVersion: '9.0' - -importers: - - .: - configDependencies: {} - packageManagerDependencies: - '@pnpm/exe': - specifier: 11.9.0 - version: 11.9.0 - pnpm: - specifier: 11.9.0 - version: 11.9.0 - -packages: - - '@pnpm/exe@11.9.0': - resolution: {integrity: sha512-pPPOpR79qW3nsNhlyDIdfstli4Bi78mk8r22ySxpFRwMbO8KXSjGrVzGmJBsVX39NnJTh7/WADj527nZhG9H9g==} - hasBin: true - - '@pnpm/linux-arm64@11.9.0': - resolution: {integrity: sha512-XYmY2qadHauBA3QaHi2R7fI6kt5Flje0WHz9MVrbH0kVH/XLpfOLnwPeE1+EX6K/nDa2CBvzp35VjYCNGFJa9A==} - cpu: [arm64] - os: [linux] - - '@pnpm/linux-x64@11.9.0': - resolution: {integrity: sha512-fl7W5imnSmmgXIqMQFZ/rPaVvk9OkKF8/anqHZE3XEDfWcn3BlWGndyOEas/JN7u2BXWYjs63DJZ3rnG6WOhLA==} - cpu: [x64] - os: [linux] - - '@pnpm/linuxstatic-arm64@11.9.0': - resolution: {integrity: sha512-fif8xbnzVEAIlvaU4yIgWKXeXYb4Kj6WMEl/KvM2x1Rp3AKAjBW/53SGzxO4cZP9doAqUzOIpMRGFVbHGeMDRw==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@pnpm/linuxstatic-x64@11.9.0': - resolution: {integrity: sha512-9dKu3QdShqOpnWrjW9owARpIJeP0ul8UgIIbBUv8VDGEYibt+g49zQsNaD7SdMD3WeRSjExPQ1zIhplzr5cwvQ==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@pnpm/macos-arm64@11.9.0': - resolution: {integrity: sha512-MWzBTgeI5p3odjdVltYvFXaSWAjF2Xk5YaxiP/u2RmW8N6PHsLyIyj37Ds992CrXgFM8fO1RpvsEirozhsD6KA==} - cpu: [arm64] - os: [darwin] - - '@pnpm/win-arm64@11.9.0': - resolution: {integrity: sha512-u/QxEcbKJZxC1t3zUYCZiHzu7TaZ/iXc6EGZoQjkeVT0LXmEVR6ypcK3ByjhIqbxQ3HGX75gnpIpR+VjRjubfw==} - cpu: [arm64] - os: [win32] - - '@pnpm/win-x64@11.9.0': - resolution: {integrity: sha512-HqJVHmZG5UKfLi38AjMl2azVmq87TlWRhwSW+f4q9LLaZeAkFyIZ7LY/pN6mh4VlH9yWj90C+tsb1yKiy7OKnw==} - cpu: [x64] - os: [win32] - - '@reflink/reflink-darwin-arm64@0.1.19': - resolution: {integrity: sha512-ruy44Lpepdk1FqDz38vExBY/PVUsjxZA+chd9wozjUH9JjuDT/HEaQYA6wYN9mf041l0yLVar6BCZuWABJvHSA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@reflink/reflink-darwin-x64@0.1.19': - resolution: {integrity: sha512-By85MSWrMZa+c26TcnAy8SDk0sTUkYlNnwknSchkhHpGXOtjNDUOxJE9oByBnGbeuIE1PiQsxDG3Ud+IVV9yuA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@reflink/reflink-linux-arm64-gnu@0.1.19': - resolution: {integrity: sha512-7P+er8+rP9iNeN+bfmccM4hTAaLP6PQJPKWSA4iSk2bNvo6KU6RyPgYeHxXmzNKzPVRcypZQTpFgstHam6maVg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@reflink/reflink-linux-arm64-musl@0.1.19': - resolution: {integrity: sha512-37iO/Dp6m5DDaC2sf3zPtx/hl9FV3Xze4xoYidrxxS9bgP3S8ALroxRK6xBG/1TtfXKTvolvp+IjrUU6ujIGmA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@reflink/reflink-linux-x64-gnu@0.1.19': - resolution: {integrity: sha512-jbI8jvuYCaA3MVUdu8vLoLAFqC+iNMpiSuLbxlAgg7x3K5bsS8nOpTRnkLF7vISJ+rVR8W+7ThXlXlUQ93ulkw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@reflink/reflink-linux-x64-musl@0.1.19': - resolution: {integrity: sha512-e9FBWDe+lv7QKAwtKOt6A2W/fyy/aEEfr0g6j/hWzvQcrzHCsz07BNQYlNOjTfeytrtLU7k449H1PI95jA4OjQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@reflink/reflink-win32-arm64-msvc@0.1.19': - resolution: {integrity: sha512-09PxnVIQcd+UOn4WAW73WU6PXL7DwGS6wPlkMhMg2zlHHG65F3vHepOw06HFCq+N42qkaNAc8AKIabWvtk6cIQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@reflink/reflink-win32-x64-msvc@0.1.19': - resolution: {integrity: sha512-E//yT4ni2SyhwP8JRjVGWr3cbnhWDiPLgnQ66qqaanjjnMiu3O/2tjCPQXlcGc/DEYofpDc9fvhv6tALQsMV9w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@reflink/reflink@0.1.19': - resolution: {integrity: sha512-DmCG8GzysnCZ15bres3N5AHCmwBwYgp0As6xjhQ47rAUTUXxJiK+lLUxaGsX3hd/30qUpVElh05PbGuxRPgJwA==} - engines: {node: '>= 10'} - - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - - pnpm@11.9.0: - resolution: {integrity: sha512-vWgtXQP+Ul73yf1ngMaITR51asTJyf4AxTh4KCQxDc+Q493E9Tg18G3669UIXkGFXgvLs7YN4qxburieUDbwOw==} - engines: {node: '>=22.13'} - hasBin: true - -snapshots: - - '@pnpm/exe@11.9.0': - dependencies: - '@reflink/reflink': 0.1.19 - detect-libc: 2.1.2 - optionalDependencies: - '@pnpm/linux-arm64': 11.9.0 - '@pnpm/linux-x64': 11.9.0 - '@pnpm/linuxstatic-arm64': 11.9.0 - '@pnpm/linuxstatic-x64': 11.9.0 - '@pnpm/macos-arm64': 11.9.0 - '@pnpm/win-arm64': 11.9.0 - '@pnpm/win-x64': 11.9.0 - - '@pnpm/linux-arm64@11.9.0': - optional: true - - '@pnpm/linux-x64@11.9.0': - optional: true - - '@pnpm/linuxstatic-arm64@11.9.0': - optional: true - - '@pnpm/linuxstatic-x64@11.9.0': - optional: true - - '@pnpm/macos-arm64@11.9.0': - optional: true - - '@pnpm/win-arm64@11.9.0': - optional: true - - '@pnpm/win-x64@11.9.0': - optional: true - - '@reflink/reflink-darwin-arm64@0.1.19': - optional: true - - '@reflink/reflink-darwin-x64@0.1.19': - optional: true - - '@reflink/reflink-linux-arm64-gnu@0.1.19': - optional: true - - '@reflink/reflink-linux-arm64-musl@0.1.19': - optional: true - - '@reflink/reflink-linux-x64-gnu@0.1.19': - optional: true - - '@reflink/reflink-linux-x64-musl@0.1.19': - optional: true - - '@reflink/reflink-win32-arm64-msvc@0.1.19': - optional: true - - '@reflink/reflink-win32-x64-msvc@0.1.19': - optional: true - - '@reflink/reflink@0.1.19': - optionalDependencies: - '@reflink/reflink-darwin-arm64': 0.1.19 - '@reflink/reflink-darwin-x64': 0.1.19 - '@reflink/reflink-linux-arm64-gnu': 0.1.19 - '@reflink/reflink-linux-arm64-musl': 0.1.19 - '@reflink/reflink-linux-x64-gnu': 0.1.19 - '@reflink/reflink-linux-x64-musl': 0.1.19 - '@reflink/reflink-win32-arm64-msvc': 0.1.19 - '@reflink/reflink-win32-x64-msvc': 0.1.19 - - detect-libc@2.1.2: {} - - pnpm@11.9.0: {} - ---- lockfileVersion: '9.0' settings: @@ -214,6 +15,15 @@ catalogs: '@playwright/test': specifier: 1.60.0 version: 1.60.0 + '@sveltejs/kit': + specifier: 2.68.0 + version: 2.68.0 + '@sveltejs/package': + specifier: 2.5.8 + version: 2.5.8 + '@sveltejs/vite-plugin-svelte': + specifier: 6.2.4 + version: 6.2.4 '@testing-library/react': specifier: 16.3.0 version: 16.3.0 @@ -298,6 +108,12 @@ catalogs: stream-browserify: specifier: 3.0.0 version: 3.0.0 + svelte: + specifier: 5.56.4 + version: 5.56.4 + svelte-check: + specifier: 4.7.1 + version: 4.7.1 tslib: specifier: 2.8.1 version: 2.8.1 @@ -381,7 +197,7 @@ importers: version: 24.7.2 '@vitest/browser-playwright': specifier: 'catalog:' - version: 4.1.8(playwright@1.60.0)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8) + version: 4.1.8(playwright@1.60.0)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8) eslint: specifier: 'catalog:' version: 9.39.4(jiti@2.7.0) @@ -399,13 +215,13 @@ importers: version: 6.1.3 rolldown: specifier: 'catalog:' - version: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.1) + version: 1.0.0-beta.45(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) packages/express: dependencies: @@ -445,13 +261,13 @@ importers: version: 6.1.3 rolldown: specifier: 'catalog:' - version: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.1) + version: 1.0.0-beta.45(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.8(@types/node@22.15.3)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@22.15.3)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + version: 4.1.8(@types/node@22.15.3)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@22.15.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) packages/javascript: dependencies: @@ -482,13 +298,13 @@ importers: version: 6.1.3 rolldown: specifier: 'catalog:' - version: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.1) + version: 1.0.0-beta.45(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) packages/nextjs: dependencies: @@ -522,7 +338,7 @@ importers: version: 9.39.4(jiti@2.7.0) next: specifier: 15.5.18 - version: 15.5.18(@playwright/test@1.60.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 15.5.18(@babel/core@7.29.7)(@playwright/test@1.60.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) prettier: specifier: 'catalog:' version: 3.6.2 @@ -534,13 +350,13 @@ importers: version: 6.1.3 rolldown: specifier: 'catalog:' - version: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.1) + version: 1.0.0-beta.45(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) packages/node: dependencies: @@ -592,13 +408,13 @@ importers: version: 6.1.3 rolldown: specifier: 'catalog:' - version: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.1) + version: 1.0.0-beta.45(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) packages/nuxt: dependencies: @@ -626,7 +442,7 @@ importers: devDependencies: '@nuxt/devtools': specifier: 2.6.4 - version: 2.6.4(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3)) + version: 2.6.4(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3)) '@nuxt/module-builder': specifier: 1.0.1 version: 1.0.1(@nuxt/cli@3.36.0(@nuxt/schema@3.21.7)(cac@6.7.14)(magicast@0.5.3))(@vue/compiler-core@3.5.38)(esbuild@0.28.1)(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)) @@ -635,7 +451,7 @@ importers: version: 3.21.7 '@nuxt/test-utils': specifier: 3.17.2 - version: 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)(magicast@0.5.3)(playwright-core@1.60.0)(terser@5.48.0)(typescript@5.9.3)(vitest@4.1.8)(yaml@2.9.0) + version: 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.32.0)(magicast@0.5.3)(playwright-core@1.60.0)(terser@5.48.0)(typescript@5.9.3)(vitest@4.1.8)(yaml@2.9.0) '@thunderid/eslint-plugin': specifier: 'catalog:' version: 0.0.2(@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.8)(vue-eslint-parser@10.4.1(eslint@9.39.4(jiti@2.7.0))) @@ -653,13 +469,13 @@ importers: version: 1.15.11 nuxt: specifier: 3.21.7 - version: 3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0) + version: 3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.3)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.3)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) packages/react: dependencies: @@ -699,7 +515,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitest/browser-playwright': specifier: 'catalog:' - version: 4.1.8(playwright@1.60.0)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8) + version: 4.1.8(playwright@1.60.0)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8) eslint: specifier: 'catalog:' version: 9.39.4(jiti@2.7.0) @@ -717,13 +533,13 @@ importers: version: 6.1.3 rolldown: specifier: 'catalog:' - version: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.1) + version: 1.0.0-beta.45(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) packages/react-router: dependencies: @@ -751,7 +567,7 @@ importers: version: 19.2.14 '@vitest/browser-playwright': specifier: 'catalog:' - version: 4.1.8(playwright@1.60.0)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8) + version: 4.1.8(playwright@1.60.0)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8) eslint: specifier: 'catalog:' version: 9.39.4(jiti@2.7.0) @@ -772,13 +588,68 @@ importers: version: 6.1.3 rolldown: specifier: 'catalog:' - version: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.1) + version: 1.0.0-beta.45(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + typescript: + specifier: 'catalog:' + version: 5.9.3 + vitest: + specifier: 'catalog:' + version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + + packages/sveltekit: + dependencies: + '@thunderid/browser': + specifier: workspace:^ + version: link:../browser + '@thunderid/node': + specifier: workspace:^ + version: link:../node + jose: + specifier: 'catalog:' + version: 5.2.0 + tslib: + specifier: 'catalog:' + version: 2.8.1 + devDependencies: + '@sveltejs/kit': + specifier: 'catalog:' + version: 2.68.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)))(svelte@5.56.4(@typescript-eslint/types@8.61.1))(typescript@5.9.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@sveltejs/package': + specifier: 'catalog:' + version: 2.5.8(svelte@5.56.4(@typescript-eslint/types@8.61.1))(typescript@5.9.3) + '@sveltejs/vite-plugin-svelte': + specifier: 'catalog:' + version: 6.2.4(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@thunderid/eslint-plugin': + specifier: 'catalog:' + version: 0.0.2(@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.8)(vue-eslint-parser@10.4.1(eslint@9.39.4(jiti@2.7.0))) + '@thunderid/prettier-config': + specifier: 'catalog:' + version: 0.0.2 + '@types/node': + specifier: 'catalog:' + version: 24.7.2 + 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 + svelte: + specifier: 'catalog:' + version: 5.56.4(@typescript-eslint/types@8.61.1) + svelte-check: + specifier: 'catalog:' + version: 4.7.1(picomatch@4.0.4)(svelte@5.56.4(@typescript-eslint/types@8.61.1))(typescript@5.9.3) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) packages/tanstack-router: dependencies: @@ -821,13 +692,13 @@ importers: version: 6.1.3 rolldown: specifier: 'catalog:' - version: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.1) + version: 1.0.0-beta.45(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) packages/vue: dependencies: @@ -842,7 +713,7 @@ importers: version: 2.8.1 vue-router: specifier: '>=4.0.0' - version: 5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3)) + version: 5.1.0(@vue/compiler-sfc@3.5.38)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3)) devDependencies: '@thunderid/eslint-plugin': specifier: 'catalog:' @@ -867,119 +738,50 @@ importers: version: 6.1.3 rolldown: specifier: 'catalog:' - version: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.1) + version: 1.0.0-beta.45(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + version: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) vue: specifier: 3.5.30 version: 3.5.30(typescript@5.9.3) - samples/browser/quickstart: - dependencies: - '@thunderid/browser': - specifier: workspace:* - version: link:../../../packages/browser - devDependencies: - vite: - specifier: ^6.3.5 - version: 6.4.3(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - - samples/express/quickstart: - dependencies: - '@thunderid/express': - specifier: workspace:* - version: link:../../../packages/express - cookie-parser: - specifier: ^1.4.7 - version: 1.4.7 - express: - specifier: ^4.21.2 - version: 4.22.2 - - samples/nextjs/quickstart: + samples/sveltekit: dependencies: - '@thunderid/nextjs': - specifier: workspace:* - version: link:../../../packages/nextjs - next: - specifier: ^15.3.3 - version: 15.5.18(@playwright/test@1.60.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - react: - specifier: ^19.2.3 - version: 19.2.3 - react-dom: - specifier: ^19.2.3 - version: 19.2.3(react@19.2.3) + '@thunderid/sveltekit': + specifier: workspace:^ + version: link:../../packages/sveltekit devDependencies: - '@types/node': - specifier: ^24.7.2 - version: 24.7.2 - '@types/react': - specifier: ^19.2.14 - version: 19.2.14 - '@types/react-dom': - specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.14) + '@sveltejs/adapter-auto': + specifier: ^7.0.1 + version: 7.0.1(@sveltejs/kit@2.68.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)))(svelte@5.56.4(@typescript-eslint/types@8.61.1))(typescript@6.0.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))) + '@sveltejs/kit': + specifier: ^2.63.0 + version: 2.68.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)))(svelte@5.56.4(@typescript-eslint/types@8.61.1))(typescript@6.0.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@sveltejs/vite-plugin-svelte': + specifier: ^7.1.2 + version: 7.1.2(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + prettier: + specifier: ^3.8.3 + version: 3.9.4 + prettier-plugin-svelte: + specifier: ^4.1.0 + version: 4.1.1(prettier@3.9.4)(svelte@5.56.4(@typescript-eslint/types@8.61.1)) + svelte: + specifier: ^5.56.1 + version: 5.56.4(@typescript-eslint/types@8.61.1) + svelte-check: + specifier: ^4.6.0 + version: 4.7.1(picomatch@4.0.4)(svelte@5.56.4(@typescript-eslint/types@8.61.1))(typescript@6.0.3) typescript: - specifier: ^5.9.3 - version: 5.9.3 - - samples/nuxt/quickstart: - dependencies: - '@thunderid/nuxt': - specifier: workspace:* - version: link:../../../packages/nuxt - nuxt: - specifier: ^4.4.8 - version: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(terser@5.48.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0) - vue: - specifier: ^3.5.13 - version: 3.5.30(typescript@5.9.3) - - samples/react/quickstart: - dependencies: - '@thunderid/react': - specifier: workspace:* - version: link:../../../packages/react - '@thunderid/react-router': - specifier: workspace:* - version: link:../../../packages/react-router - react: - specifier: ^19.2.3 - version: 19.2.3 - react-dom: - specifier: ^19.2.3 - version: 19.2.3(react@19.2.3) - react-router: - specifier: ^7.6.2 - version: 7.15.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - devDependencies: - '@vitejs/plugin-react': - specifier: ^4.5.2 - version: 4.7.0(vite@6.4.3(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) - vite: - specifier: ^6.3.5 - version: 6.4.3(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - - samples/vue/quickstart: - dependencies: - '@thunderid/vue': - specifier: workspace:* - version: link:../../../packages/vue - vue: - specifier: ^3.5.13 - version: 3.5.30(typescript@5.9.3) - devDependencies: - '@vitejs/plugin-vue': - specifier: ^5.2.3 - version: 5.2.4(vite@6.4.3(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3)) + specifier: ^6.0.3 + version: 6.0.3 vite: - specifier: ^6.3.5 - version: 6.4.3(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + specifier: ^8.0.16 + version: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) packages: @@ -1108,18 +910,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.29.7': - resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-source@7.29.7': - resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.29.7': resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==} engines: {node: '>=6.9.0'} @@ -1229,6 +1019,9 @@ packages: '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} @@ -1238,6 +1031,9 @@ packages: '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@emotion/babel-plugin@11.13.5': resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} @@ -2015,6 +1811,12 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + '@next/env@15.5.18': resolution: {integrity: sha512-hAV85Ckd9QR6RvH04MEKwsfLTksvFpO47j9xwtoIuvuPnlwecpSi+uZTtm8HirVbtlI2Fnz//xpcSTjFdyJk+g==} @@ -2151,30 +1953,10 @@ packages: peerDependencies: nuxt: ^3.21.7 - '@nuxt/nitro-server@4.4.8': - resolution: {integrity: sha512-cc1fxgSx34Htesx3JBO+hMhbqd6VljXDC06P+UOA5z53cR224TmEFYT/MUuZDkrtt4qLnSG8yq0IxhEM3NCUlw==} - engines: {node: ^22.12.0 || ^24.11.0 || >=26.0.0} - peerDependencies: - '@babel/plugin-proposal-decorators': ^7.25.0 - '@babel/plugin-syntax-typescript': ^7.25.0 - '@rollup/plugin-babel': ^6.0.0 || ^7.0.0 - nuxt: ^4.4.8 - peerDependenciesMeta: - '@babel/plugin-proposal-decorators': - optional: true - '@babel/plugin-syntax-typescript': - optional: true - '@rollup/plugin-babel': - optional: true - '@nuxt/schema@3.21.7': resolution: {integrity: sha512-H35IqlFu4YHXnW0Aw24yCpRuWOJjd9iwS6u9vinsopJo8rrM1/2aKMajX3l9ifhni1XN8nqcKo622z+5ZCQM4w==} engines: {node: ^14.18.0 || >=16.10.0} - '@nuxt/schema@4.4.8': - resolution: {integrity: sha512-igfWuMF0x0Pmx/XwhPwH/bcXgbuwNnjUjqxCAsY6VQhmGKo0e9soJq3Q0ohj+rBkBfX6o2ysTP1/t2M82aK4qA==} - engines: {node: ^14.18.0 || >=16.10.0} - '@nuxt/telemetry@2.8.0': resolution: {integrity: sha512-zAwXY24KYvpLTmiV+osagd2EHkfs5IF+7oDZYTQoit5r0kPlwaCNlzHp5I/wUAWT4LBw6lG8gZ6bWidAdv/erQ==} engines: {node: '>=18.12.0'} @@ -2232,26 +2014,6 @@ packages: rollup-plugin-visualizer: optional: true - '@nuxt/vite-builder@4.4.8': - resolution: {integrity: sha512-54M/k6qVY85Qeoe1m/lPZ0SANGJEbI50r5uYgh3XT942ENve3K5Nk6TMYp8i5wGGC4TWvPea+1mlCrp8rjsXag==} - engines: {node: ^22.12.0 || ^24.11.0 || >=26.0.0} - peerDependencies: - '@babel/plugin-proposal-decorators': ^7.25.0 - '@babel/plugin-syntax-jsx': ^7.25.0 - nuxt: 4.4.8 - rolldown: ^1.0.0-beta.38 - rollup-plugin-visualizer: ^6.0.0 || ^7.0.1 - vue: ^3.3.4 - peerDependenciesMeta: - '@babel/plugin-proposal-decorators': - optional: true - '@babel/plugin-syntax-jsx': - optional: true - rolldown: - optional: true - rollup-plugin-visualizer: - optional: true - '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} @@ -2261,84 +2023,42 @@ packages: cpu: [arm] os: [android] - '@oxc-minify/binding-android-arm-eabi@0.133.0': - resolution: {integrity: sha512-D8M1+nqwLaACHZsld/t6f+cE4N97XOu5iQ88f1ZaYH4ptFzFrXo5N7wUKACTI4xmNUD+6W0Y4Apk5U2r8HLdBQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [android] - '@oxc-minify/binding-android-arm64@0.132.0': resolution: {integrity: sha512-XYogHG1aSjNEMKWUfWmBWtN9rnpQ2nA4MiecdiAOfofDHTQiU5ybrPH6VvDAtRXf2kr8WtPNX7eenhC3uWFWoA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxc-minify/binding-android-arm64@0.133.0': - resolution: {integrity: sha512-dnQUJdpOEh/nZfQtvGGN61VcCCcPJ2aCm+ndl8GIA2lk2GpmIBgZ9h+phLVhgUFGt2es+2AQc0xvtK7RFNsViw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - '@oxc-minify/binding-darwin-arm64@0.132.0': resolution: {integrity: sha512-gm/M5dgm7IvA/g9tweMqiFyD15yKrxGUX3myjFP+EYIYVW+RYuvwU5MAIZUOxXY0GnjU1/iRN/JkLhwvhZVsDQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxc-minify/binding-darwin-arm64@0.133.0': - resolution: {integrity: sha512-K6+aXlOlsCcibpTiTitQYNXWGGwea0fEKF/kGHCNB+MNqOLCkdC7wesycaABYcXcyr58DhDoJnVb8E4Hq95iVw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - '@oxc-minify/binding-darwin-x64@0.132.0': resolution: {integrity: sha512-s7ecbOJeLccy3nqQlkiq9cV0D0q8j1OyHmxRz22m8qZlcKrc3s4gmhwj5ertipA8ePn3FOXv4azf8b5gatDDug==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxc-minify/binding-darwin-x64@0.133.0': - resolution: {integrity: sha512-BFEXHxYNwThyaO63p1VE5MOOXNGkHsHfkmajOCKXH40TfllTHQenXhpJ9mHDoF7EhaQjArpPjlDY88BuPjhurw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - '@oxc-minify/binding-freebsd-x64@0.132.0': resolution: {integrity: sha512-pdYVNmY9NgKetEWzXlVIUlPm4Z3Gz979nTbZUpHlqpjU/rtulpm0fgROo6rlTk+W0HhZCCZ0Jzy1LBKgn5g3mg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxc-minify/binding-freebsd-x64@0.133.0': - resolution: {integrity: sha512-oT5dbcXnS/cbpdXCpudAeVg/fqH1XnKhLUE/vkuRTuocjOd/GA2MoNMMhLWUvqNXO0xJnYmo2ISmDxShkItfOQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - '@oxc-minify/binding-linux-arm-gnueabihf@0.132.0': resolution: {integrity: sha512-QdV2II2mrbygZO/D+umhb+jMs+kmNO2pvQ+kahY8DN7qZVvaR2CiWBQaAxi3yuI0JvmymcUBEFhRrXsaL/lUqg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-minify/binding-linux-arm-gnueabihf@0.133.0': - resolution: {integrity: sha512-tJ3B+b7DOuTsIMXSmu5xHHCakrBqqcrp4COYd/lelOdDvkbFoDRGnwH91POUOSUEOI/WLzIMkDqAH2SZ3N2jhQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - '@oxc-minify/binding-linux-arm-musleabihf@0.132.0': resolution: {integrity: sha512-6OJMBb53luST+xxNSzzg/rRkxMnR4NFQegdu3PCuDEUtP2OEgjmpvvBrHghITpzRsUqnQ/YTl/ItDiLVeoslUA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-minify/binding-linux-arm-musleabihf@0.133.0': - resolution: {integrity: sha512-XMUHfdilk1KTtOM2vA1bwDso07/wkLm/GgDOO9z/ioxrZoQyjXnJRW665VXa08z2BqEgwHRc1zH9p7s6sKPQbg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - '@oxc-minify/binding-linux-arm64-gnu@0.132.0': resolution: {integrity: sha512-ND2GZp6StGQWhSBwOfX13kCCG7O/Z6sEL/dBsWSIgZaetEDUPLOWtKIm2f+TuYUSSmU5nJTSSE5psh9kGcCweQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2346,13 +2066,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-minify/binding-linux-arm64-gnu@0.133.0': - resolution: {integrity: sha512-UEff2jopbwJ4SndmxK06uqXrOpwWiJERJPdgDTBywwXP9QgW0p1YkQnBNt4+jK0I/hdLpbbyaCLLuUPKbaU70w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@oxc-minify/binding-linux-arm64-musl@0.132.0': resolution: {integrity: sha512-3k8ezEKmxs9Wel4N4vfF/8u764mA57j065P8nB4cU2PO/lLKloN0OA41ynfDUrSM1f5jBuF8+mLOj++aNnu4OA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2360,13 +2073,6 @@ packages: os: [linux] libc: [musl] - '@oxc-minify/binding-linux-arm64-musl@0.133.0': - resolution: {integrity: sha512-yqskeIapQvx7Tu/OLsepLPcGsHGzfYy9PX6gIbhaOHfF+LA2zHBKnKb587FGx+lQjHLQR0llfmoSuXQ6q2EN+A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - '@oxc-minify/binding-linux-ppc64-gnu@0.132.0': resolution: {integrity: sha512-vM6jZIxoHoIS5rPb3K3Di0IureL4oU+wOWBy6tLSrjwW2IHqy0442CzO/Ks2U9VCuHV1q0bUGCF0H6AxCEjJHQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2374,13 +2080,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-minify/binding-linux-ppc64-gnu@0.133.0': - resolution: {integrity: sha512-r7PnUNxRB9D/gQjCVeasoieJVUF48n43rvk/jYbGAw9sRfYGoEo/rOs0GyTZU9ttss8HzjBaerAbADbAL8K8vw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] - '@oxc-minify/binding-linux-riscv64-gnu@0.132.0': resolution: {integrity: sha512-KburrmtWpeZg58uo275QRwy5bbNOXQd1WDI2tGxkY2dJBlO7N5V9+Uthvqn6KI/6RBtjd2T5NO4dCC0fgUxGvw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2388,13 +2087,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-minify/binding-linux-riscv64-gnu@0.133.0': - resolution: {integrity: sha512-omXWC8I9lAMMjQIeadfItP5H4VDAiuU2BiVCtHMH3ktTbFq04sxscZhK4NFUUuw3fApDdXmfd7LW18q0JBHarg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - libc: [glibc] - '@oxc-minify/binding-linux-riscv64-musl@0.132.0': resolution: {integrity: sha512-MnahA2MNEtEdxWdUy24JXkMUNgGPqH285GL2L22Zz7k9ixsguFD+bTbbcR88pNqdb075nazozzv3edF83+azCA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2402,13 +2094,6 @@ packages: os: [linux] libc: [musl] - '@oxc-minify/binding-linux-riscv64-musl@0.133.0': - resolution: {integrity: sha512-LtFA3Hi8LVD/zuiPLKy9Aiz7N1IOj8rRhdXiW38GKQ9mAhj+Ko6IHGcTk2A7yNDA1DZBl7r+Qd4PEGWgVelPPw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - libc: [musl] - '@oxc-minify/binding-linux-s390x-gnu@0.132.0': resolution: {integrity: sha512-VE99UPZyQO2MAG4gLGXzrBumD5PGNaiWe+EakaROGCVbT0YH/d9z2ByYqbdWAMEBiTHjthyZp6UUEFVda+LnpQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2416,13 +2101,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-minify/binding-linux-s390x-gnu@0.133.0': - resolution: {integrity: sha512-rFsPDsT1j3beSInbrFukAAlTg101PcqdVMXDioR9AgJ1180tZ8s8D+pNDpQTRmPd3956mnpAE+Cs77Xoo/QZAQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@oxc-minify/binding-linux-x64-gnu@0.132.0': resolution: {integrity: sha512-FKxBkYrSAWNF4V6MacAJ/1E2SJobKKQ2CtW6Aq+pLzzEOjgk2SmxnK7I0bATlFH/O70tbTKDzWb17bySGYRcog==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2430,13 +2108,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-minify/binding-linux-x64-gnu@0.133.0': - resolution: {integrity: sha512-xlrtAmDWZI8BEmsaXMYfblWuLIY5UnnRkit1VLkmVDb5ceZRZf4oEXK1QeYf5Z33dT0WK1Ek++P+TL/ZMCpyGQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - '@oxc-minify/binding-linux-x64-musl@0.132.0': resolution: {integrity: sha512-W8IqA2XRvg/b6l/f+2SdV45/KKmpmwTabrjiMtpg/wzJU5cmKUoHihtJXPc9NA0Ls9S/oP0wB3PMCRQoNr5J1A==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2444,155 +2115,77 @@ packages: os: [linux] libc: [musl] - '@oxc-minify/binding-linux-x64-musl@0.133.0': - resolution: {integrity: sha512-kd36CDkTkZDMNfVceNTSfpWnitE1+GjZmzJCeq8yaxsgvs/MXg8aauI2RgFjElYZIHSMyZku4pQ7Jtl3ZEYI6w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - '@oxc-minify/binding-openharmony-arm64@0.132.0': resolution: {integrity: sha512-X1BL65pI9bfOesLdVUcErjbEAUA3qmzjXCwXPCYsFZT7ela7SsK85+sN3m2TJNxmX1mrFKNg5g8bH+d2zHresw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxc-minify/binding-openharmony-arm64@0.133.0': - resolution: {integrity: sha512-pI38dJBqfkNbFoL/GEarAzGDjKGVCZTdg0a8NKh1PP9GqWleXT6HLtXE4CZ+54e+2u68qVYVBwhbWAiRfwlUZA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - '@oxc-minify/binding-wasm32-wasi@0.132.0': resolution: {integrity: sha512-QcIiwBOj+bV5ub5x39Xb+v0boviykxUtVvVJaIEbG/IH97avFzZcBXec8awYlemLDvgG4WKQwr17x7COR5zwFg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@oxc-minify/binding-wasm32-wasi@0.133.0': - resolution: {integrity: sha512-AkLr+d+LLY4/55J/TrE0srNBUpZPzyU+cygdse7yZ9AhCndryNqe2y6e8naVK0TV7n8lxBd2OGGJAkho6blAkw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [wasm32] - '@oxc-minify/binding-win32-arm64-msvc@0.132.0': resolution: {integrity: sha512-ahFMaa84QVTIROWpLhZcS9jKIv+CXzsJaMmgje7JtlVp1Kaar6tzVCt3EH2aPhSc8RvbGqfmnGdQu/kGwPAZVA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxc-minify/binding-win32-arm64-msvc@0.133.0': - resolution: {integrity: sha512-V92v7397t2073g+mSfaLHnPeoz6hA/1U4JNLeUBP87eWGZgVxDZ2qz3t3wFyYqXGJ/0VoEwdP8yrHLQQ7QzAOQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - '@oxc-minify/binding-win32-ia32-msvc@0.132.0': resolution: {integrity: sha512-tpBkLklqOnaYtlIh6gjmL60pP0Kn2hwaw1Fw3sJyIKwdkCPHsOPy/MRgBUpM0a/SeGFbsZRQkHnWfZXS1GTbbQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxc-minify/binding-win32-ia32-msvc@0.133.0': - resolution: {integrity: sha512-2DP5RbG/SSaRVtmuwgTH6Ati4+uuOJjoI88dQnC5hD0zCC90EVDXZSXyJQ5i/OxLE1UAy58Wo2DJot/OrUspzA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ia32] - os: [win32] - '@oxc-minify/binding-win32-x64-msvc@0.132.0': resolution: {integrity: sha512-a69yKrBl2p9O8cdAHbHih56eKhcpKJRVkRu/S+CwCdR2Zsh4nnqYIllF96Lxg3jDjRQNL3t0xZNdYBDG5Vgq+w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxc-minify/binding-win32-x64-msvc@0.133.0': - resolution: {integrity: sha512-PJ75c6PlBx87tau0W35J43eGCv4wrDmdZ+4ddTZAnGtZqEeCVsLdmDPOEMe2DepogqlSVUF2kGBWtnFUJ5c7Rw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - '@oxc-parser/binding-android-arm-eabi@0.132.0': resolution: {integrity: sha512-KrLaPWa5c9Y7LkW+rKkaUE3y7DBDrQtaf7rlsSDfv6KAHUjgzAIRA761Lrrp6//Yd/Rlie/yEOt9YENCoJnOcw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxc-parser/binding-android-arm-eabi@0.133.0': - resolution: {integrity: sha512-l/44caGse+VpnY9gx0yvvc5QnnG3yG1FO3KZgYvNL1GZrfK86zIwAOgGEVlxDyRymzrU/KHiblPFpevKOmJmUA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [android] - '@oxc-parser/binding-android-arm64@0.132.0': resolution: {integrity: sha512-SThDrSeamB/kG2+NxcJ5/wSLcV6dUqDknrPLqFYQ0ST/55mtBP4M7Q/f3QbubH6aAd11wpzZn/nwbVRSdobOpg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxc-parser/binding-android-arm64@0.133.0': - resolution: {integrity: sha512-KUHmPMziLBp4u+zbrLdB7iWS7KshuZe+RAp7ELnY9SI9nNXBZ+dp8fiBqWOxhXqn+FQg3a4UcQhwmsJOKV8Jjg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - '@oxc-parser/binding-darwin-arm64@0.132.0': resolution: {integrity: sha512-Lc0f/TYoKBghE5/2Gsv7bLXk+TJZunx2Tf61X8hG4ARXdc8UYI26dCGccFSd1AyFbK3jfaNXtMnupggDbjPXdQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxc-parser/binding-darwin-arm64@0.133.0': - resolution: {integrity: sha512-q8dWmnU/8ea2tga9w2f1PinQ5rcMPDUGkF64T189b65YMjUomET4oy5oRldOr4AwOQkneOG/Zttnz1Dvrc62wg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - '@oxc-parser/binding-darwin-x64@0.132.0': resolution: {integrity: sha512-RG2eJIpf7C21z9HSSXFw1bTArdpKe7Y4fwcJTwRq1yCSe1vSavaN9GA1sm9KqzemTLAGVktQ+7qBTGp0vQeUZg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxc-parser/binding-darwin-x64@0.133.0': - resolution: {integrity: sha512-cOKeIELIB2bJnCKwqx4Rdj+1Lss/U6uCbLxRySZrhyOOQa1flKhwZFjEHRHxk8fU1NKmhK5OnTdPQ4CpjuFuVw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - '@oxc-parser/binding-freebsd-x64@0.132.0': resolution: {integrity: sha512-wQIPntPLtJ8NcBpvKPbEv3NqzV6k8eP8tP/jE9Rg8HTg/j7urZGFSsTCPCW5k77Qfw2DM4vRvc9p3I4yq/Shvw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxc-parser/binding-freebsd-x64@0.133.0': - resolution: {integrity: sha512-OpaSv4pW3KgFrMYQxTaS0aOE4T1DQF3qZE/4B6uqqv1KgPWWd4UQhJALi8PJPX1RRV5K7ThKXRfF7qGg2+3l1A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - '@oxc-parser/binding-linux-arm-gnueabihf@0.132.0': resolution: {integrity: sha512-PixKEpeSe3yxQWqNyOCBALRYc72+Tj7ILDofUl3iXo25cVOzLA6jHUhmOINRtWIPh7dbUie3QNeabwaQpZTw6w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-gnueabihf@0.133.0': - resolution: {integrity: sha512-JGK1wlGrGwxBIlVSF7KWTX1/ru6BEtf28fRROztDRkLfiW+Kxa4onnriezMIiogfn9hVw2KzYcKiLjkLR2ns8A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - '@oxc-parser/binding-linux-arm-musleabihf@0.132.0': resolution: {integrity: sha512-sCR+DzGHlyHKnbA2z9zWjTUhIo8Sy0enJl4RDsBwPmkxYynPatpwOAWe8W5127SlW0boqUWHGtr1NWn5UwIhXQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-musleabihf@0.133.0': - resolution: {integrity: sha512-yuZO533Ftonxn/iyoqQzURzLQHMspvsIyfiCSNi1t/ER4eIQaR0SsmUOUm5b/lmSig7IWIUa5/BrbEkAPwcilQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - '@oxc-parser/binding-linux-arm64-gnu@0.132.0': resolution: {integrity: sha512-sQBix5P2cW+IpzTcCwYxnh9yALrKSIkKJThspBvMGcygSMnbzkSvhN7SfuX1hvBk8y1XEChsdkU3ET0V5DmzUw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2600,13 +2193,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-arm64-gnu@0.133.0': - resolution: {integrity: sha512-hvpbqT5pN2rR+3+xtWeizwfR/aZ0vGceg6TqYMl+ToxMpk9/tmnX7kSvQnfEUkoua8mhogzvIKsAkn0wxgblBA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@oxc-parser/binding-linux-arm64-musl@0.132.0': resolution: {integrity: sha512-WozHg3Kc//8Sk756HXXgMbEAvqtG+Lzb9JOojwQzIGDtN78Az2dLttkb71akWYUF/8IgYfDSlfKh4Uot8is5Vw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2614,13 +2200,6 @@ packages: os: [linux] libc: [musl] - '@oxc-parser/binding-linux-arm64-musl@0.133.0': - resolution: {integrity: sha512-wJQGamIosQBoJHW9+S5XxrtKRo3eyJxsnS1XCPrqN0LHi8uw1pTqqTfn3t/NVuvbBg7Pumn4ez9Eidgcn0xbEg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - '@oxc-parser/binding-linux-ppc64-gnu@0.132.0': resolution: {integrity: sha512-CmX/ulNBOEwWTyVRmcpYKAcAizW6+OjtLJgo7fXoL9OqQvjF4VER8tPomv44vwzfSCy1BHbsB0ZlZYzYJNj4cA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2628,13 +2207,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-ppc64-gnu@0.133.0': - resolution: {integrity: sha512-Koaz32/O5+abIfrNGdyndgRvdOZ9jEf5/z3Ep9h3h2QWpdDiUQpVwgH0OcMXCs+l9aXxPLtkupqyVig9W6FDKw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] - '@oxc-parser/binding-linux-riscv64-gnu@0.132.0': resolution: {integrity: sha512-j9oQS+hM90SdhviNGWbPgT4+Rlq+ac++q/zjgwPD1mVHgxHzATvoRGtDx0sXGmFOQ9J9YkwAhYGb5MAHL6TAsA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2642,13 +2214,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-riscv64-gnu@0.133.0': - resolution: {integrity: sha512-R4vOjWzxhnNWHnVLeiB6jNuIifdy9vcMXZGPc7StXcxBovI+U2zg1QhZ9o8OjV80oGivs1lX5NfPLzk4IPqlRA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - libc: [glibc] - '@oxc-parser/binding-linux-riscv64-musl@0.132.0': resolution: {integrity: sha512-bLz+Xi+Agnfmd7kWPEsSVwCn2k4EyIalZkNBcQ0OGIv9rqn8VgCPLNd03tM9mKX/5TdlvDXalz0q71BIrOPNqg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2656,13 +2221,6 @@ packages: os: [linux] libc: [musl] - '@oxc-parser/binding-linux-riscv64-musl@0.133.0': - resolution: {integrity: sha512-iwgBNUTHiMdxARLYuM0SBlnYeb19iw1Ea5M+4ERZupCsBMLArti6FyZ6UfFjJxIiTDr2oW2DGQFxlQVQ/dW9rA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - libc: [musl] - '@oxc-parser/binding-linux-s390x-gnu@0.132.0': resolution: {integrity: sha512-U6t2qbJU0ypTfyj9QV3W1Y6mITDTL8ai/OR6NUn85vyHthOvobKWgXzU4tu0EskSzlpuVFz1g0jFGulDIUKHxQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2670,13 +2228,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-s390x-gnu@0.133.0': - resolution: {integrity: sha512-ZwZNo8FZmB/gVfboQl+wXilBigGl+6nQQs+nITOeAP/HcAOjiHl6XZJL9F/KXNEspODQcbjAiyjUbeCJd9a0fA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@oxc-parser/binding-linux-x64-gnu@0.132.0': resolution: {integrity: sha512-WcEaSNHFk8yz5YFlQQAlhq6jOFmZBB/RKE7uzhyCIf+pF1Lmv9gUH4221mle2Gd9iHyWT3ySNph8yZgb1xYdWg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2684,13 +2235,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-x64-gnu@0.133.0': - resolution: {integrity: sha512-govCvWx1dBlED3uu4qXctxpRcouu9I8Kn+DBktGCl760JtlGJzc9l/OmPJKlYWSbrRqKkMZehNeZ/4Wfma7uSA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - '@oxc-parser/binding-linux-x64-musl@0.132.0': resolution: {integrity: sha512-iQrV4iJzQgRwK3BWRmQl1C3C6g3wYpXN2WLdQdyR+efoUnncdShZAVp9OgcojtlD3MDRbuOMGG3SjxF4fL4nlQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2698,76 +2242,40 @@ packages: os: [linux] libc: [musl] - '@oxc-parser/binding-linux-x64-musl@0.133.0': - resolution: {integrity: sha512-ssTlpXD5Mq9uCssDJPzlRWqBt4Y7Zzd9i+XZhWmK/9Y6KUIuAxVYTYiI8lxcGWi0+3/Cz4A8q9UrD4NK9Y2j7g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - '@oxc-parser/binding-openharmony-arm64@0.132.0': resolution: {integrity: sha512-FWzmUGrZ6GUby4U7WIwcCtab6tdmlTO3xTRRKyb5kjIJVEiaUAT8animUG/nK8ZCA8gkRkPOTId4rl6uTqUmJQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxc-parser/binding-openharmony-arm64@0.133.0': - resolution: {integrity: sha512-51aByfXhPtLEdWG4a2Ihdw6cPWV1ei1AarALpFdDP8MLWDLE2NuUMgbo3DERR2Kt8fT/ok1GUvBiLxVGke9uUQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - '@oxc-parser/binding-wasm32-wasi@0.132.0': resolution: {integrity: sha512-TlbMppxJI5CjWDes0QaP6G3aneVg1yikBu5QYI+DUShF9WDL66ccgKFNNGmi/Wybtszw6hxwAvv76T4DaPKnHw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@oxc-parser/binding-wasm32-wasi@0.133.0': - resolution: {integrity: sha512-2e16tkKp+wDO2GTAmXfxbBcCmGEaFPIJEIRBBmVKNVXSc8/fJsSIaBGyFTPHM9ST5GNWgJcYIt94rDTks+PLwA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [wasm32] - '@oxc-parser/binding-win32-arm64-msvc@0.132.0': resolution: {integrity: sha512-RH/NbFjGKqdUAUi7Oh3LQPxUk2hsWFEEQ38HSnbRQT8QjBZFKqL1fMbmsB3N4jy/KPh9iX94+9dmkEMBBbambw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxc-parser/binding-win32-arm64-msvc@0.133.0': - resolution: {integrity: sha512-KPTNDKbxH1cglrqTyVeXHb4Pk4oksz8EcE1/v8zqU7N4UXbiHfA/IwtXZ2U77fnRAWBbgVkl/lZbL7o3hRdejg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - '@oxc-parser/binding-win32-ia32-msvc@0.132.0': resolution: {integrity: sha512-JUr4jQY9jxoIB/YTLXr6XofSi5xikj6p5/Ns1h0VOBDT0j1jKU+kMsv2xxv51RwnETcXpA1Yw/9oUAfcqfaqEA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxc-parser/binding-win32-ia32-msvc@0.133.0': - resolution: {integrity: sha512-Una1bNYv9zCavQrfnDR9wuZVB3itLjCEH4Oz7i6CwAJN/Xq9b+zbbcxmvdkKvvJt4Ngc/MBmIYlbLo3zS4TQ0A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ia32] - os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.132.0': resolution: {integrity: sha512-2dapgHpA5X8DSXF4AU36hJWYf6zP0tKjMXFRAZFBD62pkevW/uhFDXoFH9Y/3Fd2EtDrw5ByNnR1wVE9X9y0SQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.133.0': - resolution: {integrity: sha512-kjBhCiOGSYTwDJQuuZa7a94JbP8htWu7J0X1KwH74kV2K5eYf6eyJRYmkpCDvr0XEL8tMxYI4WU1VekblFCLgg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - '@oxc-project/types@0.132.0': resolution: {integrity: sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==} - '@oxc-project/types@0.133.0': - resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + '@oxc-project/types@0.137.0': + resolution: {integrity: sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==} '@oxc-project/types@0.95.0': resolution: {integrity: sha512-vACy7vhpMPhjEJhULNxrdR0D943TkA/MigMpJCHmBHvMXxRStRi/dPtTlfQ3uDwWSzRpT8z+7ImjZVf8JWBocQ==} @@ -2778,84 +2286,42 @@ packages: cpu: [arm] os: [android] - '@oxc-transform/binding-android-arm-eabi@0.133.0': - resolution: {integrity: sha512-2A79NBpyBKgHJ0FwgC8D1hzp3x2ujyvqq/kG+M76YyDMMkxLhX6A3vjnAnfEKycOoZxuKhwYu8BF9hKq67ykIA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [android] - '@oxc-transform/binding-android-arm64@0.132.0': resolution: {integrity: sha512-sr2BbEHtc5OkAN2nt5BpWGg/MnDkyQKf6tSjaZZ6k7Bb2FOa2CzZDy2pvH6tYdg+Ch/p/OGXXhENFVV9GU7ASw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxc-transform/binding-android-arm64@0.133.0': - resolution: {integrity: sha512-dynEph/hyoSgBzd2XbNlW37NK97nU6tZMs5jrhObUxSasBV/Gv9THZrWj9AlbWiMXR07WFYE82C9axjntYyBSw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - '@oxc-transform/binding-darwin-arm64@0.132.0': resolution: {integrity: sha512-yjL1GbN9Bb1HqjE8CS8NSwoZtDWgUGy43VbuFhmT4LEDx4Ph0guzVAyUKhc2CqqA4/x60qDvcH6QxwrguaqEVA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxc-transform/binding-darwin-arm64@0.133.0': - resolution: {integrity: sha512-4hGgKOG+dZSN3xjcgNWpcihekRG7/YbbAdjyz07yv0HjzA6kdqYAhGrn84374UPO2h6etYJwsCBoM9iJHHvJ8w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - '@oxc-transform/binding-darwin-x64@0.132.0': resolution: {integrity: sha512-e3vVXEbNw93aHr3si8eVpUgl+jWF6Ry8RgUihgSxiI+2c/VMxiPsEDghkqPcjujqsMYDRdISWJi23xk+PP72ow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxc-transform/binding-darwin-x64@0.133.0': - resolution: {integrity: sha512-7J11/9PFkznmKuANkCAjt3znV1BcDFXQSgDiBvDxXT3Wm6995/zxrJD5zmo+5XSgY4sm+2V8/ED6ZSD3mKOC5A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - '@oxc-transform/binding-freebsd-x64@0.132.0': resolution: {integrity: sha512-dIhAhkX8/It4IaKI944fN3jmfzunqv2sEG2G4fQdP5/1psycdqUHoVaY23DbpuYRIu4sWAdn/e1zQFP0GMkQOQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxc-transform/binding-freebsd-x64@0.133.0': - resolution: {integrity: sha512-5EMAO0vzCpUfhn6aSjIUeJeRI2ztevHwSVr/M8sZ2VBYc79UuOfjjMCQ67LtUbgpvQtpBWkzeAHCP3L7JFYmlg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - '@oxc-transform/binding-linux-arm-gnueabihf@0.132.0': resolution: {integrity: sha512-eR0dfj1us7DNbGZ6eBdAqWnLZRkLqHFqewSHudX4gV7di3By8E05+M+qsGTB/zq/78Z0BYJeK1zGWu9un6jocw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-transform/binding-linux-arm-gnueabihf@0.133.0': - resolution: {integrity: sha512-z6XT8tmo9sPmCIYaFIxDelBU4wXLwwWMX2VNCMIY6bkQp5r+kRtVXYS3yLbJHMKEhRKvw/g+Z7fO9aadsGGEAw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - '@oxc-transform/binding-linux-arm-musleabihf@0.132.0': resolution: {integrity: sha512-naNx0WaV70hKtgQ5LUS/jzRTy6XEQZ1krK7KTFZQLI1mEz+GqLrwsLCqEmtrQ6HcqLhvGvA6GAWfFrc/0mWryA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-transform/binding-linux-arm-musleabihf@0.133.0': - resolution: {integrity: sha512-GQDpEV2VhHG8hT5BviDv+emi9oHYhfv+JJJWROYp+eGgWjiQMp4QZVb6Bu3kwVMzkwy0r200ToA1KThYTq53ug==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - '@oxc-transform/binding-linux-arm64-gnu@0.132.0': resolution: {integrity: sha512-TWk1p0tbtE1tkMEABftfgXhMEfuoz3QieqBtMBXXyijizw/2YKNzbVSndG+vV73cSZgbyfoZ346pmuz0tQMzyw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2863,13 +2329,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-transform/binding-linux-arm64-gnu@0.133.0': - resolution: {integrity: sha512-VstR+NEQAJb80ysWk2vPjEvg0JzwEjKn2hDbC/joa5zGXkCnVVCWgAGG8c6o23S981a7XRpCMcClBgeD1q9H2A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@oxc-transform/binding-linux-arm64-musl@0.132.0': resolution: {integrity: sha512-LxURDI0Wm2KCQm/3ynNlI+nTgPdfmAfmrl54XPx+gaIqty8S/XWNCCTvLJWaCb0e5eKqnzrcTuhMDOdawqoYIA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2877,13 +2336,6 @@ packages: os: [linux] libc: [musl] - '@oxc-transform/binding-linux-arm64-musl@0.133.0': - resolution: {integrity: sha512-Ec7xJdDrnukgiz20E3iDNzAIgx1XXn8cVVsNNUpgEIAvNlXZaocqlQT8Zalk0Lv3fbkxcJ+9BuWB0ndBRHQtzg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - '@oxc-transform/binding-linux-ppc64-gnu@0.132.0': resolution: {integrity: sha512-eKEeG6SLtj01iDvi5QgMNzyEXt/K2BNWafZ0jGECmvqTWWaO2l4qBxUW+X+sAXp5vZBoT2WO3ZnshvIWXWjtKw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2891,13 +2343,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-transform/binding-linux-ppc64-gnu@0.133.0': - resolution: {integrity: sha512-6YX38grimcigz20eYpyz6e4c9rDKzwK3i+tcDpgwYj0bWreaAOwrABmSmKplPJOorkDVlbT69wPCN+d11irBQw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] - '@oxc-transform/binding-linux-riscv64-gnu@0.132.0': resolution: {integrity: sha512-Kz6tg1Msra7+2iGV8K5xANLO2SmpP6n+91/Yy+JJh9EagU4hvMm7loReszzz2bwhs6Xs4HPrglxIngMdqnHpXw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2905,13 +2350,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-transform/binding-linux-riscv64-gnu@0.133.0': - resolution: {integrity: sha512-WxMIzItRJR66lgaAyyqj0FFwLMpcuCV9mTFcUMQpIz8+Hey1Enk8xuv+7QpSsqCR5zRlwNr092dsFkz5cbvtrw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - libc: [glibc] - '@oxc-transform/binding-linux-riscv64-musl@0.132.0': resolution: {integrity: sha512-dtUSp80ElrxUhfBNmFWGkFQQ51j3tRoZkKBXxEWh+hb+S6bbEdZCW/VuCYo/gCTH3DywwyTeWiG+dtZfJiHKvg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2919,13 +2357,6 @@ packages: os: [linux] libc: [musl] - '@oxc-transform/binding-linux-riscv64-musl@0.133.0': - resolution: {integrity: sha512-+x6dnO87986rjVNjcF0tg8wVS0e/SH8nzLa/X0Wsh7jtEniN7buvR8iqZm8pnsfaZ8DH5F4GCSZpoPRrd9jJ6w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - libc: [musl] - '@oxc-transform/binding-linux-s390x-gnu@0.132.0': resolution: {integrity: sha512-9qVyCbYSs8dwVPpqKKWxuUAnLJ1+LyC5A4oNMZTzymRhuQr3coqAP/XWfJ8LlhQqI9GvhK0SWCOK0iM3HFUAnA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2933,13 +2364,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-transform/binding-linux-s390x-gnu@0.133.0': - resolution: {integrity: sha512-oEyQudXIwWM/+v0vZzPbAi25YMWyvjtQYYjuSrhMEQwe7ZEMDXscX7U1j6alrVdZq2DtCMeror3X/Dv7p/JUwg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@oxc-transform/binding-linux-x64-gnu@0.132.0': resolution: {integrity: sha512-dUtJkDCYndDaxcuiSMyRoSb7sXmTbcJ61rDsUjIakghP6BkKwH57lyHYvSUhT1ZswXWwCjf3ksxlT8nA0iU6ag==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2947,13 +2371,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-transform/binding-linux-x64-gnu@0.133.0': - resolution: {integrity: sha512-G8P/OadKTbyUHz5TK63sDDtUHwn2SXG/o0oGo4GGTzBu70xmUSN5/ZUgpyl6ypAmbshoyw8nC7+msb3BjzHxaA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - '@oxc-transform/binding-linux-x64-musl@0.132.0': resolution: {integrity: sha512-I7BkkktnrriiO7o1dF3RDgKZoSmFKX9IE0W2LE1WdfmpZcAa3fbv5BW6oVbzk40iD29hWSP69A65WT9l6dxuzg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2961,71 +2378,35 @@ packages: os: [linux] libc: [musl] - '@oxc-transform/binding-linux-x64-musl@0.133.0': - resolution: {integrity: sha512-Oi/fyOzZ+aytmmsRND5pGgvux4n++v9cG4qNFiXj7qFwSqBKWZHBq7cJLXqbH1I81pyI3kvU1Za+1qk3afXuwg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - '@oxc-transform/binding-openharmony-arm64@0.132.0': resolution: {integrity: sha512-yiXaRYqgySJguURNZUFLDzSI1NTkP1jJKrowr8lQCKwY5N8DsESbQJ1RpSlEbeXGiy201puA+QC2fdr+ywQM/A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxc-transform/binding-openharmony-arm64@0.133.0': - resolution: {integrity: sha512-/ZElgq+/tcga27X2G2AUpxcYX0baX94Gz658w6Zz2P+6Kr06bfYSrdtC0P7oPrbu3Gy/6kpiSoJPgZy8R2IjYQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - '@oxc-transform/binding-wasm32-wasi@0.132.0': resolution: {integrity: sha512-KNago0Mv+zl2yl5hK2G9V4Yb7Tgpn+z6lgzgaHXkGp7S+iuUtN3av+QqPCD/J+Odq6EjjyXJrFPfmyjbXXbf4Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@oxc-transform/binding-wasm32-wasi@0.133.0': - resolution: {integrity: sha512-GANcoEa8Nzza7saxdb4qWO24U6jk4nK6G+g87lGp8TTU45CUvWf1Igdze2+NrebgiwOy6F1/h6Esag4DM3JTtQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [wasm32] - '@oxc-transform/binding-win32-arm64-msvc@0.132.0': resolution: {integrity: sha512-3fprECrLHwPP809a1SRzszDxp8Fpp8IOg0V2EO49wS+3JmRFOo090h5c37faZvym5VnRZ12DH2tkT6ZVXwlOsA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxc-transform/binding-win32-arm64-msvc@0.133.0': - resolution: {integrity: sha512-2+uDo/+ZvGQu10J8xryg/l5PdBt2vXPtf+0aIosVKJavqCaKcBDdo95OUaEulx0bqvoytAQ4yyz2gcPZ40mjcQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - '@oxc-transform/binding-win32-ia32-msvc@0.132.0': resolution: {integrity: sha512-n616QqZ3hXasHytVoFjo6pLzIfo6hQwBEir0kOcaObKaAw0ZbncIe1h5a6IMnCOJGLP30WwnhwLW20tIV78MAA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxc-transform/binding-win32-ia32-msvc@0.133.0': - resolution: {integrity: sha512-zpPIZ1S3JHmSEFyyGyPYCwhOiNLyfaPifYxK8BQY21JXyHglu/wUr3/ESFrXb+XegEy/iBlWbzr3FzPtcq1MUw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ia32] - os: [win32] - '@oxc-transform/binding-win32-x64-msvc@0.132.0': resolution: {integrity: sha512-P7A4Cz/0C0Oxa2zH/oCruzA/5EHr5RRz0x6KXYz3wwhS+dFqIBxP9yo8FKjXhKXHRKa+M+QHo+bqYiqqlVsEQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxc-transform/binding-win32-x64-msvc@0.133.0': - resolution: {integrity: sha512-cADrfLvc/VeyvpvQS+t5ktqfyqyyGANZC5NHp++JAElacfXqq/+k8bYkjqMWzNZ3HxkJtL1qDHfZZCA9+4hlSQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - '@package-json/types@0.0.12': resolution: {integrity: sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw==} @@ -3150,30 +2531,60 @@ packages: cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.1.3': + resolution: {integrity: sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.0-beta.45': resolution: {integrity: sha512-xjCv4CRVsSnnIxTuyH1RDJl5OEQ1c9JYOwfDAHddjJDxCw46ZX9q80+xq7Eok7KC4bRSZudMJllkvOKv0T9SeA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.1.3': + resolution: {integrity: sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.45': resolution: {integrity: sha512-ddcO9TD3D/CLUa/l8GO8LHzBOaZqWg5ClMy3jICoxwCuoz47h9dtqPsIeTiB6yR501LQTeDsjA4lIFd7u3Ljfw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.1.3': + resolution: {integrity: sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0-beta.45': resolution: {integrity: sha512-MBTWdrzW9w+UMYDUvnEuh0pQvLENkl2Sis15fHTfHVW7ClbGuez+RWopZudIDEGkpZXdeI4CkRXk+vdIIebrmg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.1.3': + resolution: {integrity: sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.45': resolution: {integrity: sha512-4YgoCFiki1HR6oSg+GxxfzfnVCesQxLF1LEnw9uXS/MpBmuog0EOO2rYfy69rWP4tFZL9IWp6KEfGZLrZ7aUog==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.1.3': + resolution: {integrity: sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.45': resolution: {integrity: sha512-LE1gjAwQRrbCOorJJ7LFr10s5vqYf5a00V5Ea9wXcT2+56n5YosJkcp8eQ12FxRBv2YX8dsdQJb+ZTtYJwb6XQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3181,6 +2592,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.1.3': + resolution: {integrity: sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.45': resolution: {integrity: sha512-tdy8ThO/fPp40B81v0YK3QC+KODOmzJzSUOO37DinQxzlTJ026gqUSOM8tzlVixRbQJltgVDCTYF8HNPRErQTA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3188,6 +2606,27 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.1.3': + resolution: {integrity: sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.1.3': + resolution: {integrity: sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.1.3': + resolution: {integrity: sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.45': resolution: {integrity: sha512-lS082ROBWdmOyVY/0YB3JmsiClaWoxvC+dA8/rbhyB9VLkvVEaihLEOr4CYmrMse151C4+S6hCw6oa1iewox7g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3195,6 +2634,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.1.3': + resolution: {integrity: sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.45': resolution: {integrity: sha512-Hi73aYY0cBkr1/SvNQqH8Cd+rSV6S9RB5izCv0ySBcRnd/Wfn5plguUoGYwBnhHgFbh6cPw9m2dUVBR6BG1gxA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3202,23 +2648,47 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-x64-musl@1.1.3': + resolution: {integrity: sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@rolldown/binding-openharmony-arm64@1.0.0-beta.45': resolution: {integrity: sha512-fljEqbO7RHHogNDxYtTzr+GNjlfOx21RUyGmF+NrkebZ8emYYiIqzPxsaMZuRx0rgZmVmliOzEp86/CQFDKhJQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.1.3': + resolution: {integrity: sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.45': resolution: {integrity: sha512-ZJDB7lkuZE9XUnWQSYrBObZxczut+8FZ5pdanm8nNS1DAo8zsrPuvGwn+U3fwU98WaiFsNrA4XHngesCGr8tEQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.1.3': + resolution: {integrity: sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.45': resolution: {integrity: sha512-zyzAjItHPUmxg6Z8SyRhLdXlJn3/D9KL5b9mObUrBHhWS/GwRH4665xCiFqeuktAhhWutqfc+rOV2LjK4VYQGQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.1.3': + resolution: {integrity: sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.45': resolution: {integrity: sha512-wODcGzlfxqS6D7BR0srkJk3drPwXYLu7jPHN27ce2c4PUnVVmJnp9mJzUQGT4LpmHmmVdMZ+P6hKvyTGBzc1CA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3231,8 +2701,11 @@ packages: cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-beta.27': - resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + '@rolldown/binding-win32-x64-msvc@1.1.3': + resolution: {integrity: sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] '@rolldown/pluginutils@1.0.0-beta.45': resolution: {integrity: sha512-Le9ulGCrD8ggInzWw/k2J8QcbPz7eGIOWqfJ2L+1R0Opm7n6J37s2hiDWlh6LJN0Lk9L5sUzMvRHKW7UxBZsQA==} @@ -3488,6 +2961,65 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@sveltejs/acorn-typescript@1.0.10': + resolution: {integrity: sha512-4WfKk68eTih+MiJD4fSbxN7E8kVBmTMPWHUPYjvl2N0rMs53YLTT8/YjKU5Dtnz5LqDjl7LEw4U7lXR2W3J5WA==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-auto@7.0.1': + resolution: {integrity: sha512-dvuPm1E7M9NI/+canIQ6KKQDU2AkEefEZ2Dp7cY6uKoPq9Z/PhOXABe526UdW2mN986gjVkuSLkOYIBnS/M2LQ==} + peerDependencies: + '@sveltejs/kit': ^2.0.0 + + '@sveltejs/kit@2.68.0': + resolution: {integrity: sha512-PdKiWsqinAoubVsSiRgVFkg3MHzGhQPnwQ8VxnGQKpZYijpapZ3UHHBje0GeByt2TvfjHPw+kxV+dNK2RIZg9g==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: ^5.3.3 || ^6.0.0 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + typescript: + optional: true + + '@sveltejs/load-config@0.2.0': + resolution: {integrity: sha512-1LgZ/qUqSoq+QorD83lk2hka79Px0wXNW2q5V1nZlxGhQgw1jrsIbVz5YiCeucVLo4XvFLjXukUaQjIiqowkcg==} + engines: {node: '>= 18.0.0'} + + '@sveltejs/package@2.5.8': + resolution: {integrity: sha512-zeBbsXYvHiBu56v4gJaGQoEHzg96w0E1j3dOMX8vo56s6vI5eQ57ZEZhudjwjnegnVitRRu5MrmhO0eNvaonIw==} + engines: {node: ^16.14 || >=18} + hasBin: true + peerDependencies: + svelte: ^3.44.0 || ^4.0.0 || ^5.0.0-next.1 + + '@sveltejs/vite-plugin-svelte-inspector@5.0.2': + resolution: {integrity: sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@sveltejs/vite-plugin-svelte@6.2.4': + resolution: {integrity: sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@sveltejs/vite-plugin-svelte@7.1.2': + resolution: {integrity: sha512-DrUBA2UXRfDmUX/ZTiEopd3X40yavsJF1FX2RygcuIScHL7o5YX1fMvoYnDhjeJQC4weCOklirpNWlcb2NiSeA==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + svelte: ^5.46.4 + vite: ^8.0.0-beta.7 || ^8.0.0 + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -3579,21 +3111,12 @@ packages: '@tybys/wasm-util@0.10.2': resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/body-parser@1.19.6': resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} @@ -3608,6 +3131,9 @@ packages: peerDependencies: '@types/express': '*' + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -3893,12 +3419,6 @@ packages: engines: {node: '>=20'} hasBin: true - '@vitejs/plugin-react@4.7.0': - resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitejs/plugin-vue-jsx@5.1.5': resolution: {integrity: sha512-jIAsvHOEtWpslLOI2MeElGFxH7M8pM83BU/Tor4RLyiwH0FM4nUW3xdvbw20EeU9wc5IspQwMq225K3CMnJEpA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3906,13 +3426,6 @@ packages: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 vue: ^3.0.0 - '@vitejs/plugin-vue@5.2.4': - resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - vite: ^5.0.0 || ^6.0.0 - vue: ^3.2.25 - '@vitejs/plugin-vue@6.0.7': resolution: {integrity: sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4111,10 +3624,6 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} @@ -4186,6 +3695,10 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.1: + resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} + engines: {node: '>= 0.4'} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -4194,9 +3707,6 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-includes@3.1.9: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} @@ -4353,10 +3863,6 @@ packages: birpc@4.0.0: resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} - body-parser@1.20.5: - resolution: {integrity: sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@2.3.0: resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} engines: {node: '>=18'} @@ -4432,9 +3938,6 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-api@4.0.0: - resolution: {integrity: sha512-B0hQ1OLyJuHTQSOWXvwibWqM6DCoqJdvBA6X1S/53bd4XU7LJ1yurIPlrsouol3mw1jh9pGI4ivubSpmJeIqCA==} - caniuse-lite@1.0.30001799: resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} @@ -4471,6 +3974,10 @@ packages: resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} engines: {node: '>=20'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + cluster-key-slot@1.1.1: resolution: {integrity: sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==} engines: {node: '>=0.10.0'} @@ -4523,10 +4030,6 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - content-disposition@1.1.0: resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} engines: {node: '>=18'} @@ -4554,20 +4057,14 @@ packages: cookie-es@3.1.1: resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} - cookie-parser@1.4.7: - resolution: {integrity: sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==} - engines: {node: '>= 0.8.0'} - - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - - cookie-signature@1.0.7: - resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} - cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} @@ -4653,36 +4150,18 @@ packages: peerDependencies: postcss: ^8.5.13 - cssnano-preset-default@8.0.2: - resolution: {integrity: sha512-+jQAqIKCqMmBjZs7741XkilU93ITZ/EW8gjAkMmujdCzfDkfjrDBv2VqkSu29Fzeig/0rZ3S9IAwfPLlmXEUfQ==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - cssnano-utils@5.0.3: resolution: {integrity: sha512-ynIREMICLxkxm7e9bCR9sh75s4Q5drICi0ua1yxo5jH2XPBqSKkl4dOh4EbFqtUmnTMhRffHgYL0EKKkMjtJTg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - cssnano-utils@6.0.1: - resolution: {integrity: sha512-zk65GIxA8tCjqVk7nTm1mE+ZKxtnxAvU5JSUaBLXbAr3ZF7IOvz3fbPOnEDvZKhnS7GOIitXTS5BgehLzNoc8Q==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - cssnano@7.1.9: resolution: {integrity: sha512-uPR75+5Dk/WJ/YSPR1/YDHdwMM9c5FsaARljfKWgeCKLKOtJ0we21xy/RcCjn53fZnD/f6yYEIZ8pu18+GnbNQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - cssnano@8.0.2: - resolution: {integrity: sha512-K+a76gA1v0/CsYgcsE95HGGyIuPKxpQSetwSwz4nHEM8fFXqSkzq2JzEXFL8v5+CCjxzVVVhPcTK3Oo8SaF/xA==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - csso@5.0.5: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} @@ -4736,14 +4215,6 @@ packages: sqlite3: optional: true - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -4756,6 +4227,9 @@ packages: decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + dedent-js@1.0.1: + resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -4804,10 +4278,6 @@ packages: destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -5099,6 +4569,9 @@ packages: jiti: optional: true + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5111,6 +4584,14 @@ packages: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} + esrap@2.2.13: + resolution: {integrity: sha512-m8jH5hZgJE2RRUK/jjkGPcJEDAV+dYnZYFkosQaPTcE+Yw4xynXHOo6FUdwaWBtdR3b1MMa7wEDTSHeR2VWsGA==} + peerDependencies: + '@typescript-eslint/types': ^8.2.0 + peerDependenciesMeta: + '@typescript-eslint/types': + optional: true + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -5152,10 +4633,6 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - express@4.22.2: - resolution: {integrity: sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==} - engines: {node: '>= 0.10.0'} - express@5.2.1: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} @@ -5228,10 +4705,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.3.2: - resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} - engines: {node: '>= 0.8'} - finalhandler@2.1.1: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} @@ -5268,10 +4741,6 @@ packages: fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} @@ -5477,10 +4946,6 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -5651,6 +5116,9 @@ packages: is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -5831,6 +5299,80 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -5846,6 +5388,9 @@ packages: resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} engines: {node: '>=14'} + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -5909,10 +5454,6 @@ packages: mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -5920,9 +5461,6 @@ packages: memory-cache@0.2.0: resolution: {integrity: sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==} - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} @@ -5934,35 +5472,18 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - mime-db@1.54.0: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - mime-types@3.0.2: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - mime@4.1.0: resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} engines: {node: '>=16'} @@ -6028,13 +5549,14 @@ packages: mocked-exports@0.1.1: resolution: {integrity: sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -6062,10 +5584,6 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} @@ -6157,29 +5675,16 @@ packages: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - - nuxt@3.21.7: - resolution: {integrity: sha512-S3QBFlFnZ+e0j2qw4h8Fzc8qzZxRaOaUl3/6zgy3oIrj8l65NmnW7lhMhbCGA44PLIEcukNTvx9jZ4K7IPNV2Q==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@parcel/watcher': ^2.1.0 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - peerDependenciesMeta: - '@parcel/watcher': - optional: true - '@types/node': - optional: true + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nuxt@4.4.8: - resolution: {integrity: sha512-r/DGE4cNkEDclOw9tbJ18zqu+ix3me+7QCfumPdl5lBXGWgCajskzuq/HzDkHKfIZsn7ACVEjMLRNA2teh++bQ==} - engines: {node: ^22.12.0 || ^24.11.0 || >=26.0.0} + nuxt@3.21.7: + resolution: {integrity: sha512-S3QBFlFnZ+e0j2qw4h8Fzc8qzZxRaOaUl3/6zgy3oIrj8l65NmnW7lhMhbCGA44PLIEcukNTvx9jZ4K7IPNV2Q==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@parcel/watcher': ^2.1.0 - '@types/node': '>=18.12.0' + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 peerDependenciesMeta: '@parcel/watcher': optional: true @@ -6263,26 +5768,14 @@ packages: resolution: {integrity: sha512-7h3fOlgDwkIYxxKfGwCNejaLhH90Pvx+fttdPN7nRbWHxm6QSYcxW3IKjfxQVUeg+z1X2HZdOSY3rHkVqgxH1g==} engines: {node: ^20.19.0 || >=22.12.0} - oxc-minify@0.133.0: - resolution: {integrity: sha512-6bNsYU+5WNIaNHB16zHnL24cUaJuKiPzUvjENoMale3+U8ZBMbGYgdgt//frx0ge7UcgEGIpqtukGGNPT0kxfQ==} - engines: {node: ^20.19.0 || >=22.12.0} - oxc-parser@0.132.0: resolution: {integrity: sha512-+0LAPHaqtfQlvWdpaAa09SmOaZZgP8C552xosEkGJ4+ruEwP1Vgx+sqBgcBCNfR6KDCmagGOZTde8wmAvcI/Hg==} engines: {node: ^20.19.0 || >=22.12.0} - oxc-parser@0.133.0: - resolution: {integrity: sha512-661RSx+ZcjBmjBYid+Fpp/2F5EbtildpeoZh5HdgnGs+jZ03nqQEQW8yGkt4BGyOC3OMPDQQRl8M5kqD2/g6jw==} - engines: {node: ^20.19.0 || >=22.12.0} - oxc-transform@0.132.0: resolution: {integrity: sha512-DmP0+4kzpXoMvv08qPCD4aI6mAIzrEq15Yt9e6wXCNtOz6jEDHPpueusDa2/pvjRAqtNV37YxUUeX7cfCI4dpA==} engines: {node: ^20.19.0 || >=22.12.0} - oxc-transform@0.133.0: - resolution: {integrity: sha512-9lt2b+hkG6yqe0fUDMHhMk7rgI9uTjNxU9wauQiYnHzc4kZI8JP/OhBqXTIJQTrqRJ8CkSH3O5AhQ13ke28yNg==} - engines: {node: ^20.19.0 || >=22.12.0} - oxc-walker@1.0.0: resolution: {integrity: sha512-eMsHflAGfOskpWxtp9xP/f5b96XLEU8ifTd2gOOCkdux9HMxKGy5S1ru0Gh1B3aPu+YbfmWUUVkcb7MrZz3XyQ==} peerDependencies: @@ -6346,9 +5839,6 @@ packages: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} - path-to-regexp@0.1.13: - resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} - path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} @@ -6415,144 +5905,72 @@ packages: peerDependencies: postcss: ^8.5.13 - postcss-colormin@8.0.1: - resolution: {integrity: sha512-qBY4ABQ6d8/mk5RRZHwMllrZMxeMey3azVY2dZUEk+RgiUC4ARdPR3/AITzNqqKTbvW/3y/MJKinDrzwqn8RDQ==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-convert-values@7.0.12: resolution: {integrity: sha512-xurKu5qqk4viR3Cp3p4xBR4KfnZm4w4ys6+UBwBmeuBSNkH7+DtLnYOYnOffgtE4yx8sH9S1VZ6RAAvROXzP2Q==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-convert-values@8.0.1: - resolution: {integrity: sha512-IdOSIX3BzfMvCc1TAHIha2gfy17xnb5vfML8e2BIKARnFOghksESfaSAB/3CXgyLfMozZAbTRPVQF5dbuKOidw==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-discard-comments@7.0.8: resolution: {integrity: sha512-CvvS5S9WrXblFXCEJ9nVo+4z+eA7zSC7Z88V1HEJuwlQhlFnYTIjg1xJY+BCUiG2bvICap2tXii4mP22BD108Q==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-discard-comments@8.0.1: - resolution: {integrity: sha512-FDvzm3tXlEsQBO2XQgnta5ugsAqwBrgWH+j5QgXpegEIDYA0VPnZg2aP7LtmWtC49POskeIhXesFiU/k3NyFHA==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-discard-duplicates@7.0.4: resolution: {integrity: sha512-VBNn1+EuMZkeGVVtz0gRfbNGtx9IFgAsAV+E2pHtXPrp4qfGBkhTIiAuE/wrb+Y6Pakg9NewAlfTpYIFAWODtw==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-discard-duplicates@8.0.1: - resolution: {integrity: sha512-stTDXkI8YkCUfADurQhp03oq5ynsgSx6Qrw5B1swds6oTHtAeOZ9I0SHGK8cY/VpWUsIYFDWMs3IWf9jIEfFvA==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-discard-empty@7.0.3: resolution: {integrity: sha512-M2pyjQCU+/7cMHVtL6bKTHjv0lZnPLMpicgr67Dlth7AbuV9gjVTtUqaRwn6Pp6BwSDspUzhz8SaUrRykJU5Dw==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-discard-empty@8.0.1: - resolution: {integrity: sha512-Zv4fM1Yfhk71tbt6gfiptbL6jDHi+7apSnaMeaO9n1uET+1embrXQw5m93Zp5x28UyQSuv+AVkFY193jdwZ33w==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-discard-overridden@7.0.3: resolution: {integrity: sha512-aNovXo9UsZuRNLzHJtp13lHIvinDPfiXBPePpXkSjCbgp++iU2FqE+YxvjIsg6EdyPZsASFbfu+JcBFVsErXIQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-discard-overridden@8.0.1: - resolution: {integrity: sha512-ykt4fvrC7yYGzbxKyqBVjDCbsjF/11JgWK8enrdkobRyqqEtb/uDUCbKOGdvrK8X7BrShW8Lv5cCRNbdkNHGkQ==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-merge-longhand@7.0.7: resolution: {integrity: sha512-b3mfYUxR388u5Pt0HPcVIUtUDn/k15UfTY9M+ORW+meCR6JLNxoZffiYvXyOYQoRYQNZyX/UFkMCM/mNHxe1qA==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-merge-longhand@8.0.1: - resolution: {integrity: sha512-huTfSYgQ13O81SFvAuOi7GWnO48vvybjj3xF+X3qUoPjzvvaLpJH5DcUqqXcwOEulZUcvaV4s0V9WtWs+IAQPA==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-merge-rules@7.0.11: resolution: {integrity: sha512-SJUPM18g2BmPhf8BVlbwqWz4aK3pLu6u6xjfwEzra7xL6IBR10sUaiB++EzqcVfadPHrKBSMlNdP+XieykhI+Q==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-merge-rules@8.0.1: - resolution: {integrity: sha512-o3rk4UpnPNg469tklYwbR/NtvKc/f/wJiVDTnNQ/EFPw/LeiPOHUCvV1GIBQIZHGrBAYdPjToK6a+ojYprsrxQ==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-minify-font-values@7.0.3: resolution: {integrity: sha512-yilG/VOaNI74IylQvAQQxm3/wZVBkXyYUqNUAdxqwtbWUXPsbK1q8Ms0mL83v+f8YicgcyfYCRZtWACUdYajpA==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-minify-font-values@8.0.1: - resolution: {integrity: sha512-L8Nzs/PRlBSPrLdY/7rAiU5ZN5800+2J/4LRbfyG8SJnPljmgMaXVmQiCklvRS+yObfVRNtvmk/Ean/eoYcSeg==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-minify-gradients@7.0.5: resolution: {integrity: sha512-YraROyQRg3BI1+Hg8E05B/JPdnTm8EDSVu4P2BxdM+CRiOyfmou809+chGIqo6fQqwjPGQ947nbGncSjmTU1WQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-minify-gradients@8.0.1: - resolution: {integrity: sha512-qf+4s/hZMqTwpWN2teqf6+1yvR/SZK5HgHqXYuACeJXV7ABe7AXtBEomgxagUzcN4bSnmqBh5vnIml0dYqykYg==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-minify-params@7.0.9: resolution: {integrity: sha512-R8itbB8BhlpoYyBm1ou0dD+vJnQ3F6adQipR4UnkCHUwlo+S9WXJaDRg1RHjC8YVAtIdrQzSWvJl40HnGDTKjA==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-minify-params@8.0.1: - resolution: {integrity: sha512-L0h3H59deFfFg0wQN1NVaS/8E/LfGvaMuZKGO7siwlG995zo3OshtQyRkqKdVqcBwAORBvZ1nDZrKPLRapYkQw==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-minify-selectors@7.1.2: resolution: {integrity: sha512-aQtrEWKwqafNlExcKHQvPGsXR2+vlUqqJtf5XsCQcgsSb5PL4wlujWBYDJuWsP4UnQX1YHDHU8qRlD+1PzTQ+Q==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-minify-selectors@8.0.2: - resolution: {integrity: sha512-3icdxc/zght5UAizdwqZBDE2KOWHf1jMQCxET6iLACeNlRxfTPyXS0/COpGk8CQ2cECyaEKTRUd/i/k8Gxmz4g==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-nested@7.0.2: resolution: {integrity: sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==} engines: {node: '>=18.0'} @@ -6565,144 +5983,72 @@ packages: peerDependencies: postcss: ^8.5.13 - postcss-normalize-charset@8.0.1: - resolution: {integrity: sha512-xzqr36F8UeIZOvOHsf3aul+RVJCADvSwuwpMLgizqKjisHZpBfztgW0XFLBfJvz9pJgaStaOXAtGb0zLqT6B0w==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-normalize-display-values@7.0.3: resolution: {integrity: sha512-ldsCX0QIt05pKIOobZtVQ48wXJecr+czw4+e1/YjVhLMqslShgpVxgPtI2CefURR8oyVoYaU/l829MMwExDMLw==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-normalize-display-values@8.0.1: - resolution: {integrity: sha512-ZDWOijOK1FFMlpgiQCUO9fCNKd7HJ9L7z9HWEq4iyubnUFWzdTSwm/LcrMbNW6iZ1oAtqeLYA0WA3xHszOI08g==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-normalize-positions@7.0.4: resolution: {integrity: sha512-VEvlpeGd3Ju1Hqa/oN4jaP3+ms4laYwkEL9N9u+B6k54PZjXbW1n6wI+aVprf1BQXlCYpS5+1pl/7/vHiKgARg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-normalize-positions@8.0.1: - resolution: {integrity: sha512-uuivan2poSqbE48ST4do20dGaFUeXey9/H8rhHzoyVHB2I6BmkoVLZ/C9+BRjUlpaAFYVOoDY7epkiidzaYbvA==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-normalize-repeat-style@7.0.4: resolution: {integrity: sha512-6mPKlY/8cSaDHxX502wERADarJsccwlky6yIrOapHH2ZgfoKAV94SbiTKfKEs4EEpdazuc3J72WsqeYk7hp9+Q==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-normalize-repeat-style@8.0.1: - resolution: {integrity: sha512-q2hq5fmKxk29K6DjKA3nZ17Q2dtjhLYFNmFweKALmooUqx6UWAHF1bBoWTu/EqlJ88josb82A/J0Atj9LJUmpQ==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-normalize-string@7.0.3: resolution: {integrity: sha512-HnEQPUchi1eznmDKEYrKUTqrprEq97SrpUYClgUkv7V2zRODD9DFoUsYU+m9ZOetmD5ku7fEMZB/lwy8IT6xVQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-normalize-string@8.0.1: - resolution: {integrity: sha512-+Wf+kQJhm1WgSGEAuUaswE9rdpR9QbrKRVemcVHs6rhOoOTVIdAbgaicftfYA6vLM346P8onRzkEVbFN29ktKQ==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-normalize-timing-functions@7.0.3: resolution: {integrity: sha512-zmEzHdvpZBZu0OKlbJSfgASQvaayyAoVuWtvyr34IJ/LyS+DaOKvvR3EvFJ9RWWtNIx+CMvO125OVophaxNYew==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-normalize-timing-functions@8.0.1: - resolution: {integrity: sha512-W8/tvwRlm3T+yjGkg0IRTF4bvHj0vILYr/LOogCrJKHz2ey2HFRwfsAA8Bk9N4BGR7z7WmmDu/KzzwhJ6FoGPQ==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-normalize-unicode@7.0.9: resolution: {integrity: sha512-DRAdWfeh/TjmhLJsw91vdiWCnUod9iwvM7xyS02/nF/sLsCR3A8l3pztrSUrWG8DSBqfX7yEk9FM0USaVJ2mSg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-normalize-unicode@8.0.1: - resolution: {integrity: sha512-Ad0YHNRBp4WHEOYUM/4wL/8MoL2fimEF8se/0q+Rt/owMzYpbxsypC1P8fN/oluwoRmRKdNVX7X2oycEobPWcQ==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-normalize-url@7.0.3: resolution: {integrity: sha512-CL93wmloq5qsffmFv+bw24MIRbmhHrp53qoh1LDAb/5TtjWEXI/np4xcP/Gw9oWCb2XyWnqHYLDUwiKRoJBA1Q==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-normalize-url@8.0.1: - resolution: {integrity: sha512-tkYcip6pCDY806xuxpJYqMW2M3/623jzGFJmz3m5Us47q8P28+gbRZxaea3Rr/CmwwLUiVlh+BTGYwQ6gvaP8A==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-normalize-whitespace@7.0.3: resolution: {integrity: sha512-FdHjjn+Ht5Z2ZRjNOmeCbNq6lq09sUYKpmlF/Aq0XjVNSLTL6fmHlA/3swN2wP2caY9GV/tjSDcIIyS7aN7W0A==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-normalize-whitespace@8.0.1: - resolution: {integrity: sha512-XzORadNfSrKWDZZpgAEHPKINKx8r9r9RIfE9c70g/HThdpbmPHhDYCodHSVESDxmKeySAYw1p4liuBCf7j6LyA==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-ordered-values@7.0.4: resolution: {integrity: sha512-nubSi49hDHQk4E8KIj+IbLY8Bg+8OcSUEhgyolgM+atnOvXjV7EjaR6bac4YGZoFyPa9mWoAF3EaYbWdFkKqVg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-ordered-values@8.0.1: - resolution: {integrity: sha512-OLXq5lR1yk3KWQ1FPK6aWjFFdktHE9f9kb8cnt4LmIw7w30DnzgD9+sOVYJc5HenkWCX8i1MJhhFwmqc/GYqLg==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-reduce-initial@7.0.9: resolution: {integrity: sha512-ztTNPdIxXTxtBcG03E9u8v44M4ElXbMIRT7pf2onlquGula0Y83nKKxqM22FA/hMgkfCjN7ohevkVlaNwI8iOQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-reduce-initial@8.0.1: - resolution: {integrity: sha512-+aQsR6+61KRoIfcFNLP3v9RM7+0iYOTtPnjl1wr6JqMW1zx6S+t2ktHRefXwacFdHIDj5+ETG0KY7K3+SGQ4Nw==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-reduce-transforms@7.0.3: resolution: {integrity: sha512-FXsnN9ZwcZTT8Yf8cAHA8qIGUXcX6WfLd9JoYhrdDfmvsVhhfqkkv7m4AC3rwFOfz+GzkUa87OCKF9dUcicd+g==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-reduce-transforms@8.0.1: - resolution: {integrity: sha512-x71slHVykiFi5RuKEXM0wgYpY2PngC78x6R8TnZhHF3lhqt+u/w3MGwYLX+2t5O87ssRiMfEAhQH+3J4QwVzCw==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-selector-parser@7.1.4: resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==} engines: {node: '>=4'} @@ -6713,24 +6059,12 @@ packages: peerDependencies: postcss: ^8.5.13 - postcss-svgo@8.0.1: - resolution: {integrity: sha512-HpnvWii7W0/FPrsejJa6ZTi0kNtTJP/Iba7CUMPX0xPV6QpnndOp+SDP74tFtgjA2cYKYNWJPOlmLXMsvi/9yA==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-unique-selectors@7.0.7: resolution: {integrity: sha512-d+sCkaRnSefghOUdH8CMJZV9yUQhj2ojpe8Nw/lA+LV1UOfeleGkLTl6XdCFFSai9UJ+DJPb69FFuqthXYsY8w==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - postcss-unique-selectors@8.0.1: - resolution: {integrity: sha512-+xvKI5+/Cl8yYQwxDV39Uhuc4WV951xngFvPPjiPj2NIbIfm6vbbRTXblyw0FioLkIoGlw+7qUcY1h2YhaZYgw==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -6750,11 +6084,23 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier-plugin-svelte@4.1.1: + resolution: {integrity: sha512-wXvbXMjSvb4C9ENWTHXyd+ihakKCsJ6rJhLP6/8HFNj4GkZr48jqL9PoKsl2sk7SyCZRTnJ7O2TTowUpOxP/KA==} + engines: {node: '>=20'} + peerDependencies: + prettier: ^3.0.0 + svelte: ^5.0.0 + prettier@3.6.2: resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true + prettier@3.9.4: + resolution: {integrity: sha512-yWG/o/4oJfo036EKAfK6ACAoDOfHeRHx4tuxkfBZiauURiaSmYwlpOr5LQqKtIkRD2z1PLteme2WoxEnj4tHTg==} + engines: {node: '>=14'} + hasBin: true + pretty-bytes@7.1.0: resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==} engines: {node: '>=20'} @@ -6811,10 +6157,6 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@2.5.3: - resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} - engines: {node: '>= 0.8'} - raw-body@3.0.2: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} @@ -6833,10 +6175,6 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} - engines: {node: '>=0.10.0'} - react-router@7.15.1: resolution: {integrity: sha512-R8rl9HhgikFYoPJymnUtPXWbnDb3oget6lQnfIoupbt61aT9aOhRkDsY2XRhZRyX1Z/8a5sL74fXmFNm3NRK5A==} engines: {node: '>=20.0.0'} @@ -6939,6 +6277,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rolldown@1.1.3: + resolution: {integrity: sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-dts@6.4.1: resolution: {integrity: sha512-l//F3Zf7ID5GoOfLfD8kroBjQKEKpy1qfhtAdnpibFZMffPaylrg1CoDC2vGkPeTeyxUe4bVFCln2EFuL7IGGg==} engines: {node: '>=20'} @@ -6981,6 +6324,10 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + safe-array-concat@1.1.4: resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} @@ -7033,10 +6380,6 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.19.2: - resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} - engines: {node: '>= 0.8.0'} - send@1.2.1: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} @@ -7058,10 +6401,6 @@ packages: serve-placeholder@2.0.2: resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==} - serve-static@1.16.3: - resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} - engines: {node: '>= 0.8.0'} - serve-static@2.2.1: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} @@ -7069,6 +6408,9 @@ packages: set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + set-cookie-parser@3.1.1: + resolution: {integrity: sha512-vM9SUhjsUYs6UeJUmygc5Ofm5eQGe85riob5ju6XCgFGJI5PLV4nrDAQpQjd+LkFBpAkADn5BQQpZ9EUNkyLuA==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -7287,12 +6629,6 @@ packages: peerDependencies: postcss: ^8.5.13 - stylehacks@8.0.1: - resolution: {integrity: sha512-Gv095oTD0N+BdJALNFDsxZpETHZLTxbOl5RyIO7y6VAE6sR3z0MnV3Nix7N0IATNldNTrkvSASp2KR1Yt526HA==} - engines: {node: ^22.11.0 || ^24.11.0 || >=26.0} - peerDependencies: - postcss: ^8.5.15 - stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} @@ -7312,6 +6648,24 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svelte-check@4.7.1: + resolution: {integrity: sha512-FGUOmAqxXdN/H9Zm8slrqO7SLtFisXRB7rfOsHNJ3MLTD2po/+Stg8XyErkpumPHbuUiYTcqrEIzxpVWKTLqtg==} + engines: {node: '>= 18.0.0'} + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' + + svelte2tsx@0.7.57: + resolution: {integrity: sha512-nQo0xEfUpSVjfkxan2UmC6Wl9UZVe9+/pglUiyBNMJ7KDQ9DDooucmXdToBOvzSfgYjj/kMYwf6CTTDz/z048w==} + peerDependencies: + svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 + typescript: ^4.9.4 || ^5.0.0 || ^6.0.0 + + svelte@5.56.4: + resolution: {integrity: sha512-/d0QHehmRuJW8gVz395MTkPcPozxzdjBMBE8oEYGz8O3b9KTMzzQ9ZHJQLuFKOHOPQbU6kx/X4iid/EBBzH7iw==} + engines: {node: '>=18'} + svgo@4.0.1: resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} engines: {node: '>=16'} @@ -7439,10 +6793,6 @@ packages: resolution: {integrity: sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==} engines: {node: '>=20'} - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - type-is@2.1.0: resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} engines: {node: '>= 18'} @@ -7478,6 +6828,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} @@ -7565,9 +6920,6 @@ packages: resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} engines: {node: ^20.19.0 || >=22.12.0} - unrouting@0.1.7: - resolution: {integrity: sha512-+0hfD+CVWtD636rc5Fn9VEjjTEDhdqgMpbwAuVoUmydSHDaMNiFW93SJG4LV++RoGSEAyvQN5uABAscYpDphpQ==} - unrs-resolver@1.12.2: resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} @@ -7664,10 +7016,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - uuid@11.1.1: resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} hasBin: true @@ -7728,37 +7076,6 @@ packages: vue-tsc: optional: true - vite-plugin-checker@0.14.4: - resolution: {integrity: sha512-Tw0U9UgHIRiZ+Yoe4Gh0RrYoBiCVmO9j4tomVdYr0KUjUsqXMPhqW8ouoSWmOzGp5Iimipbl3bNXZcK7OeP7Qg==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@biomejs/biome': '>=2.4.12' - eslint: '>=9.39.4' - meow: ^13.2.0 || ^14.0.0 - optionator: ^0.9.4 - oxlint: '>=1' - stylelint: '>=16.26.1' - typescript: '*' - vite: '>=5.4.21' - vue-tsc: ~2.2.10 || ^3.0.0 - peerDependenciesMeta: - '@biomejs/biome': - optional: true - eslint: - optional: true - meow: - optional: true - optionator: - optional: true - oxlint: - optional: true - stylelint: - optional: true - typescript: - optional: true - vue-tsc: - optional: true - vite-plugin-inspect@11.4.1: resolution: {integrity: sha512-ShOFe2PURXGvRS5OrgmOLZOCwDTD7dEBVt0tMpFPKb9AsvqXKCRGM8QgKrUbRbJYFXScHvDPpGRd28rYidC0tA==} engines: {node: '>=14'} @@ -7855,6 +7172,57 @@ packages: yaml: optional: true + vite@8.1.0: + resolution: {integrity: sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.3.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + vitest-environment-nuxt@1.0.1: resolution: {integrity: sha512-eBCwtIQriXW5/M49FjqNKfnlJYlG2LWMSNFsRVKomc8CaMqmhQPBS5LZ9DlgYL9T8xIVsiA6RZn2lk7vxov3Ow==} @@ -8118,6 +7486,9 @@ packages: youch@4.1.1: resolution: {integrity: sha512-mxW3qiSnl+GRxXsaUMzv2Mbada1Y8CDltET9UxejDQe6DBYlSekghl5U5K0ReAikcHDi0G1vKZEmmo/NWAGKLA==} + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} @@ -8301,16 +7672,6 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -8419,6 +7780,12 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 @@ -8434,6 +7801,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.29.7 @@ -8973,13 +8345,27 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true - '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.1)': + '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: - '@emnapi/core': 1.10.0 + '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 '@tybys/wasm-util': 0.10.2 optional: true + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 + optional: true + '@next/env@15.5.18': {} '@next/swc-darwin-arm64@15.5.18': @@ -9000,63 +8386,25 @@ snapshots: '@next/swc-linux-x64-musl@15.5.18': optional: true - '@next/swc-win32-arm64-msvc@15.5.18': - optional: true - - '@next/swc-win32-x64-msvc@15.5.18': - optional: true - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 - - '@nuxt/cli@3.36.0(@nuxt/schema@3.21.7)(cac@6.7.14)(magicast@0.5.3)': - dependencies: - '@bomb.sh/tab': 0.0.16(cac@6.7.14)(citty@0.2.2) - '@clack/prompts': 1.6.0 - c12: 3.3.4(magicast@0.5.3) - citty: 0.2.2 - confbox: 0.2.4 - consola: 3.4.2 - debug: 4.4.3 - defu: 6.1.7 - exsolve: 1.0.8 - fuse.js: 7.4.2 - fzf: 0.5.2 - giget: 3.3.0 - jiti: 2.7.0 - listhen: 1.10.0(srvx@0.11.17) - nypm: 0.6.7 - ofetch: 1.5.1 - ohash: 2.0.11 - pathe: 2.0.3 - perfect-debounce: 2.1.0 - pkg-types: 2.3.1 - scule: 1.3.0 - semver: 7.8.5 - srvx: 0.11.17 - std-env: 4.1.0 - tinyclip: 0.1.14 - tinyexec: 1.2.4 - ufo: 1.6.4 - youch: 4.1.1 - optionalDependencies: - '@nuxt/schema': 3.21.7 - transitivePeerDependencies: - - cac - - commander - - magicast - - supports-color + '@next/swc-win32-arm64-msvc@15.5.18': + optional: true + + '@next/swc-win32-x64-msvc@15.5.18': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 - '@nuxt/cli@3.36.0(@nuxt/schema@4.4.8)(cac@6.7.14)(magicast@0.5.3)': + '@nuxt/cli@3.36.0(@nuxt/schema@3.21.7)(cac@6.7.14)(magicast@0.5.3)': dependencies: '@bomb.sh/tab': 0.0.16(cac@6.7.14)(citty@0.2.2) '@clack/prompts': 1.6.0 @@ -9087,7 +8435,7 @@ snapshots: ufo: 1.6.4 youch: 4.1.1 optionalDependencies: - '@nuxt/schema': 4.4.8 + '@nuxt/schema': 3.21.7 transitivePeerDependencies: - cac - commander @@ -9096,19 +8444,19 @@ snapshots: '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@2.6.4(magicast@0.3.5)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': + '@nuxt/devtools-kit@2.6.4(magicast@0.3.5)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': dependencies: '@nuxt/kit': 3.21.7(magicast@0.3.5) execa: 8.0.1 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) transitivePeerDependencies: - magicast - '@nuxt/devtools-kit@3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': + '@nuxt/devtools-kit@3.2.4(magicast@0.5.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': dependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) execa: 8.0.1 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) transitivePeerDependencies: - magicast @@ -9134,12 +8482,12 @@ snapshots: pkg-types: 2.3.1 semver: 7.8.5 - '@nuxt/devtools@2.6.4(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3))': + '@nuxt/devtools@2.6.4(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3))': dependencies: - '@nuxt/devtools-kit': 2.6.4(magicast@0.3.5)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@nuxt/devtools-kit': 2.6.4(magicast@0.3.5)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) '@nuxt/devtools-wizard': 2.6.4 '@nuxt/kit': 3.21.7(magicast@0.3.5) - '@vue/devtools-core': 7.7.9(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3)) + '@vue/devtools-core': 7.7.9(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3)) '@vue/devtools-kit': 7.7.9 birpc: 2.9.0 consola: 3.4.2 @@ -9164,9 +8512,9 @@ snapshots: sirv: 3.0.2 structured-clone-es: 1.0.0 tinyglobby: 0.2.17 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - vite-plugin-inspect: 11.4.1(@nuxt/kit@3.21.7(magicast@0.5.3))(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) - vite-plugin-vue-tracer: 1.4.0(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3)) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite-plugin-inspect: 11.4.1(@nuxt/kit@3.21.7(magicast@0.5.3))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + vite-plugin-vue-tracer: 1.4.0(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3)) which: 5.0.0 ws: 8.21.0 transitivePeerDependencies: @@ -9175,9 +8523,9 @@ snapshots: - utf-8-validate - vue - '@nuxt/devtools@3.2.4(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3))': + '@nuxt/devtools@3.2.4(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3))': dependencies: - '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) '@nuxt/devtools-wizard': 3.2.4 '@nuxt/kit': 4.4.8(magicast@0.5.3) '@vue/devtools-core': 8.1.3(vue@3.5.38(typescript@5.9.3)) @@ -9205,9 +8553,9 @@ snapshots: sirv: 3.0.2 structured-clone-es: 2.0.0 tinyglobby: 0.2.17 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - vite-plugin-inspect: 11.4.1(@nuxt/kit@4.4.8(magicast@0.5.3))(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) - vite-plugin-vue-tracer: 1.4.0(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite-plugin-inspect: 11.4.1(@nuxt/kit@4.4.8(magicast@0.5.3))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + vite-plugin-vue-tracer: 1.4.0(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) which: 6.0.1 ws: 8.21.0 transitivePeerDependencies: @@ -9316,7 +8664,7 @@ snapshots: - vue - vue-tsc - '@nuxt/nitro-server@3.21.7(db0@0.3.4)(ioredis@5.11.1)(magicast@0.5.3)(nuxt@3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0))(oxc-parser@0.132.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(srvx@0.11.17)(typescript@5.9.3)': + '@nuxt/nitro-server@3.21.7(db0@0.3.4)(ioredis@5.11.1)(magicast@0.5.3)(nuxt@3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.3)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.3)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0))(oxc-parser@0.132.0)(rolldown@1.1.3)(srvx@0.11.17)(typescript@5.9.3)': dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/kit': 3.21.7(magicast@0.5.3) @@ -9333,8 +8681,8 @@ snapshots: impound: 1.1.5 klona: 2.0.6 mocked-exports: 0.1.1 - nitropack: 2.13.4(oxc-parser@0.132.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(srvx@0.11.17) - nuxt: 3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0) + nitropack: 2.13.4(oxc-parser@0.132.0)(rolldown@1.1.3)(srvx@0.11.17) + nuxt: 3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.3)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.3)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0) ohash: 2.0.11 pathe: 2.0.3 pkg-types: 2.3.1 @@ -9384,76 +8732,6 @@ snapshots: - uploadthing - xml2js - '@nuxt/nitro-server@4.4.8(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(db0@0.3.4)(ioredis@5.11.1)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(terser@5.48.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0))(oxc-parser@0.133.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(typescript@5.9.3)': - dependencies: - '@nuxt/devalue': 2.0.2 - '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@unhead/vue': 2.1.15(vue@3.5.38(typescript@5.9.3)) - '@vue/shared': 3.5.38 - consola: 3.4.2 - defu: 6.1.7 - destr: 2.0.5 - devalue: 5.8.1 - errx: 0.1.0 - escape-string-regexp: 5.0.0 - exsolve: 1.0.8 - h3: 1.15.11 - impound: 1.1.5 - klona: 2.0.6 - mocked-exports: 0.1.1 - nitropack: 2.13.4(oxc-parser@0.133.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)) - nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(terser@5.48.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0) - nypm: 0.6.7 - ohash: 2.0.11 - pathe: 2.0.3 - rou3: 0.8.1 - std-env: 4.1.0 - ufo: 1.6.4 - unctx: 2.5.0 - unstorage: 1.17.5(db0@0.3.4)(ioredis@5.11.1) - vue: 3.5.38(typescript@5.9.3) - vue-bundle-renderer: 2.2.0 - vue-devtools-stub: 0.1.0 - optionalDependencies: - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@electric-sql/pglite' - - '@libsql/client' - - '@netlify/blobs' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - bare-abort-controller - - bare-buffer - - better-sqlite3 - - db0 - - drizzle-orm - - encoding - - idb-keyval - - ioredis - - magicast - - mysql2 - - oxc-parser - - react-native-b4a - - rolldown - - sqlite3 - - srvx - - supports-color - - typescript - - uploadthing - - xml2js - '@nuxt/schema@3.21.7': dependencies: '@vue/shared': 3.5.38 @@ -9462,14 +8740,6 @@ snapshots: pkg-types: 2.3.1 std-env: 4.1.0 - '@nuxt/schema@4.4.8': - dependencies: - '@vue/shared': 3.5.38 - defu: 6.1.7 - pathe: 2.0.3 - pkg-types: 2.3.1 - std-env: 4.1.0 - '@nuxt/telemetry@2.8.0(@nuxt/kit@3.21.7(magicast@0.5.3))': dependencies: '@nuxt/kit': 3.21.7(magicast@0.5.3) @@ -9479,16 +8749,7 @@ snapshots: rc9: 3.0.1 std-env: 4.1.0 - '@nuxt/telemetry@2.8.0(@nuxt/kit@4.4.8(magicast@0.5.3))': - dependencies: - '@nuxt/kit': 4.4.8(magicast@0.5.3) - citty: 0.2.2 - consola: 3.4.2 - ofetch: 2.0.0-alpha.3 - rc9: 3.0.1 - std-env: 4.1.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)(magicast@0.5.3)(playwright-core@1.60.0)(terser@5.48.0)(typescript@5.9.3)(vitest@4.1.8)(yaml@2.9.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.32.0)(magicast@0.5.3)(playwright-core@1.60.0)(terser@5.48.0)(typescript@5.9.3)(vitest@4.1.8)(yaml@2.9.0)': dependencies: '@nuxt/kit': 3.21.7(magicast@0.5.3) '@nuxt/schema': 3.21.7 @@ -9513,15 +8774,15 @@ snapshots: tinyexec: 0.3.2 ufo: 1.6.4 unplugin: 2.3.11 - vite: 6.4.3(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - vitest-environment-nuxt: 1.0.1(@playwright/test@1.60.0)(@types/node@24.7.2)(@vue/test-utils@2.4.6)(jiti@2.7.0)(jsdom@27.0.1)(magicast@0.5.3)(playwright-core@1.60.0)(terser@5.48.0)(typescript@5.9.3)(vitest@4.1.8)(yaml@2.9.0) + vite: 6.4.3(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vitest-environment-nuxt: 1.0.1(@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.32.0)(magicast@0.5.3)(playwright-core@1.60.0)(terser@5.48.0)(typescript@5.9.3)(vitest@4.1.8)(yaml@2.9.0) vue: 3.5.30(typescript@5.9.3) optionalDependencies: '@playwright/test': 1.60.0 '@vue/test-utils': 2.4.6 jsdom: 27.0.1 playwright-core: 1.60.0 - vitest: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + vitest: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) transitivePeerDependencies: - '@types/node' - jiti @@ -9537,12 +8798,12 @@ snapshots: - typescript - yaml - '@nuxt/vite-builder@3.21.7(@types/node@24.7.2)(eslint@9.39.4(jiti@2.7.0))(magicast@0.5.3)(nuxt@3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0))(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(terser@5.48.0)(typescript@5.9.3)(vue@3.5.38(typescript@5.9.3))(yaml@2.9.0)': + '@nuxt/vite-builder@3.21.7(@types/node@24.7.2)(eslint@9.39.4(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.3)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.3)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0))(optionator@0.9.4)(rolldown@1.1.3)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.3)(rollup@4.62.2))(rollup@4.62.2)(terser@5.48.0)(typescript@5.9.3)(vue@3.5.38(typescript@5.9.3))(yaml@2.9.0)': dependencies: '@nuxt/kit': 3.21.7(magicast@0.5.3) '@rollup/plugin-replace': 6.0.3(rollup@4.62.2) - '@vitejs/plugin-vue': 6.0.7(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) - '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) + '@vitejs/plugin-vue': 6.0.7(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) + '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) autoprefixer: 10.5.0(postcss@8.5.15) consola: 3.4.2 cssnano: 7.1.9(postcss@8.5.15) @@ -9556,7 +8817,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0) + nuxt: 3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.3)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.3)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0) nypm: 0.6.7 ohash: 2.0.11 pathe: 2.0.3 @@ -9567,14 +8828,14 @@ snapshots: std-env: 4.1.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - vite-node: 5.3.0(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - vite-plugin-checker: 0.13.0(eslint@9.39.4(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vite-node: 5.3.0(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) + vite-plugin-checker: 0.13.0(eslint@9.39.4(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) vue: 3.5.38(typescript@5.9.3) vue-bundle-renderer: 2.2.0 optionalDependencies: - rolldown: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - rollup-plugin-visualizer: 7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2) + rolldown: 1.1.3 + rollup-plugin-visualizer: 7.0.1(rolldown@1.1.3)(rollup@4.62.2) transitivePeerDependencies: - '@biomejs/biome' - '@types/node' @@ -9600,163 +8861,56 @@ snapshots: - vue-tsc - yaml - '@nuxt/vite-builder@4.4.8(5e770e72ca055b8ebf51d504a3c88ac6)': - dependencies: - '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@rollup/plugin-replace': 6.0.3(rollup@4.62.2) - '@vitejs/plugin-vue': 6.0.7(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) - '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) - autoprefixer: 10.5.0(postcss@8.5.15) - consola: 3.4.2 - cssnano: 8.0.2(postcss@8.5.15) - defu: 6.1.7 - escape-string-regexp: 5.0.0 - exsolve: 1.0.8 - get-port-please: 3.2.0 - jiti: 2.7.0 - knitwork: 1.3.0 - magic-string: 0.30.21 - mlly: 1.8.2 - mocked-exports: 0.1.1 - nuxt: 4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(terser@5.48.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0) - nypm: 0.6.7 - pathe: 2.0.3 - pkg-types: 2.3.1 - postcss: 8.5.15 - seroval: 1.5.4 - std-env: 4.1.0 - ufo: 1.6.4 - unenv: 2.0.0-rc.24 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - vite-node: 5.3.0(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - vite-plugin-checker: 0.14.4(eslint@9.39.4(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) - vue: 3.5.38(typescript@5.9.3) - vue-bundle-renderer: 2.2.0 - optionalDependencies: - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - rolldown: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - rollup-plugin-visualizer: 7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2) - transitivePeerDependencies: - - '@biomejs/biome' - - '@types/node' - - eslint - - less - - lightningcss - - magicast - - meow - - optionator - - oxlint - - rollup - - sass - - sass-embedded - - stylelint - - stylus - - sugarss - - supports-color - - terser - - tsx - - typescript - - vue-tsc - - yaml - '@one-ini/wasm@0.1.1': {} '@oxc-minify/binding-android-arm-eabi@0.132.0': optional: true - '@oxc-minify/binding-android-arm-eabi@0.133.0': - optional: true - '@oxc-minify/binding-android-arm64@0.132.0': optional: true - '@oxc-minify/binding-android-arm64@0.133.0': - optional: true - '@oxc-minify/binding-darwin-arm64@0.132.0': optional: true - '@oxc-minify/binding-darwin-arm64@0.133.0': - optional: true - '@oxc-minify/binding-darwin-x64@0.132.0': optional: true - '@oxc-minify/binding-darwin-x64@0.133.0': - optional: true - '@oxc-minify/binding-freebsd-x64@0.132.0': optional: true - '@oxc-minify/binding-freebsd-x64@0.133.0': - optional: true - '@oxc-minify/binding-linux-arm-gnueabihf@0.132.0': optional: true - '@oxc-minify/binding-linux-arm-gnueabihf@0.133.0': - optional: true - '@oxc-minify/binding-linux-arm-musleabihf@0.132.0': optional: true - '@oxc-minify/binding-linux-arm-musleabihf@0.133.0': - optional: true - '@oxc-minify/binding-linux-arm64-gnu@0.132.0': optional: true - '@oxc-minify/binding-linux-arm64-gnu@0.133.0': - optional: true - '@oxc-minify/binding-linux-arm64-musl@0.132.0': optional: true - '@oxc-minify/binding-linux-arm64-musl@0.133.0': - optional: true - '@oxc-minify/binding-linux-ppc64-gnu@0.132.0': optional: true - '@oxc-minify/binding-linux-ppc64-gnu@0.133.0': - optional: true - '@oxc-minify/binding-linux-riscv64-gnu@0.132.0': optional: true - '@oxc-minify/binding-linux-riscv64-gnu@0.133.0': - optional: true - '@oxc-minify/binding-linux-riscv64-musl@0.132.0': optional: true - '@oxc-minify/binding-linux-riscv64-musl@0.133.0': - optional: true - '@oxc-minify/binding-linux-s390x-gnu@0.132.0': optional: true - '@oxc-minify/binding-linux-s390x-gnu@0.133.0': - optional: true - '@oxc-minify/binding-linux-x64-gnu@0.132.0': optional: true - '@oxc-minify/binding-linux-x64-gnu@0.133.0': - optional: true - '@oxc-minify/binding-linux-x64-musl@0.132.0': optional: true - '@oxc-minify/binding-linux-x64-musl@0.133.0': - optional: true - '@oxc-minify/binding-openharmony-arm64@0.132.0': optional: true - '@oxc-minify/binding-openharmony-arm64@0.133.0': - optional: true - '@oxc-minify/binding-wasm32-wasi@0.132.0': dependencies: '@emnapi/core': 1.10.0 @@ -9764,127 +8918,63 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@oxc-minify/binding-wasm32-wasi@0.133.0': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - optional: true - '@oxc-minify/binding-win32-arm64-msvc@0.132.0': optional: true - '@oxc-minify/binding-win32-arm64-msvc@0.133.0': - optional: true - '@oxc-minify/binding-win32-ia32-msvc@0.132.0': optional: true - '@oxc-minify/binding-win32-ia32-msvc@0.133.0': - optional: true - '@oxc-minify/binding-win32-x64-msvc@0.132.0': optional: true - '@oxc-minify/binding-win32-x64-msvc@0.133.0': - optional: true - '@oxc-parser/binding-android-arm-eabi@0.132.0': optional: true - '@oxc-parser/binding-android-arm-eabi@0.133.0': - optional: true - '@oxc-parser/binding-android-arm64@0.132.0': optional: true - '@oxc-parser/binding-android-arm64@0.133.0': - optional: true - '@oxc-parser/binding-darwin-arm64@0.132.0': optional: true - '@oxc-parser/binding-darwin-arm64@0.133.0': - optional: true - '@oxc-parser/binding-darwin-x64@0.132.0': optional: true - '@oxc-parser/binding-darwin-x64@0.133.0': - optional: true - '@oxc-parser/binding-freebsd-x64@0.132.0': optional: true - '@oxc-parser/binding-freebsd-x64@0.133.0': - optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.132.0': optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.133.0': - optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.132.0': optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.133.0': - optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.132.0': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.133.0': - optional: true - '@oxc-parser/binding-linux-arm64-musl@0.132.0': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.133.0': - optional: true - '@oxc-parser/binding-linux-ppc64-gnu@0.132.0': optional: true - '@oxc-parser/binding-linux-ppc64-gnu@0.133.0': - optional: true - '@oxc-parser/binding-linux-riscv64-gnu@0.132.0': optional: true - '@oxc-parser/binding-linux-riscv64-gnu@0.133.0': - optional: true - '@oxc-parser/binding-linux-riscv64-musl@0.132.0': optional: true - '@oxc-parser/binding-linux-riscv64-musl@0.133.0': - optional: true - '@oxc-parser/binding-linux-s390x-gnu@0.132.0': optional: true - '@oxc-parser/binding-linux-s390x-gnu@0.133.0': - optional: true - '@oxc-parser/binding-linux-x64-gnu@0.132.0': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.133.0': - optional: true - '@oxc-parser/binding-linux-x64-musl@0.132.0': optional: true - '@oxc-parser/binding-linux-x64-musl@0.133.0': - optional: true - '@oxc-parser/binding-openharmony-arm64@0.132.0': optional: true - '@oxc-parser/binding-openharmony-arm64@0.133.0': - optional: true - '@oxc-parser/binding-wasm32-wasi@0.132.0': dependencies: '@emnapi/core': 1.10.0 @@ -9892,133 +8982,69 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@oxc-parser/binding-wasm32-wasi@0.133.0': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.132.0': optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.133.0': - optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.132.0': optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.133.0': - optional: true - '@oxc-parser/binding-win32-x64-msvc@0.132.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.133.0': - optional: true - '@oxc-project/types@0.132.0': {} - '@oxc-project/types@0.133.0': {} + '@oxc-project/types@0.137.0': {} '@oxc-project/types@0.95.0': {} '@oxc-transform/binding-android-arm-eabi@0.132.0': optional: true - '@oxc-transform/binding-android-arm-eabi@0.133.0': - optional: true - '@oxc-transform/binding-android-arm64@0.132.0': optional: true - '@oxc-transform/binding-android-arm64@0.133.0': - optional: true - '@oxc-transform/binding-darwin-arm64@0.132.0': optional: true - '@oxc-transform/binding-darwin-arm64@0.133.0': - optional: true - '@oxc-transform/binding-darwin-x64@0.132.0': optional: true - '@oxc-transform/binding-darwin-x64@0.133.0': - optional: true - '@oxc-transform/binding-freebsd-x64@0.132.0': optional: true - '@oxc-transform/binding-freebsd-x64@0.133.0': - optional: true - - '@oxc-transform/binding-linux-arm-gnueabihf@0.132.0': - optional: true - - '@oxc-transform/binding-linux-arm-gnueabihf@0.133.0': - optional: true - - '@oxc-transform/binding-linux-arm-musleabihf@0.132.0': - optional: true - - '@oxc-transform/binding-linux-arm-musleabihf@0.133.0': + '@oxc-transform/binding-linux-arm-gnueabihf@0.132.0': optional: true - '@oxc-transform/binding-linux-arm64-gnu@0.132.0': + '@oxc-transform/binding-linux-arm-musleabihf@0.132.0': optional: true - '@oxc-transform/binding-linux-arm64-gnu@0.133.0': + '@oxc-transform/binding-linux-arm64-gnu@0.132.0': optional: true '@oxc-transform/binding-linux-arm64-musl@0.132.0': optional: true - '@oxc-transform/binding-linux-arm64-musl@0.133.0': - optional: true - '@oxc-transform/binding-linux-ppc64-gnu@0.132.0': optional: true - '@oxc-transform/binding-linux-ppc64-gnu@0.133.0': - optional: true - '@oxc-transform/binding-linux-riscv64-gnu@0.132.0': optional: true - '@oxc-transform/binding-linux-riscv64-gnu@0.133.0': - optional: true - '@oxc-transform/binding-linux-riscv64-musl@0.132.0': optional: true - '@oxc-transform/binding-linux-riscv64-musl@0.133.0': - optional: true - '@oxc-transform/binding-linux-s390x-gnu@0.132.0': optional: true - '@oxc-transform/binding-linux-s390x-gnu@0.133.0': - optional: true - '@oxc-transform/binding-linux-x64-gnu@0.132.0': optional: true - '@oxc-transform/binding-linux-x64-gnu@0.133.0': - optional: true - '@oxc-transform/binding-linux-x64-musl@0.132.0': optional: true - '@oxc-transform/binding-linux-x64-musl@0.133.0': - optional: true - '@oxc-transform/binding-openharmony-arm64@0.132.0': optional: true - '@oxc-transform/binding-openharmony-arm64@0.133.0': - optional: true - '@oxc-transform/binding-wasm32-wasi@0.132.0': dependencies: '@emnapi/core': 1.10.0 @@ -10026,31 +9052,15 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@oxc-transform/binding-wasm32-wasi@0.133.0': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - optional: true - '@oxc-transform/binding-win32-arm64-msvc@0.132.0': optional: true - '@oxc-transform/binding-win32-arm64-msvc@0.133.0': - optional: true - '@oxc-transform/binding-win32-ia32-msvc@0.132.0': optional: true - '@oxc-transform/binding-win32-ia32-msvc@0.133.0': - optional: true - '@oxc-transform/binding-win32-x64-msvc@0.132.0': optional: true - '@oxc-transform/binding-win32-x64-msvc@0.133.0': - optional: true - '@package-json/types@0.0.12': {} '@parcel/watcher-android-arm64@2.5.6': @@ -10142,59 +9152,98 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-beta.45': optional: true + '@rolldown/binding-android-arm64@1.1.3': + optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.45': optional: true + '@rolldown/binding-darwin-arm64@1.1.3': + optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.45': optional: true + '@rolldown/binding-darwin-x64@1.1.3': + optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.45': optional: true + '@rolldown/binding-freebsd-x64@1.1.3': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.45': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.1.3': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.45': optional: true + '@rolldown/binding-linux-arm64-gnu@1.1.3': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.45': optional: true + '@rolldown/binding-linux-arm64-musl@1.1.3': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.1.3': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.1.3': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.45': optional: true + '@rolldown/binding-linux-x64-gnu@1.1.3': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.45': optional: true + '@rolldown/binding-linux-x64-musl@1.1.3': + optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-beta.45': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@rolldown/binding-openharmony-arm64@1.1.3': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.45(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: - '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.1)': + '@rolldown/binding-wasm32-wasi@1.1.3': dependencies: - '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.1) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.45': optional: true + '@rolldown/binding-win32-arm64-msvc@1.1.3': + optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.45': optional: true '@rolldown/binding-win32-x64-msvc@1.0.0-beta.45': optional: true - '@rolldown/pluginutils@1.0.0-beta.27': {} + '@rolldown/binding-win32-x64-msvc@1.1.3': + optional: true '@rolldown/pluginutils@1.0.0-beta.45': {} @@ -10368,6 +9417,93 @@ snapshots: '@standard-schema/spec@1.1.0': {} + '@sveltejs/acorn-typescript@1.0.10(acorn@8.17.0)': + dependencies: + acorn: 8.17.0 + + '@sveltejs/adapter-auto@7.0.1(@sveltejs/kit@2.68.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)))(svelte@5.56.4(@typescript-eslint/types@8.61.1))(typescript@6.0.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)))': + dependencies: + '@sveltejs/kit': 2.68.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)))(svelte@5.56.4(@typescript-eslint/types@8.61.1))(typescript@6.0.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + + '@sveltejs/kit@2.68.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)))(svelte@5.56.4(@typescript-eslint/types@8.61.1))(typescript@5.9.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': + dependencies: + '@standard-schema/spec': 1.1.0 + '@sveltejs/acorn-typescript': 1.0.10(acorn@8.17.0) + '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@types/cookie': 0.6.0 + acorn: 8.17.0 + cookie: 0.6.0 + devalue: 5.8.1 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.21 + mrmime: 2.0.1 + set-cookie-parser: 3.1.1 + sirv: 3.0.2 + svelte: 5.56.4(@typescript-eslint/types@8.61.1) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + optionalDependencies: + typescript: 5.9.3 + + '@sveltejs/kit@2.68.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)))(svelte@5.56.4(@typescript-eslint/types@8.61.1))(typescript@6.0.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': + dependencies: + '@standard-schema/spec': 1.1.0 + '@sveltejs/acorn-typescript': 1.0.10(acorn@8.17.0) + '@sveltejs/vite-plugin-svelte': 7.1.2(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@types/cookie': 0.6.0 + acorn: 8.17.0 + cookie: 0.6.0 + devalue: 5.8.1 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.21 + mrmime: 2.0.1 + set-cookie-parser: 3.1.1 + sirv: 3.0.2 + svelte: 5.56.4(@typescript-eslint/types@8.61.1) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + optionalDependencies: + typescript: 6.0.3 + + '@sveltejs/load-config@0.2.0': {} + + '@sveltejs/package@2.5.8(svelte@5.56.4(@typescript-eslint/types@8.61.1))(typescript@5.9.3)': + dependencies: + chokidar: 5.0.0 + kleur: 4.1.5 + sade: 1.8.1 + semver: 7.8.5 + svelte: 5.56.4(@typescript-eslint/types@8.61.1) + svelte2tsx: 0.7.57(svelte@5.56.4(@typescript-eslint/types@8.61.1))(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)))(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': + dependencies: + '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + obug: 2.1.3 + svelte: 5.56.4(@typescript-eslint/types@8.61.1) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + + '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)))(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + deepmerge: 4.3.1 + magic-string: 0.30.21 + obug: 2.1.3 + svelte: 5.56.4(@typescript-eslint/types@8.61.1) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vitefu: 1.1.3(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + + '@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.4(@typescript-eslint/types@8.61.1))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': + dependencies: + deepmerge: 4.3.1 + magic-string: 0.30.21 + obug: 2.1.3 + svelte: 5.56.4(@typescript-eslint/types@8.61.1) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vitefu: 1.1.3(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -10482,28 +9618,12 @@ snapshots: tslib: 2.8.1 optional: true - '@types/aria-query@5.0.4': {} - - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.28.0 - - '@types/babel__generator@7.27.0': - dependencies: - '@babel/types': 7.29.7 - - '@types/babel__template@7.4.4': + '@tybys/wasm-util@0.10.3': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + tslib: 2.8.1 + optional: true - '@types/babel__traverse@7.28.0': - dependencies: - '@babel/types': 7.29.7 + '@types/aria-query@5.0.4': {} '@types/body-parser@1.19.6': dependencies: @@ -10523,6 +9643,8 @@ snapshots: dependencies: '@types/express': 5.0.6 + '@types/cookie@0.6.0': {} + '@types/deep-eql@4.0.2': {} '@types/esrecurse@4.3.1': {} @@ -10581,8 +9703,7 @@ snapshots: '@types/http-errors': 2.0.5 '@types/node': 24.7.2 - '@types/trusted-types@2.0.7': - optional: true + '@types/trusted-types@2.0.7': {} '@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: @@ -10790,7 +9911,7 @@ snapshots: dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': @@ -10821,48 +9942,31 @@ snapshots: - rollup - supports-color - '@vitejs/plugin-react@4.7.0(vite@6.4.3(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': - dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) - '@rolldown/pluginutils': 1.0.0-beta.27 - '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 - vite: 6.4.3(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - transitivePeerDependencies: - - supports-color - - '@vitejs/plugin-vue-jsx@5.1.5(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3))': + '@vitejs/plugin-vue-jsx@5.1.5(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) '@rolldown/pluginutils': 1.0.1 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.7) - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) vue: 3.5.38(typescript@5.9.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@6.4.3(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3))': - dependencies: - vite: 6.4.3(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - vue: 3.5.30(typescript@5.9.3) - - '@vitejs/plugin-vue@6.0.7(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.7(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) vue: 3.5.38(typescript@5.9.3) - '@vitest/browser-playwright@4.1.8(playwright@1.60.0)(vite@7.3.5(@types/node@22.15.3)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8)': + '@vitest/browser-playwright@4.1.8(playwright@1.60.0)(vite@8.1.0(@types/node@22.15.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8)': dependencies: - '@vitest/browser': 4.1.8(vite@7.3.5(@types/node@22.15.3)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8) - '@vitest/mocker': 4.1.8(vite@7.3.5(@types/node@22.15.3)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@vitest/browser': 4.1.8(vite@8.1.0(@types/node@22.15.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8) + '@vitest/mocker': 4.1.8(vite@8.1.0(@types/node@22.15.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) playwright: 1.60.0 tinyrainbow: 3.1.0 - vitest: 4.1.8(@types/node@22.15.3)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@22.15.3)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + vitest: 4.1.8(@types/node@22.15.3)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@22.15.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) transitivePeerDependencies: - bufferutil - msw @@ -10870,29 +9974,29 @@ snapshots: - vite optional: true - '@vitest/browser-playwright@4.1.8(playwright@1.60.0)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8)': + '@vitest/browser-playwright@4.1.8(playwright@1.60.0)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8)': dependencies: - '@vitest/browser': 4.1.8(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8) - '@vitest/mocker': 4.1.8(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@vitest/browser': 4.1.8(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8) + '@vitest/mocker': 4.1.8(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) playwright: 1.60.0 tinyrainbow: 3.1.0 - vitest: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + vitest: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@4.1.8(vite@7.3.5(@types/node@22.15.3)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8)': + '@vitest/browser@4.1.8(vite@8.1.0(@types/node@22.15.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.8(vite@7.3.5(@types/node@22.15.3)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@vitest/mocker': 4.1.8(vite@8.1.0(@types/node@22.15.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) '@vitest/utils': 4.1.8 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.8(@types/node@22.15.3)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@22.15.3)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + vitest: 4.1.8(@types/node@22.15.3)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@22.15.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) ws: 8.21.0 transitivePeerDependencies: - bufferutil @@ -10901,16 +10005,16 @@ snapshots: - vite optional: true - '@vitest/browser@4.1.8(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8)': + '@vitest/browser@4.1.8(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.8(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@vitest/mocker': 4.1.8(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) '@vitest/utils': 4.1.8 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + vitest: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) ws: 8.21.0 transitivePeerDependencies: - bufferutil @@ -10926,7 +10030,7 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) typescript: 5.9.3 - vitest: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + vitest: 4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) transitivePeerDependencies: - supports-color @@ -10939,21 +10043,21 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.8(vite@7.3.5(@types/node@22.15.3)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.8(vite@8.1.0(@types/node@22.15.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.5(@types/node@22.15.3)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@22.15.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - '@vitest/mocker@4.1.8(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.8(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) '@vitest/pretty-format@4.1.8': dependencies: @@ -11100,14 +10204,14 @@ snapshots: dependencies: '@vue/devtools-kit': 8.1.3 - '@vue/devtools-core@7.7.9(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3))': + '@vue/devtools-core@7.7.9(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3))': dependencies: '@vue/devtools-kit': 7.7.9 '@vue/devtools-shared': 7.7.9 mitt: 3.0.1 nanoid: 5.1.15 pathe: 2.0.3 - vite-hot-client: 2.2.0(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + vite-hot-client: 2.2.0(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) vue: 3.5.30(typescript@5.9.3) transitivePeerDependencies: - vite @@ -11212,11 +10316,6 @@ snapshots: dependencies: event-target-shim: 5.0.1 - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - accepts@2.0.0: dependencies: mime-types: 3.0.2 @@ -11292,6 +10391,8 @@ snapshots: dependencies: dequal: 2.0.3 + aria-query@5.3.1: {} + aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -11299,8 +10400,6 @@ snapshots: call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-flatten@1.1.1: {} - array-includes@3.1.9: dependencies: call-bind: 1.0.9 @@ -11459,23 +10558,6 @@ snapshots: birpc@4.0.0: {} - body-parser@1.20.5: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.15.2 - raw-body: 2.5.3 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - body-parser@2.3.0: dependencies: bytes: 3.1.2 @@ -11594,11 +10676,6 @@ snapshots: lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-api@4.0.0: - dependencies: - browserslist: 4.28.2 - caniuse-lite: 1.0.30001799 - caniuse-lite@1.0.30001799: {} chai@6.2.2: {} @@ -11632,6 +10709,8 @@ snapshots: strip-ansi: 7.2.0 wrap-ansi: 9.0.2 + clsx@2.1.1: {} + cluster-key-slot@1.1.1: {} color-convert@2.0.1: @@ -11673,10 +10752,6 @@ snapshots: consola@3.4.2: {} - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - content-disposition@1.1.0: {} content-type@1.0.5: {} @@ -11693,17 +10768,10 @@ snapshots: cookie-es@3.1.1: {} - cookie-parser@1.4.7: - dependencies: - cookie: 0.7.2 - cookie-signature: 1.0.6 - - cookie-signature@1.0.6: {} - - cookie-signature@1.0.7: {} - cookie-signature@1.2.2: {} + cookie@0.6.0: {} + cookie@0.7.2: {} cookie@1.1.1: {} @@ -11813,59 +10881,16 @@ snapshots: postcss-svgo: 7.1.3(postcss@8.5.15) postcss-unique-selectors: 7.0.7(postcss@8.5.15) - cssnano-preset-default@8.0.2(postcss@8.5.15): - dependencies: - browserslist: 4.28.2 - cssnano-utils: 6.0.1(postcss@8.5.15) - postcss: 8.5.15 - postcss-calc: 10.1.1(postcss@8.5.15) - postcss-colormin: 8.0.1(postcss@8.5.15) - postcss-convert-values: 8.0.1(postcss@8.5.15) - postcss-discard-comments: 8.0.1(postcss@8.5.15) - postcss-discard-duplicates: 8.0.1(postcss@8.5.15) - postcss-discard-empty: 8.0.1(postcss@8.5.15) - postcss-discard-overridden: 8.0.1(postcss@8.5.15) - postcss-merge-longhand: 8.0.1(postcss@8.5.15) - postcss-merge-rules: 8.0.1(postcss@8.5.15) - postcss-minify-font-values: 8.0.1(postcss@8.5.15) - postcss-minify-gradients: 8.0.1(postcss@8.5.15) - postcss-minify-params: 8.0.1(postcss@8.5.15) - postcss-minify-selectors: 8.0.2(postcss@8.5.15) - postcss-normalize-charset: 8.0.1(postcss@8.5.15) - postcss-normalize-display-values: 8.0.1(postcss@8.5.15) - postcss-normalize-positions: 8.0.1(postcss@8.5.15) - postcss-normalize-repeat-style: 8.0.1(postcss@8.5.15) - postcss-normalize-string: 8.0.1(postcss@8.5.15) - postcss-normalize-timing-functions: 8.0.1(postcss@8.5.15) - postcss-normalize-unicode: 8.0.1(postcss@8.5.15) - postcss-normalize-url: 8.0.1(postcss@8.5.15) - postcss-normalize-whitespace: 8.0.1(postcss@8.5.15) - postcss-ordered-values: 8.0.1(postcss@8.5.15) - postcss-reduce-initial: 8.0.1(postcss@8.5.15) - postcss-reduce-transforms: 8.0.1(postcss@8.5.15) - postcss-svgo: 8.0.1(postcss@8.5.15) - postcss-unique-selectors: 8.0.1(postcss@8.5.15) - cssnano-utils@5.0.3(postcss@8.5.15): dependencies: postcss: 8.5.15 - cssnano-utils@6.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - cssnano@7.1.9(postcss@8.5.15): dependencies: cssnano-preset-default: 7.0.17(postcss@8.5.15) lilconfig: 3.1.3 postcss: 8.5.15 - cssnano@8.0.2(postcss@8.5.15): - dependencies: - cssnano-preset-default: 8.0.2(postcss@8.5.15) - lilconfig: 3.1.3 - postcss: 8.5.15 - csso@5.0.5: dependencies: css-tree: 2.2.1 @@ -11906,16 +10931,14 @@ snapshots: db0@0.3.4: {} - debug@2.6.9: - dependencies: - ms: 2.0.0 - debug@4.4.3: dependencies: ms: 2.1.3 decimal.js@10.6.0: {} + dedent-js@1.0.1: {} + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -11953,8 +10976,6 @@ snapshots: destr@2.0.5: {} - destroy@1.2.0: {} - detect-libc@2.1.2: {} devalue@5.8.1: {} @@ -12433,6 +11454,8 @@ snapshots: transitivePeerDependencies: - supports-color + esm-env@1.2.2: {} + espree@10.4.0: dependencies: acorn: 8.17.0 @@ -12449,6 +11472,12 @@ snapshots: dependencies: estraverse: 5.3.0 + esrap@2.2.13(@typescript-eslint/types@8.61.1): + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + optionalDependencies: + '@typescript-eslint/types': 8.61.1 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -12489,42 +11518,6 @@ snapshots: expect-type@1.3.0: {} - express@4.22.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.5 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.0.7 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.2 - fresh: 0.5.2 - http-errors: 2.0.1 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.13 - proxy-addr: 2.0.7 - qs: 6.15.2 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.2 - serve-static: 1.16.3 - setprototypeof: 1.2.0 - statuses: 2.0.2 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - express@5.2.1: dependencies: accepts: 2.0.0 @@ -12619,18 +11612,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.3.2: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - finalhandler@2.1.1: dependencies: debug: 4.4.3 @@ -12675,8 +11656,6 @@ snapshots: fraction.js@5.3.4: {} - fresh@0.5.2: {} - fresh@2.0.0: {} fsevents@2.3.2: @@ -12891,10 +11870,6 @@ snapshots: human-signals@5.0.0: {} - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 @@ -13060,6 +12035,10 @@ snapshots: dependencies: '@types/estree': 1.0.9 + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.9 + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -13238,6 +12217,55 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -13271,6 +12299,8 @@ snapshots: pkg-types: 2.3.1 quansync: 0.2.11 + locate-character@3.0.0: {} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -13340,41 +12370,27 @@ snapshots: mdn-data@2.27.1: {} - media-typer@0.3.0: {} - media-typer@1.1.0: {} memory-cache@0.2.0: {} - merge-descriptors@1.0.3: {} - merge-descriptors@2.0.0: {} merge-stream@2.0.0: {} merge2@1.4.1: {} - methods@1.1.2: {} - micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.2 - mime-db@1.52.0: {} - mime-db@1.54.0: {} - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - mime-types@3.0.2: dependencies: mime-db: 1.54.0 - mime@1.6.0: {} - mime@4.1.0: {} mimic-fn@4.0.0: {} @@ -13436,9 +12452,9 @@ snapshots: mocked-exports@0.1.1: {} - mrmime@2.0.1: {} + mri@1.2.0: {} - ms@2.0.0: {} + mrmime@2.0.1: {} ms@2.1.3: {} @@ -13454,11 +12470,9 @@ snapshots: natural-compare@1.4.0: {} - negotiator@0.6.3: {} - negotiator@1.0.0: {} - next@15.5.18(@playwright/test@1.60.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@15.5.18(@babel/core@7.29.7)(@playwright/test@1.60.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@next/env': 15.5.18 '@swc/helpers': 0.5.15 @@ -13466,7 +12480,7 @@ snapshots: postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - styled-jsx: 5.1.6(react@19.2.3) + styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.2.3) optionalDependencies: '@next/swc-darwin-arm64': 15.5.18 '@next/swc-darwin-x64': 15.5.18 @@ -13482,112 +12496,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - nitropack@2.13.4(oxc-parser@0.132.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(srvx@0.11.17): - dependencies: - '@cloudflare/kv-asset-handler': 0.4.2 - '@rollup/plugin-alias': 6.0.0(rollup@4.62.2) - '@rollup/plugin-commonjs': 29.0.3(rollup@4.62.2) - '@rollup/plugin-inject': 5.0.5(rollup@4.62.2) - '@rollup/plugin-json': 6.1.0(rollup@4.62.2) - '@rollup/plugin-node-resolve': 16.0.3(rollup@4.62.2) - '@rollup/plugin-replace': 6.0.3(rollup@4.62.2) - '@rollup/plugin-terser': 1.0.0(rollup@4.62.2) - '@vercel/nft': 1.10.2(rollup@4.62.2) - archiver: 7.0.1 - c12: 3.3.4(magicast@0.5.3) - chokidar: 5.0.0 - citty: 0.2.2 - compatx: 0.2.0 - confbox: 0.2.4 - consola: 3.4.2 - cookie-es: 2.0.1 - croner: 10.0.1 - crossws: 0.3.5 - db0: 0.3.4 - defu: 6.1.7 - destr: 2.0.5 - dot-prop: 10.1.0 - esbuild: 0.28.1 - escape-string-regexp: 5.0.0 - etag: 1.8.1 - exsolve: 1.0.8 - globby: 16.2.0 - gzip-size: 7.0.0 - h3: 1.15.11 - hookable: 5.5.3 - httpxy: 0.5.3 - ioredis: 5.11.1 - jiti: 2.7.0 - klona: 2.0.6 - knitwork: 1.3.0 - listhen: 1.10.0(srvx@0.11.17) - magic-string: 0.30.21 - magicast: 0.5.3 - mime: 4.1.0 - mlly: 1.8.2 - node-fetch-native: 1.6.7 - node-mock-http: 1.0.4 - ofetch: 1.5.1 - ohash: 2.0.11 - pathe: 2.0.3 - perfect-debounce: 2.1.0 - pkg-types: 2.3.1 - pretty-bytes: 7.1.0 - radix3: 1.1.2 - rollup: 4.62.2 - rollup-plugin-visualizer: 7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2) - scule: 1.3.0 - semver: 7.8.5 - serve-placeholder: 2.0.2 - serve-static: 2.2.1 - source-map: 0.7.6 - std-env: 4.1.0 - ufo: 1.6.4 - ultrahtml: 1.6.0 - uncrypto: 0.1.3 - unctx: 2.5.0 - unenv: 2.0.0-rc.24 - unimport: 6.3.0(oxc-parser@0.132.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)) - unplugin-utils: 0.3.1 - unstorage: 1.17.5(db0@0.3.4)(ioredis@5.11.1) - untyped: 2.0.0 - unwasm: 0.5.3 - youch: 4.1.1 - youch-core: 0.3.3 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@electric-sql/pglite' - - '@libsql/client' - - '@netlify/blobs' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - bare-abort-controller - - bare-buffer - - better-sqlite3 - - drizzle-orm - - encoding - - idb-keyval - - mysql2 - - oxc-parser - - react-native-b4a - - rolldown - - sqlite3 - - srvx - - supports-color - - uploadthing - - nitropack@2.13.4(oxc-parser@0.133.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)): + nitropack@2.13.4(oxc-parser@0.132.0)(rolldown@1.1.3)(srvx@0.11.17): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.62.2) @@ -13640,7 +12549,7 @@ snapshots: pretty-bytes: 7.1.0 radix3: 1.1.2 rollup: 4.62.2 - rollup-plugin-visualizer: 7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2) + rollup-plugin-visualizer: 7.0.1(rolldown@1.1.3)(rollup@4.62.2) scule: 1.3.0 semver: 7.8.5 serve-placeholder: 2.0.2 @@ -13652,7 +12561,7 @@ snapshots: uncrypto: 0.1.3 unctx: 2.5.0 unenv: 2.0.0-rc.24 - unimport: 6.3.0(oxc-parser@0.133.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)) + unimport: 6.3.0(oxc-parser@0.132.0)(rolldown@1.1.3) unplugin-utils: 0.3.1 unstorage: 1.17.5(db0@0.3.4)(ioredis@5.11.1) untyped: 2.0.0 @@ -13738,16 +12647,16 @@ snapshots: dependencies: boolbase: 1.0.0 - nuxt@3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0): + nuxt@3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.3)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.3)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0): dependencies: '@dxup/nuxt': 0.4.1(magicast@0.5.3)(typescript@5.9.3) '@nuxt/cli': 3.36.0(@nuxt/schema@3.21.7)(cac@6.7.14)(magicast@0.5.3) - '@nuxt/devtools': 3.2.4(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) + '@nuxt/devtools': 3.2.4(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) '@nuxt/kit': 3.21.7(magicast@0.5.3) - '@nuxt/nitro-server': 3.21.7(db0@0.3.4)(ioredis@5.11.1)(magicast@0.5.3)(nuxt@3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0))(oxc-parser@0.132.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(srvx@0.11.17)(typescript@5.9.3) + '@nuxt/nitro-server': 3.21.7(db0@0.3.4)(ioredis@5.11.1)(magicast@0.5.3)(nuxt@3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.3)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.3)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0))(oxc-parser@0.132.0)(rolldown@1.1.3)(srvx@0.11.17)(typescript@5.9.3) '@nuxt/schema': 3.21.7 '@nuxt/telemetry': 2.8.0(@nuxt/kit@3.21.7(magicast@0.5.3)) - '@nuxt/vite-builder': 3.21.7(@types/node@24.7.2)(eslint@9.39.4(jiti@2.7.0))(magicast@0.5.3)(nuxt@3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0))(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(terser@5.48.0)(typescript@5.9.3)(vue@3.5.38(typescript@5.9.3))(yaml@2.9.0) + '@nuxt/vite-builder': 3.21.7(@types/node@24.7.2)(eslint@9.39.4(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@3.21.7(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.1.3)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.3)(rollup@4.62.2))(rollup@4.62.2)(srvx@0.11.17)(terser@5.48.0)(typescript@5.9.3)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0))(optionator@0.9.4)(rolldown@1.1.3)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.3)(rollup@4.62.2))(rollup@4.62.2)(terser@5.48.0)(typescript@5.9.3)(vue@3.5.38(typescript@5.9.3))(yaml@2.9.0) '@unhead/vue': 2.1.15(vue@3.5.38(typescript@5.9.3)) '@vue/shared': 3.5.38 c12: 3.3.4(magicast@0.5.3) @@ -13778,7 +12687,7 @@ snapshots: oxc-minify: 0.132.0 oxc-parser: 0.132.0 oxc-transform: 0.132.0 - oxc-walker: 1.0.0(oxc-parser@0.132.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)) + oxc-walker: 1.0.0(oxc-parser@0.132.0)(rolldown@1.1.3) pathe: 2.0.3 perfect-debounce: 2.1.0 pkg-types: 2.3.1 @@ -13791,7 +12700,7 @@ snapshots: ultrahtml: 1.6.0 uncrypto: 0.1.3 unctx: 2.5.0 - unimport: 6.3.0(oxc-parser@0.132.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)) + unimport: 6.3.0(oxc-parser@0.132.0)(rolldown@1.1.3) unplugin: 3.0.0 unplugin-vue-router: 0.19.2(@vue/compiler-sfc@3.5.38)(vue-router@4.6.4(vue@3.5.38(typescript@5.9.3)))(vue@3.5.38(typescript@5.9.3)) untyped: 2.0.0 @@ -13864,135 +12773,6 @@ snapshots: - xml2js - yaml - nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(terser@5.48.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0): - dependencies: - '@dxup/nuxt': 0.4.1(magicast@0.5.3)(typescript@5.9.3) - '@nuxt/cli': 3.36.0(@nuxt/schema@4.4.8)(cac@6.7.14)(magicast@0.5.3) - '@nuxt/devtools': 3.2.4(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) - '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@nuxt/nitro-server': 4.4.8(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(db0@0.3.4)(ioredis@5.11.1)(magicast@0.5.3)(nuxt@4.4.8(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7))(@parcel/watcher@2.5.6)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.7.0))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2))(rollup@4.62.2)(terser@5.48.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(yaml@2.9.0))(oxc-parser@0.133.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(typescript@5.9.3) - '@nuxt/schema': 4.4.8 - '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.4.8(magicast@0.5.3)) - '@nuxt/vite-builder': 4.4.8(5e770e72ca055b8ebf51d504a3c88ac6) - '@unhead/vue': 2.1.15(vue@3.5.38(typescript@5.9.3)) - '@vue/shared': 3.5.38 - chokidar: 5.0.0 - compatx: 0.2.0 - consola: 3.4.2 - cookie-es: 3.1.1 - defu: 6.1.7 - devalue: 5.8.1 - errx: 0.1.0 - escape-string-regexp: 5.0.0 - exsolve: 1.0.8 - hookable: 6.1.1 - ignore: 7.0.5 - impound: 1.1.5 - jiti: 2.7.0 - klona: 2.0.6 - knitwork: 1.3.0 - magic-string: 0.30.21 - mlly: 1.8.2 - nanotar: 0.3.0 - nypm: 0.6.7 - ofetch: 1.5.1 - ohash: 2.0.11 - on-change: 6.0.2 - oxc-minify: 0.133.0 - oxc-parser: 0.133.0 - oxc-transform: 0.133.0 - oxc-walker: 1.0.0(oxc-parser@0.133.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)) - pathe: 2.0.3 - perfect-debounce: 2.1.0 - picomatch: 4.0.4 - pkg-types: 2.3.1 - rou3: 0.8.1 - scule: 1.3.0 - semver: 7.8.5 - std-env: 4.1.0 - tinyglobby: 0.2.17 - ufo: 1.6.4 - ultrahtml: 1.6.0 - uncrypto: 0.1.3 - unctx: 2.5.0 - unhead: 2.1.15 - unimport: 6.3.0(oxc-parser@0.133.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)) - unplugin: 3.0.0 - unrouting: 0.1.7 - untyped: 2.0.0 - vue: 3.5.38(typescript@5.9.3) - vue-router: 5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) - optionalDependencies: - '@parcel/watcher': 2.5.6 - '@types/node': 24.7.2 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@babel/plugin-proposal-decorators' - - '@babel/plugin-syntax-jsx' - - '@babel/plugin-syntax-typescript' - - '@biomejs/biome' - - '@capacitor/preferences' - - '@deno/kv' - - '@electric-sql/pglite' - - '@libsql/client' - - '@netlify/blobs' - - '@pinia/colada' - - '@planetscale/database' - - '@rollup/plugin-babel' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - '@vitejs/devtools' - - '@vue/compiler-sfc' - - aws4fetch - - bare-abort-controller - - bare-buffer - - better-sqlite3 - - bufferutil - - cac - - commander - - db0 - - drizzle-orm - - encoding - - eslint - - idb-keyval - - ioredis - - less - - lightningcss - - magicast - - meow - - mysql2 - - optionator - - oxlint - - pinia - - react-native-b4a - - rolldown - - rollup - - rollup-plugin-visualizer - - sass - - sass-embedded - - sqlite3 - - srvx - - stylelint - - stylus - - sugarss - - supports-color - - terser - - tsx - - typescript - - uploadthing - - utf-8-validate - - vite - - vue-tsc - - xml2js - - yaml - nypm@0.6.7: dependencies: citty: 0.2.2 @@ -14108,29 +12888,6 @@ snapshots: '@oxc-minify/binding-win32-ia32-msvc': 0.132.0 '@oxc-minify/binding-win32-x64-msvc': 0.132.0 - oxc-minify@0.133.0: - optionalDependencies: - '@oxc-minify/binding-android-arm-eabi': 0.133.0 - '@oxc-minify/binding-android-arm64': 0.133.0 - '@oxc-minify/binding-darwin-arm64': 0.133.0 - '@oxc-minify/binding-darwin-x64': 0.133.0 - '@oxc-minify/binding-freebsd-x64': 0.133.0 - '@oxc-minify/binding-linux-arm-gnueabihf': 0.133.0 - '@oxc-minify/binding-linux-arm-musleabihf': 0.133.0 - '@oxc-minify/binding-linux-arm64-gnu': 0.133.0 - '@oxc-minify/binding-linux-arm64-musl': 0.133.0 - '@oxc-minify/binding-linux-ppc64-gnu': 0.133.0 - '@oxc-minify/binding-linux-riscv64-gnu': 0.133.0 - '@oxc-minify/binding-linux-riscv64-musl': 0.133.0 - '@oxc-minify/binding-linux-s390x-gnu': 0.133.0 - '@oxc-minify/binding-linux-x64-gnu': 0.133.0 - '@oxc-minify/binding-linux-x64-musl': 0.133.0 - '@oxc-minify/binding-openharmony-arm64': 0.133.0 - '@oxc-minify/binding-wasm32-wasi': 0.133.0 - '@oxc-minify/binding-win32-arm64-msvc': 0.133.0 - '@oxc-minify/binding-win32-ia32-msvc': 0.133.0 - '@oxc-minify/binding-win32-x64-msvc': 0.133.0 - oxc-parser@0.132.0: dependencies: '@oxc-project/types': 0.132.0 @@ -14156,31 +12913,6 @@ snapshots: '@oxc-parser/binding-win32-ia32-msvc': 0.132.0 '@oxc-parser/binding-win32-x64-msvc': 0.132.0 - oxc-parser@0.133.0: - dependencies: - '@oxc-project/types': 0.133.0 - optionalDependencies: - '@oxc-parser/binding-android-arm-eabi': 0.133.0 - '@oxc-parser/binding-android-arm64': 0.133.0 - '@oxc-parser/binding-darwin-arm64': 0.133.0 - '@oxc-parser/binding-darwin-x64': 0.133.0 - '@oxc-parser/binding-freebsd-x64': 0.133.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.133.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.133.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.133.0 - '@oxc-parser/binding-linux-arm64-musl': 0.133.0 - '@oxc-parser/binding-linux-ppc64-gnu': 0.133.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.133.0 - '@oxc-parser/binding-linux-riscv64-musl': 0.133.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.133.0 - '@oxc-parser/binding-linux-x64-gnu': 0.133.0 - '@oxc-parser/binding-linux-x64-musl': 0.133.0 - '@oxc-parser/binding-openharmony-arm64': 0.133.0 - '@oxc-parser/binding-wasm32-wasi': 0.133.0 - '@oxc-parser/binding-win32-arm64-msvc': 0.133.0 - '@oxc-parser/binding-win32-ia32-msvc': 0.133.0 - '@oxc-parser/binding-win32-x64-msvc': 0.133.0 - oxc-transform@0.132.0: optionalDependencies: '@oxc-transform/binding-android-arm-eabi': 0.132.0 @@ -14204,42 +12936,12 @@ snapshots: '@oxc-transform/binding-win32-ia32-msvc': 0.132.0 '@oxc-transform/binding-win32-x64-msvc': 0.132.0 - oxc-transform@0.133.0: - optionalDependencies: - '@oxc-transform/binding-android-arm-eabi': 0.133.0 - '@oxc-transform/binding-android-arm64': 0.133.0 - '@oxc-transform/binding-darwin-arm64': 0.133.0 - '@oxc-transform/binding-darwin-x64': 0.133.0 - '@oxc-transform/binding-freebsd-x64': 0.133.0 - '@oxc-transform/binding-linux-arm-gnueabihf': 0.133.0 - '@oxc-transform/binding-linux-arm-musleabihf': 0.133.0 - '@oxc-transform/binding-linux-arm64-gnu': 0.133.0 - '@oxc-transform/binding-linux-arm64-musl': 0.133.0 - '@oxc-transform/binding-linux-ppc64-gnu': 0.133.0 - '@oxc-transform/binding-linux-riscv64-gnu': 0.133.0 - '@oxc-transform/binding-linux-riscv64-musl': 0.133.0 - '@oxc-transform/binding-linux-s390x-gnu': 0.133.0 - '@oxc-transform/binding-linux-x64-gnu': 0.133.0 - '@oxc-transform/binding-linux-x64-musl': 0.133.0 - '@oxc-transform/binding-openharmony-arm64': 0.133.0 - '@oxc-transform/binding-wasm32-wasi': 0.133.0 - '@oxc-transform/binding-win32-arm64-msvc': 0.133.0 - '@oxc-transform/binding-win32-ia32-msvc': 0.133.0 - '@oxc-transform/binding-win32-x64-msvc': 0.133.0 - - oxc-walker@1.0.0(oxc-parser@0.132.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)): + oxc-walker@1.0.0(oxc-parser@0.132.0)(rolldown@1.1.3): dependencies: magic-regexp: 0.11.0 optionalDependencies: oxc-parser: 0.132.0 - rolldown: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - - oxc-walker@1.0.0(oxc-parser@0.133.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)): - dependencies: - magic-regexp: 0.11.0 - optionalDependencies: - oxc-parser: 0.133.0 - rolldown: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + rolldown: 1.1.3 p-limit@3.1.0: dependencies: @@ -14288,8 +12990,6 @@ snapshots: lru-cache: 11.5.1 minipass: 7.1.3 - path-to-regexp@0.1.13: {} - path-to-regexp@8.4.2: {} path-type@4.0.0: {} @@ -14346,57 +13046,26 @@ snapshots: postcss: 8.5.15 postcss-value-parser: 4.2.0 - postcss-colormin@8.0.1(postcss@8.5.15): - dependencies: - '@colordx/core': 5.4.3 - browserslist: 4.28.2 - caniuse-api: 4.0.0 - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - postcss-convert-values@7.0.12(postcss@8.5.15): dependencies: browserslist: 4.28.2 postcss: 8.5.15 postcss-value-parser: 4.2.0 - postcss-convert-values@8.0.1(postcss@8.5.15): - dependencies: - browserslist: 4.28.2 - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - postcss-discard-comments@7.0.8(postcss@8.5.15): dependencies: postcss: 8.5.15 postcss-selector-parser: 7.1.4 - postcss-discard-comments@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - postcss-selector-parser: 7.1.4 - postcss-discard-duplicates@7.0.4(postcss@8.5.15): dependencies: postcss: 8.5.15 - postcss-discard-duplicates@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - - postcss-discard-empty@7.0.3(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - - postcss-discard-empty@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - - postcss-discard-overridden@7.0.3(postcss@8.5.15): + postcss-discard-empty@7.0.3(postcss@8.5.15): dependencies: postcss: 8.5.15 - postcss-discard-overridden@8.0.1(postcss@8.5.15): + postcss-discard-overridden@7.0.3(postcss@8.5.15): dependencies: postcss: 8.5.15 @@ -14406,12 +13075,6 @@ snapshots: postcss-value-parser: 4.2.0 stylehacks: 7.0.11(postcss@8.5.15) - postcss-merge-longhand@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - stylehacks: 8.0.1(postcss@8.5.15) - postcss-merge-rules@7.0.11(postcss@8.5.15): dependencies: browserslist: 4.28.2 @@ -14420,24 +13083,11 @@ snapshots: postcss: 8.5.15 postcss-selector-parser: 7.1.4 - postcss-merge-rules@8.0.1(postcss@8.5.15): - dependencies: - browserslist: 4.28.2 - caniuse-api: 4.0.0 - cssnano-utils: 6.0.1(postcss@8.5.15) - postcss: 8.5.15 - postcss-selector-parser: 7.1.4 - postcss-minify-font-values@7.0.3(postcss@8.5.15): dependencies: postcss: 8.5.15 postcss-value-parser: 4.2.0 - postcss-minify-font-values@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - postcss-minify-gradients@7.0.5(postcss@8.5.15): dependencies: '@colordx/core': 5.4.3 @@ -14445,13 +13095,6 @@ snapshots: postcss: 8.5.15 postcss-value-parser: 4.2.0 - postcss-minify-gradients@8.0.1(postcss@8.5.15): - dependencies: - '@colordx/core': 5.4.3 - cssnano-utils: 6.0.1(postcss@8.5.15) - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - postcss-minify-params@7.0.9(postcss@8.5.15): dependencies: browserslist: 4.28.2 @@ -14459,13 +13102,6 @@ snapshots: postcss: 8.5.15 postcss-value-parser: 4.2.0 - postcss-minify-params@8.0.1(postcss@8.5.15): - dependencies: - browserslist: 4.28.2 - cssnano-utils: 6.0.1(postcss@8.5.15) - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - postcss-minify-selectors@7.1.2(postcss@8.5.15): dependencies: browserslist: 4.28.2 @@ -14474,14 +13110,6 @@ snapshots: postcss: 8.5.15 postcss-selector-parser: 7.1.4 - postcss-minify-selectors@8.0.2(postcss@8.5.15): - dependencies: - browserslist: 4.28.2 - caniuse-api: 4.0.0 - cssesc: 3.0.0 - postcss: 8.5.15 - postcss-selector-parser: 7.1.4 - postcss-nested@7.0.2(postcss@8.5.15): dependencies: postcss: 8.5.15 @@ -14491,126 +13119,64 @@ snapshots: dependencies: postcss: 8.5.15 - postcss-normalize-charset@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - postcss-normalize-display-values@7.0.3(postcss@8.5.15): dependencies: postcss: 8.5.15 postcss-value-parser: 4.2.0 - postcss-normalize-display-values@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - postcss-normalize-positions@7.0.4(postcss@8.5.15): dependencies: postcss: 8.5.15 postcss-value-parser: 4.2.0 - postcss-normalize-positions@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@7.0.4(postcss@8.5.15): dependencies: postcss: 8.5.15 postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - postcss-normalize-string@7.0.3(postcss@8.5.15): dependencies: postcss: 8.5.15 postcss-value-parser: 4.2.0 - postcss-normalize-string@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@7.0.3(postcss@8.5.15): dependencies: postcss: 8.5.15 postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - postcss-normalize-unicode@7.0.9(postcss@8.5.15): dependencies: browserslist: 4.28.2 postcss: 8.5.15 postcss-value-parser: 4.2.0 - postcss-normalize-unicode@8.0.1(postcss@8.5.15): - dependencies: - browserslist: 4.28.2 - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - postcss-normalize-url@7.0.3(postcss@8.5.15): dependencies: postcss: 8.5.15 postcss-value-parser: 4.2.0 - postcss-normalize-url@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@7.0.3(postcss@8.5.15): dependencies: postcss: 8.5.15 postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - postcss-ordered-values@7.0.4(postcss@8.5.15): dependencies: cssnano-utils: 5.0.3(postcss@8.5.15) postcss: 8.5.15 postcss-value-parser: 4.2.0 - postcss-ordered-values@8.0.1(postcss@8.5.15): - dependencies: - cssnano-utils: 6.0.1(postcss@8.5.15) - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - postcss-reduce-initial@7.0.9(postcss@8.5.15): dependencies: browserslist: 4.28.2 caniuse-api: 3.0.0 postcss: 8.5.15 - postcss-reduce-initial@8.0.1(postcss@8.5.15): - dependencies: - browserslist: 4.28.2 - caniuse-api: 4.0.0 - postcss: 8.5.15 - postcss-reduce-transforms@7.0.3(postcss@8.5.15): dependencies: postcss: 8.5.15 postcss-value-parser: 4.2.0 - postcss-reduce-transforms@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - postcss-selector-parser@7.1.4: dependencies: cssesc: 3.0.0 @@ -14622,22 +13188,11 @@ snapshots: postcss-value-parser: 4.2.0 svgo: 4.0.1 - postcss-svgo@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - postcss-value-parser: 4.2.0 - svgo: 4.0.1 - postcss-unique-selectors@7.0.7(postcss@8.5.15): dependencies: postcss: 8.5.15 postcss-selector-parser: 7.1.4 - postcss-unique-selectors@8.0.1(postcss@8.5.15): - dependencies: - postcss: 8.5.15 - postcss-selector-parser: 7.1.4 - postcss-value-parser@4.2.0: {} postcss@8.4.31: @@ -14656,8 +13211,15 @@ snapshots: prelude-ls@1.2.1: {} + prettier-plugin-svelte@4.1.1(prettier@3.9.4)(svelte@5.56.4(@typescript-eslint/types@8.61.1)): + dependencies: + prettier: 3.9.4 + svelte: 5.56.4(@typescript-eslint/types@8.61.1) + prettier@3.6.2: {} + prettier@3.9.4: {} + pretty-bytes@7.1.0: {} pretty-format@27.5.1: @@ -14712,13 +13274,6 @@ snapshots: range-parser@1.2.1: {} - raw-body@2.5.3: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - raw-body@3.0.2: dependencies: bytes: 3.1.2 @@ -14740,8 +13295,6 @@ snapshots: react-is@17.0.2: {} - react-refresh@0.17.0: {} - react-router@7.15.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: cookie: 1.1.1 @@ -14847,7 +13400,7 @@ snapshots: glob: 13.0.6 package-json-from-dist: 1.0.1 - rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): + rolldown@1.0.0-beta.45(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1): dependencies: '@oxc-project/types': 0.95.0 '@rolldown/pluginutils': 1.0.0-beta.45 @@ -14862,37 +13415,34 @@ snapshots: '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.45 '@rolldown/binding-linux-x64-musl': 1.0.0-beta.45 '@rolldown/binding-openharmony-arm64': 1.0.0-beta.45 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.45(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.45 '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.45 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.45 transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - optional: true - rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.1): + rolldown@1.1.3: dependencies: - '@oxc-project/types': 0.95.0 - '@rolldown/pluginutils': 1.0.0-beta.45 + '@oxc-project/types': 0.137.0 + '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.45 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.45 - '@rolldown/binding-darwin-x64': 1.0.0-beta.45 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.45 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.45 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.45 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.45 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.45 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.45 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.45 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.1) - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.45 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.45 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.45 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@rolldown/binding-android-arm64': 1.1.3 + '@rolldown/binding-darwin-arm64': 1.1.3 + '@rolldown/binding-darwin-x64': 1.1.3 + '@rolldown/binding-freebsd-x64': 1.1.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.3 + '@rolldown/binding-linux-arm64-gnu': 1.1.3 + '@rolldown/binding-linux-arm64-musl': 1.1.3 + '@rolldown/binding-linux-ppc64-gnu': 1.1.3 + '@rolldown/binding-linux-s390x-gnu': 1.1.3 + '@rolldown/binding-linux-x64-gnu': 1.1.3 + '@rolldown/binding-linux-x64-musl': 1.1.3 + '@rolldown/binding-openharmony-arm64': 1.1.3 + '@rolldown/binding-wasm32-wasi': 1.1.3 + '@rolldown/binding-win32-arm64-msvc': 1.1.3 + '@rolldown/binding-win32-x64-msvc': 1.1.3 rollup-plugin-dts@6.4.1(rollup@4.62.2)(typescript@5.9.3): dependencies: @@ -14905,14 +13455,14 @@ snapshots: optionalDependencies: '@babel/code-frame': 7.29.7 - rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.62.2): + rollup-plugin-visualizer@7.0.1(rolldown@1.1.3)(rollup@4.62.2): dependencies: open: 11.0.0 picomatch: 4.0.4 source-map: 0.7.6 yargs: 18.0.0 optionalDependencies: - rolldown: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + rolldown: 1.1.3 rollup: 4.62.2 rollup@4.62.2: @@ -14966,6 +13516,10 @@ snapshots: dependencies: queue-microtask: 1.2.3 + sade@1.8.1: + dependencies: + mri: 1.2.0 + safe-array-concat@1.1.4: dependencies: call-bind: 1.0.9 @@ -15013,24 +13567,6 @@ snapshots: semver@7.8.5: {} - send@0.19.2: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.1 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - send@1.2.1: dependencies: debug: 4.4.3 @@ -15059,15 +13595,6 @@ snapshots: dependencies: defu: 6.1.5 - serve-static@1.16.3: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.2 - transitivePeerDependencies: - - supports-color - serve-static@2.2.1: dependencies: encodeurl: 2.0.0 @@ -15079,6 +13606,8 @@ snapshots: set-cookie-parser@2.7.2: {} + set-cookie-parser@3.1.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -15344,10 +13873,12 @@ snapshots: structured-clone-es@2.0.0: {} - styled-jsx@5.1.6(react@19.2.3): + styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.2.3): dependencies: client-only: 0.0.1 react: 19.2.3 + optionalDependencies: + '@babel/core': 7.29.7 stylehacks@7.0.11(postcss@8.5.15): dependencies: @@ -15355,12 +13886,6 @@ snapshots: postcss: 8.5.15 postcss-selector-parser: 7.1.4 - stylehacks@8.0.1(postcss@8.5.15): - dependencies: - browserslist: 4.28.2 - postcss: 8.5.15 - postcss-selector-parser: 7.1.4 - stylis@4.2.0: {} superjson@2.2.6: @@ -15375,6 +13900,60 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svelte-check@4.7.1(picomatch@4.0.4)(svelte@5.56.4(@typescript-eslint/types@8.61.1))(typescript@5.9.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@sveltejs/load-config': 0.2.0 + chokidar: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.56.4(@typescript-eslint/types@8.61.1) + typescript: 5.9.3 + transitivePeerDependencies: + - picomatch + + svelte-check@4.7.1(picomatch@4.0.4)(svelte@5.56.4(@typescript-eslint/types@8.61.1))(typescript@6.0.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@sveltejs/load-config': 0.2.0 + chokidar: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.56.4(@typescript-eslint/types@8.61.1) + typescript: 6.0.3 + transitivePeerDependencies: + - picomatch + + svelte2tsx@0.7.57(svelte@5.56.4(@typescript-eslint/types@8.61.1))(typescript@5.9.3): + dependencies: + dedent-js: 1.0.1 + scule: 1.3.0 + svelte: 5.56.4(@typescript-eslint/types@8.61.1) + typescript: 5.9.3 + + svelte@5.56.4(@typescript-eslint/types@8.61.1): + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.10(acorn@8.17.0) + '@types/estree': 1.0.9 + '@types/trusted-types': 2.0.7 + acorn: 8.17.0 + aria-query: 5.3.1 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.8.1 + esm-env: 1.2.2 + esrap: 2.2.13(@typescript-eslint/types@8.61.1) + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.4 + transitivePeerDependencies: + - '@typescript-eslint/types' + svgo@4.0.1: dependencies: commander: 11.1.0 @@ -15502,11 +14081,6 @@ snapshots: dependencies: tagged-tag: 1.0.0 - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - type-is@2.1.0: dependencies: content-type: 2.0.0 @@ -15561,6 +14135,8 @@ snapshots: typescript@5.9.3: {} + typescript@6.0.3: {} + ufo@1.6.4: {} ultrahtml@1.6.0: {} @@ -15631,7 +14207,7 @@ snapshots: unicorn-magic@0.4.0: {} - unimport@6.3.0(oxc-parser@0.132.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)): + unimport@6.3.0(oxc-parser@0.132.0)(rolldown@1.1.3): dependencies: acorn: 8.17.0 escape-string-regexp: 5.0.0 @@ -15649,27 +14225,7 @@ snapshots: unplugin-utils: 0.3.1 optionalDependencies: oxc-parser: 0.132.0 - rolldown: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - - unimport@6.3.0(oxc-parser@0.133.0)(rolldown@1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)): - dependencies: - acorn: 8.17.0 - escape-string-regexp: 5.0.0 - estree-walker: 3.0.3 - local-pkg: 1.2.1 - magic-string: 0.30.21 - mlly: 1.8.2 - pathe: 2.0.3 - picomatch: 4.0.4 - pkg-types: 2.3.1 - scule: 1.3.0 - strip-literal: 3.1.0 - tinyglobby: 0.2.17 - unplugin: 3.0.0 - unplugin-utils: 0.3.1 - optionalDependencies: - oxc-parser: 0.133.0 - rolldown: 1.0.0-beta.45(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + rolldown: 1.1.3 unpipe@1.0.0: {} @@ -15721,11 +14277,6 @@ snapshots: picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 - unrouting@0.1.7: - dependencies: - escape-string-regexp: 5.0.0 - ufo: 1.6.4 - unrs-resolver@1.12.2: dependencies: napi-postinstall: 0.3.4 @@ -15808,29 +14359,27 @@ snapshots: util-deprecate@1.0.2: {} - utils-merge@1.0.1: {} - uuid@11.1.1: {} vary@1.1.2: {} - vite-dev-rpc@2.0.0(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): + vite-dev-rpc@2.0.0(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): dependencies: birpc: 4.0.0 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - vite-hot-client: 2.2.0(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite-hot-client: 2.2.0(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) - vite-hot-client@2.2.0(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): + vite-hot-client@2.2.0(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): dependencies: - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - vite-node@5.3.0(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0): + vite-node@5.3.0(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0): dependencies: cac: 6.7.14 es-module-lexer: 2.1.0 obug: 2.1.3 pathe: 2.0.3 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -15844,7 +14393,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.13.0(eslint@9.39.4(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): + vite-plugin-checker@0.13.0(eslint@9.39.4(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)): dependencies: '@babel/code-frame': 7.29.7 chokidar: 4.0.3 @@ -15854,29 +14403,14 @@ snapshots: proper-lockfile: 4.1.2 tiny-invariant: 1.3.3 tinyglobby: 0.2.17 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) vscode-uri: 3.1.0 optionalDependencies: eslint: 9.39.4(jiti@2.7.0) optionator: 0.9.4 typescript: 5.9.3 - vite-plugin-checker@0.14.4(eslint@9.39.4(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): - dependencies: - '@babel/code-frame': 7.29.7 - chokidar: 5.0.0 - npm-run-path: 6.0.0 - picocolors: 1.1.1 - picomatch: 4.0.4 - proper-lockfile: 4.1.2 - tiny-invariant: 1.3.3 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - optionalDependencies: - eslint: 9.39.4(jiti@2.7.0) - optionator: 0.9.4 - typescript: 5.9.3 - - vite-plugin-inspect@11.4.1(@nuxt/kit@3.21.7(magicast@0.5.3))(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): + vite-plugin-inspect@11.4.1(@nuxt/kit@3.21.7(magicast@0.5.3))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): dependencies: ansis: 4.3.1 error-stack-parser-es: 1.0.5 @@ -15886,12 +14420,12 @@ snapshots: perfect-debounce: 2.1.0 sirv: 3.0.2 unplugin-utils: 0.3.1 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - vite-dev-rpc: 2.0.0(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite-dev-rpc: 2.0.0(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) optionalDependencies: '@nuxt/kit': 3.21.7(magicast@0.5.3) - vite-plugin-inspect@11.4.1(@nuxt/kit@4.4.8(magicast@0.5.3))(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): + vite-plugin-inspect@11.4.1(@nuxt/kit@4.4.8(magicast@0.5.3))(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): dependencies: ansis: 4.3.1 error-stack-parser-es: 1.0.5 @@ -15901,32 +14435,32 @@ snapshots: perfect-debounce: 2.1.0 sirv: 3.0.2 unplugin-utils: 0.3.1 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - vite-dev-rpc: 2.0.0(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite-dev-rpc: 2.0.0(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) optionalDependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) - vite-plugin-vue-tracer@1.4.0(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3)): + vite-plugin-vue-tracer@1.4.0(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3)): dependencies: estree-walker: 3.0.3 exsolve: 1.0.8 magic-string: 0.30.21 pathe: 2.0.3 source-map-js: 1.2.1 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) vue: 3.5.30(typescript@5.9.3) - vite-plugin-vue-tracer@1.4.0(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)): + vite-plugin-vue-tracer@1.4.0(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)): dependencies: estree-walker: 3.0.3 exsolve: 1.0.8 magic-string: 0.30.21 pathe: 2.0.3 source-map-js: 1.2.1 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) vue: 3.5.38(typescript@5.9.3) - vite@6.4.3(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0): + vite@6.4.3(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.4) @@ -15938,10 +14472,11 @@ snapshots: '@types/node': 24.7.2 fsevents: 2.3.3 jiti: 2.7.0 + lightningcss: 1.32.0 terser: 5.48.0 yaml: 2.9.0 - vite@7.3.5(@types/node@22.15.3)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0): + vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) @@ -15949,31 +14484,51 @@ snapshots: postcss: 8.5.15 rollup: 4.62.2 tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 24.7.2 + fsevents: 2.3.3 + jiti: 2.7.0 + lightningcss: 1.32.0 + terser: 5.48.0 + yaml: 2.9.0 + + vite@8.1.0(@types/node@22.15.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.15 + rolldown: 1.1.3 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 22.15.3 + esbuild: 0.28.1 fsevents: 2.3.3 jiti: 2.7.0 terser: 5.48.0 yaml: 2.9.0 - vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0): + vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0): dependencies: - esbuild: 0.27.7 - fdir: 6.5.0(picomatch@4.0.4) + lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.15 - rollup: 4.62.2 + rolldown: 1.1.3 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.7.2 + esbuild: 0.28.1 fsevents: 2.3.3 jiti: 2.7.0 terser: 5.48.0 yaml: 2.9.0 - vitest-environment-nuxt@1.0.1(@playwright/test@1.60.0)(@types/node@24.7.2)(@vue/test-utils@2.4.6)(jiti@2.7.0)(jsdom@27.0.1)(magicast@0.5.3)(playwright-core@1.60.0)(terser@5.48.0)(typescript@5.9.3)(vitest@4.1.8)(yaml@2.9.0): + vitefu@1.1.3(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): + optionalDependencies: + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + + vitest-environment-nuxt@1.0.1(@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.32.0)(magicast@0.5.3)(playwright-core@1.60.0)(terser@5.48.0)(typescript@5.9.3)(vitest@4.1.8)(yaml@2.9.0): dependencies: - '@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)(magicast@0.5.3)(playwright-core@1.60.0)(terser@5.48.0)(typescript@5.9.3)(vitest@4.1.8)(yaml@2.9.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.32.0)(magicast@0.5.3)(playwright-core@1.60.0)(terser@5.48.0)(typescript@5.9.3)(vitest@4.1.8)(yaml@2.9.0) transitivePeerDependencies: - '@cucumber/cucumber' - '@jest/globals' @@ -15999,10 +14554,10 @@ snapshots: - vitest - yaml - vitest@4.1.8(@types/node@22.15.3)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@22.15.3)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): + vitest@4.1.8(@types/node@22.15.3)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@22.15.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.8 - '@vitest/mocker': 4.1.8(vite@7.3.5(@types/node@22.15.3)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@vitest/mocker': 4.1.8(vite@8.1.0(@types/node@22.15.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.8 '@vitest/runner': 4.1.8 '@vitest/snapshot': 4.1.8 @@ -16019,19 +14574,19 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 7.3.5(@types/node@22.15.3)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@22.15.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.15.3 - '@vitest/browser-playwright': 4.1.8(playwright@1.60.0)(vite@7.3.5(@types/node@22.15.3)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8) + '@vitest/browser-playwright': 4.1.8(playwright@1.60.0)(vite@8.1.0(@types/node@22.15.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8) jsdom: 27.0.1 transitivePeerDependencies: - msw - vitest@4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): + vitest@4.1.8(@types/node@24.7.2)(@vitest/browser-playwright@4.1.8)(jsdom@27.0.1)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.8 - '@vitest/mocker': 4.1.8(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@vitest/mocker': 4.1.8(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.8 '@vitest/runner': 4.1.8 '@vitest/snapshot': 4.1.8 @@ -16048,11 +14603,11 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.7.2 - '@vitest/browser-playwright': 4.1.8(playwright@1.60.0)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8) + '@vitest/browser-playwright': 4.1.8(playwright@1.60.0)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@4.1.8) jsdom: 27.0.1 transitivePeerDependencies: - msw @@ -16084,7 +14639,7 @@ snapshots: '@vue/devtools-api': 6.6.4 vue: 3.5.30(typescript@5.9.3) - vue-router@5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3)): + vue-router@5.1.0(@vue/compiler-sfc@3.5.38)(vite@8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.30(typescript@5.9.3)): dependencies: '@babel/generator': 8.0.0 '@vue-macros/common': 3.1.2(vue@3.5.30(typescript@5.9.3)) @@ -16106,31 +14661,7 @@ snapshots: yaml: 2.9.0 optionalDependencies: '@vue/compiler-sfc': 3.5.38 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - - vue-router@5.1.0(@vue/compiler-sfc@3.5.38)(vite@7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)): - dependencies: - '@babel/generator': 8.0.0 - '@vue-macros/common': 3.1.2(vue@3.5.38(typescript@5.9.3)) - '@vue/devtools-api': 8.1.3 - ast-walker-scope: 0.9.0 - chokidar: 5.0.0 - json5: 2.2.3 - local-pkg: 1.2.1 - magic-string: 0.30.21 - mlly: 1.8.2 - muggle-string: 0.4.1 - pathe: 2.0.3 - picomatch: 4.0.4 - scule: 1.3.0 - tinyglobby: 0.2.17 - unplugin: 3.0.0 - unplugin-utils: 0.3.1 - vue: 3.5.38(typescript@5.9.3) - yaml: 2.9.0 - optionalDependencies: - '@vue/compiler-sfc': 3.5.38 - vite: 7.3.5(@types/node@24.7.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.1.0(@types/node@24.7.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.38)(esbuild@0.28.1)(vue@3.5.30(typescript@5.9.3)): dependencies: @@ -16316,6 +14847,8 @@ snapshots: cookie-es: 3.1.1 youch-core: 0.3.3 + zimmerframe@1.1.4: {} + zip-stream@6.0.1: dependencies: archiver-utils: 5.0.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 97eb68b..df44214 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -46,8 +46,16 @@ catalog: rimraf: 6.1.3 rolldown: 1.0.0-beta.45 secure-random-bytes: 5.0.1 + svelte: 5.56.4 + '@sveltejs/kit': 2.68.0 + '@sveltejs/package': 2.5.8 + '@sveltejs/vite-plugin-svelte': 6.2.4 + svelte-check: 4.7.1 stream-browserify: 3.0.0 tslib: 2.8.1 typescript: 5.9.3 uuid: 11.1.1 vitest: 4.1.8 +onlyBuiltDependencies: + - '@tailwindcss/oxide' + - esbuild diff --git a/samples/sveltekit/quickstart/.env.example b/samples/sveltekit/quickstart/.env.example new file mode 100644 index 0000000..31a1a54 --- /dev/null +++ b/samples/sveltekit/quickstart/.env.example @@ -0,0 +1,4 @@ +THUNDERID_BASE_URL=https://localhost:8090 +THUNDERID_CLIENT_ID=your-client-id-here +THUNDERID_CLIENT_SECRET=your-client-secret-here +THUNDERID_SESSION_SECRET=your-session-secret-here diff --git a/samples/sveltekit/quickstart/.gitignore b/samples/sveltekit/quickstart/.gitignore new file mode 100644 index 0000000..3b462cb --- /dev/null +++ b/samples/sveltekit/quickstart/.gitignore @@ -0,0 +1,23 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/samples/sveltekit/quickstart/.npmrc b/samples/sveltekit/quickstart/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/samples/sveltekit/quickstart/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/samples/sveltekit/quickstart/.prettierignore b/samples/sveltekit/quickstart/.prettierignore new file mode 100644 index 0000000..7d74fe2 --- /dev/null +++ b/samples/sveltekit/quickstart/.prettierignore @@ -0,0 +1,9 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock +bun.lock +bun.lockb + +# Miscellaneous +/static/ diff --git a/samples/sveltekit/quickstart/.prettierrc b/samples/sveltekit/quickstart/.prettierrc new file mode 100644 index 0000000..3f7802c --- /dev/null +++ b/samples/sveltekit/quickstart/.prettierrc @@ -0,0 +1,15 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] +} diff --git a/samples/sveltekit/quickstart/.vscode/extensions.json b/samples/sveltekit/quickstart/.vscode/extensions.json new file mode 100644 index 0000000..38f928a --- /dev/null +++ b/samples/sveltekit/quickstart/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["svelte.svelte-vscode", "esbenp.prettier-vscode"] +} diff --git a/samples/sveltekit/quickstart/README.md b/samples/sveltekit/quickstart/README.md new file mode 100644 index 0000000..f70c857 --- /dev/null +++ b/samples/sveltekit/quickstart/README.md @@ -0,0 +1,51 @@ +# ThunderID SvelteKit Quickstart + +A minimal SvelteKit application demonstrating ThunderID authentication with OAuth 2.0, PKCE, and JWT support using the `@thunderid/sveltekit` SDK. + +## Prerequisites + +- Node.js 18+ +- pnpm +- A ThunderID application (see [Import ThunderID Resources](#import-thunderid-resources) below) + +## Import ThunderID Resources + +This sample ships with a `thunderid-config/` directory containing a declarative YAML file that creates the required user type and application in one step. + +1. Open `thunderid-config/thunderid.env` and set your preferred values: + ```bash + SVELTEKIT_QUICKSTART_CLIENT_ID=SVELTEKIT_QUICKSTART + SVELTEKIT_QUICKSTART_REDIRECT_URIS=["http://localhost:5173"] + ``` +2. Import via the ThunderID Console (https://localhost:8090/console): + - **First-time login**: a welcome screen appears with an **Open** button to upload the YAML file directly. + - **Later**: access the same welcome screen from the user profile menu in the top-right corner of the console. + +This creates the `Customer` user type and the `sveltekit-quickstart` application under the default organization unit. + +## Setup + +1. Copy the environment template: + ```sh + cp .env.example .env + ``` + +2. Fill in your ThunderID credentials in `.env`, using the values you set in `thunderid-config/thunderid.env`: + ``` + THUNDERID_BASE_URL=https://localhost:8090 + THUNDERID_CLIENT_ID=SVELTEKIT_QUICKSTART + THUNDERID_CLIENT_SECRET= + THUNDERID_SESSION_SECRET= + ``` + +3. Install dependencies and start the dev server: + ```sh + pnpm install + pnpm dev + ``` + +The app will be available at `http://localhost:5173`. + +## Docs + +Full SDK reference: [thunderid.dev/docs](https://thunderid.dev/docs) diff --git a/samples/sveltekit/quickstart/package.json b/samples/sveltekit/quickstart/package.json new file mode 100644 index 0000000..30b7987 --- /dev/null +++ b/samples/sveltekit/quickstart/package.json @@ -0,0 +1,30 @@ +{ + "name": "sveltekit-quickstart", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "lint": "prettier --check .", + "format": "prettier --write ." + }, + "dependencies": { + "@thunderid/sveltekit": "workspace:^" + }, + "devDependencies": { + "@sveltejs/adapter-auto": "^7.0.1", + "@sveltejs/kit": "^2.63.0", + "@sveltejs/vite-plugin-svelte": "^7.1.2", + "prettier": "^3.8.3", + "prettier-plugin-svelte": "^4.1.0", + "svelte": "^5.56.1", + "svelte-check": "^4.6.0", + "typescript": "^6.0.3", + "vite": "^8.0.16" + } +} diff --git a/samples/sveltekit/quickstart/src/app.d.ts b/samples/sveltekit/quickstart/src/app.d.ts new file mode 100644 index 0000000..516884d --- /dev/null +++ b/samples/sveltekit/quickstart/src/app.d.ts @@ -0,0 +1,11 @@ +import type {ThunderIDSSRData} from '@thunderid/sveltekit'; + +declare global { + namespace App { + interface Locals { + thunderid: ThunderIDSSRData; + } + } +} + +export {}; diff --git a/samples/sveltekit/quickstart/src/app.html b/samples/sveltekit/quickstart/src/app.html new file mode 100644 index 0000000..6a2bb58 --- /dev/null +++ b/samples/sveltekit/quickstart/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/samples/sveltekit/quickstart/src/hooks.server.ts b/samples/sveltekit/quickstart/src/hooks.server.ts new file mode 100644 index 0000000..a25df42 --- /dev/null +++ b/samples/sveltekit/quickstart/src/hooks.server.ts @@ -0,0 +1,14 @@ +import {THUNDERID_BASE_URL, THUNDERID_CLIENT_ID, THUNDERID_CLIENT_SECRET, THUNDERID_SESSION_SECRET} from '$env/static/private'; +import {createThunderIDHandle} from '@thunderid/sveltekit/server'; + +export const handle = createThunderIDHandle({ + baseUrl: THUNDERID_BASE_URL, + clientId: THUNDERID_CLIENT_ID, + clientSecret: THUNDERID_CLIENT_SECRET, + sessionSecret: THUNDERID_SESSION_SECRET, + afterSignInUrl: '/', + afterSignOutUrl: '/', + preferences: { + theme: {inheritFromBranding: false}, + }, +}); diff --git a/samples/sveltekit/quickstart/src/lib/AppShell.svelte b/samples/sveltekit/quickstart/src/lib/AppShell.svelte new file mode 100644 index 0000000..658f770 --- /dev/null +++ b/samples/sveltekit/quickstart/src/lib/AppShell.svelte @@ -0,0 +1,65 @@ + + + +
+ +{#if eventLog.length > 0} +
+ SDK Events ({eventLog.length}) +
+{#each eventLog as evt}{evt}
+{/each}
+
+
+{/if} + +{@render children()} diff --git a/samples/sveltekit/quickstart/src/lib/assets/favicon.svg b/samples/sveltekit/quickstart/src/lib/assets/favicon.svg new file mode 100644 index 0000000..cc5dc66 --- /dev/null +++ b/samples/sveltekit/quickstart/src/lib/assets/favicon.svg @@ -0,0 +1 @@ +svelte-logo \ No newline at end of file diff --git a/samples/sveltekit/quickstart/src/lib/index.ts b/samples/sveltekit/quickstart/src/lib/index.ts new file mode 100644 index 0000000..856f2b6 --- /dev/null +++ b/samples/sveltekit/quickstart/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/samples/sveltekit/quickstart/src/routes/+layout.server.ts b/samples/sveltekit/quickstart/src/routes/+layout.server.ts new file mode 100644 index 0000000..611031b --- /dev/null +++ b/samples/sveltekit/quickstart/src/routes/+layout.server.ts @@ -0,0 +1,6 @@ +import {loadThunderID} from '@thunderid/sveltekit/server'; +import type {LayoutServerLoad} from './$types'; + +export const load: LayoutServerLoad = (event) => { + return {thunderid: loadThunderID(event)}; +}; diff --git a/samples/sveltekit/quickstart/src/routes/+layout.svelte b/samples/sveltekit/quickstart/src/routes/+layout.svelte new file mode 100644 index 0000000..8d4006b --- /dev/null +++ b/samples/sveltekit/quickstart/src/routes/+layout.svelte @@ -0,0 +1,13 @@ + + + + + {@render children()} + + diff --git a/samples/sveltekit/quickstart/src/routes/+page.svelte b/samples/sveltekit/quickstart/src/routes/+page.svelte new file mode 100644 index 0000000..ad3a147 --- /dev/null +++ b/samples/sveltekit/quickstart/src/routes/+page.svelte @@ -0,0 +1,92 @@ + + +

ThunderID SDK Test App

+ + +

Initializing...

+
+ + +

Welcome!

+ + + + +
+ +

Actions

+ + + + + + + {#if accessToken} +
+

Access Token

+
{accessToken}
+ {/if} + + {#if idToken} +
+

ID Token (raw)

+
{idToken}
+ {/if} + + {#if userInfo} +
+

UserInfo

+
{JSON.stringify(userInfo, null, 2)}
+ {/if} + +
+

Raw user data

+
{JSON.stringify(tid.user, null, 2)}
+ +
+

Raw user profile

+
{JSON.stringify(tid.userProfile, null, 2)}
+ +
+

Configuration

+
{JSON.stringify({locale: tid.locale, isInitialized: tid.isInitialized, isSignedIn: tid.isSignedIn, resolvedBaseUrl: tid.resolvedBaseUrl, clientId: tid.clientId, scopes: tid.scopes}, null, 2)}
+
+ + +

You are not signed in.

+ + +
diff --git a/samples/sveltekit/quickstart/src/routes/api/auth/callback/+server.ts b/samples/sveltekit/quickstart/src/routes/api/auth/callback/+server.ts new file mode 100644 index 0000000..baeabb9 --- /dev/null +++ b/samples/sveltekit/quickstart/src/routes/api/auth/callback/+server.ts @@ -0,0 +1,10 @@ +import {THUNDERID_BASE_URL, THUNDERID_CLIENT_ID, THUNDERID_CLIENT_SECRET, THUNDERID_SESSION_SECRET} from '$env/static/private'; +import {createCallbackHandler} from '@thunderid/sveltekit/server'; + +export const GET = createCallbackHandler({ + baseUrl: THUNDERID_BASE_URL, + clientId: THUNDERID_CLIENT_ID, + clientSecret: THUNDERID_CLIENT_SECRET, + sessionSecret: THUNDERID_SESSION_SECRET, + afterSignInUrl: '/', +}); diff --git a/samples/sveltekit/quickstart/src/routes/api/auth/signin/+server.ts b/samples/sveltekit/quickstart/src/routes/api/auth/signin/+server.ts new file mode 100644 index 0000000..f4b16ce --- /dev/null +++ b/samples/sveltekit/quickstart/src/routes/api/auth/signin/+server.ts @@ -0,0 +1,10 @@ +import {THUNDERID_BASE_URL, THUNDERID_CLIENT_ID, THUNDERID_CLIENT_SECRET, THUNDERID_SESSION_SECRET} from '$env/static/private'; +import {createSignInHandler} from '@thunderid/sveltekit/server'; + +export const GET = createSignInHandler({ + baseUrl: THUNDERID_BASE_URL, + clientId: THUNDERID_CLIENT_ID, + clientSecret: THUNDERID_CLIENT_SECRET, + sessionSecret: THUNDERID_SESSION_SECRET, + afterSignInUrl: 'http://localhost:5173/api/auth/callback', +}); diff --git a/samples/sveltekit/quickstart/src/routes/api/auth/signout/+server.ts b/samples/sveltekit/quickstart/src/routes/api/auth/signout/+server.ts new file mode 100644 index 0000000..dd672fd --- /dev/null +++ b/samples/sveltekit/quickstart/src/routes/api/auth/signout/+server.ts @@ -0,0 +1,10 @@ +import {THUNDERID_BASE_URL, THUNDERID_CLIENT_ID, THUNDERID_CLIENT_SECRET, THUNDERID_SESSION_SECRET} from '$env/static/private'; +import {createSignOutHandler} from '@thunderid/sveltekit/server'; + +export const GET = createSignOutHandler({ + baseUrl: THUNDERID_BASE_URL, + clientId: THUNDERID_CLIENT_ID, + clientSecret: THUNDERID_CLIENT_SECRET, + sessionSecret: THUNDERID_SESSION_SECRET, + afterSignOutUrl: '/', +}); diff --git a/samples/sveltekit/quickstart/src/routes/callback/+page.svelte b/samples/sveltekit/quickstart/src/routes/callback/+page.svelte new file mode 100644 index 0000000..8a0b0ec --- /dev/null +++ b/samples/sveltekit/quickstart/src/routes/callback/+page.svelte @@ -0,0 +1,6 @@ + + +

Signing you in...

+ diff --git a/samples/sveltekit/quickstart/src/routes/protected/+page.server.ts b/samples/sveltekit/quickstart/src/routes/protected/+page.server.ts new file mode 100644 index 0000000..173f464 --- /dev/null +++ b/samples/sveltekit/quickstart/src/routes/protected/+page.server.ts @@ -0,0 +1,19 @@ +import {requireServerSession} from '@thunderid/sveltekit/server'; +import {redirect} from '@sveltejs/kit'; +import {isGuardRedirect} from '@thunderid/sveltekit/server'; +import type {PageServerLoad} from './$types'; + +export const load: PageServerLoad = (event) => { + try { + const ssrData = requireServerSession(event, '/api/auth/signin'); + return { + user: ssrData.user, + session: ssrData.session, + }; + } catch (e) { + if (isGuardRedirect(e)) { + throw redirect(e.status, e.location); + } + throw e; + } +}; diff --git a/samples/sveltekit/quickstart/src/routes/protected/+page.svelte b/samples/sveltekit/quickstart/src/routes/protected/+page.svelte new file mode 100644 index 0000000..df60d88 --- /dev/null +++ b/samples/sveltekit/quickstart/src/routes/protected/+page.svelte @@ -0,0 +1,29 @@ + + +

Protected Page

+ + + + +

Back to home

+ + +
+ +

SSR Session Data

+
{JSON.stringify({
+		session: {
+			sub: data.session?.sub,
+			scopes: data.session?.scopes,
+			exp: data.session?.exp ? new Date((data.session.exp as number) * 1000).toISOString() : null,
+			iat: data.session?.iat ? new Date((data.session.iat as number) * 1000).toISOString() : null,
+			sessionId: data.session?.sessionId,
+			accessToken: (data.session?.accessToken as string)?.slice(0, 30) + '...',
+		},
+		user: data.user,
+	}, null, 2)}
+
diff --git a/samples/sveltekit/quickstart/static/robots.txt b/samples/sveltekit/quickstart/static/robots.txt new file mode 100644 index 0000000..b6dd667 --- /dev/null +++ b/samples/sveltekit/quickstart/static/robots.txt @@ -0,0 +1,3 @@ +# allow crawling everything by default +User-agent: * +Disallow: diff --git a/samples/sveltekit/quickstart/thunderid-config/thunderid-config.yaml b/samples/sveltekit/quickstart/thunderid-config/thunderid-config.yaml new file mode 100644 index 0000000..7393fac --- /dev/null +++ b/samples/sveltekit/quickstart/thunderid-config/thunderid-config.yaml @@ -0,0 +1,128 @@ +# resource_type: user_type +id: 019e3a5c-04ea-7d18-8ae6-f828b1f3d60f +category: user +name: Customer +ouHandle: default +allowSelfRegistration: true +systemAttributes: + display: username +schema: { + "username": { + "type": "string", + "displayName": "Username", + "required": true, + "unique": true + }, + "password": { + "type": "string", + "displayName": "Password", + "required": false, + "credential": true + }, + "email": { + "type": "string", + "displayName": "Email", + "required": true, + "unique": true, + "regex": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$" + }, + "given_name": { + "type": "string", + "displayName": "First Name", + "required": false + }, + "family_name": { + "type": "string", + "displayName": "Last Name", + "required": false + }, + "name": { + "type": "string", + "displayName": "Full Name", + "required": false + }, + "mobile_number": { + "type": "string", + "displayName": "Mobile Number", + "required": false + } + } + +--- +# resource_type: application +id: 2971eb55-7673-4bd0-9ef8-2ed8b53e388f +ouHandle: default +name: sveltekit-quickstart +description: Sample SvelteKit application using the @thunderid/sveltekit SDK +url: http://localhost:5173 +logoUrl: emoji:๐ŸŸ  +authFlowHandle: default-basic-flow +isRegistrationFlowEnabled: true +isRecoveryFlowEnabled: false +assertion: + validityPeriod: 3600 +allowedUserTypes: + - Customer +inboundAuthConfig: + - type: oauth2 + config: + clientId: {{.SVELTEKIT_QUICKSTART_CLIENT_ID}} + redirectUris: + {{- range .SVELTEKIT_QUICKSTART_REDIRECT_URIS}} + - {{.}} + {{- end}} + grantTypes: + - authorization_code + responseTypes: + - code + tokenEndpointAuthMethod: client_secret_post + pkceRequired: true + publicClient: false + requirePushedAuthorizationRequests: false + token: + accessToken: + validityPeriod: 3600 + userAttributes: + - given_name + - family_name + - email + - groups + - name + idToken: + validityPeriod: 3600 + userAttributes: + - given_name + - family_name + - email + - groups + - name + responseType: JWT + userInfo: + responseType: JSON + userAttributes: + - given_name + - family_name + - email + - groups + - name + scopeClaims: + email: + - email + - email_verified + group: + - groups + phone: + - phone_number + - phone_number_verified + profile: + - name + - given_name + - family_name + - picture + +--- +# resource_type: server_config +name: cors +value: + allowedOrigins: + - "http://localhost:5173" diff --git a/samples/sveltekit/quickstart/thunderid-config/thunderid.env b/samples/sveltekit/quickstart/thunderid-config/thunderid.env new file mode 100644 index 0000000..b3cd029 --- /dev/null +++ b/samples/sveltekit/quickstart/thunderid-config/thunderid.env @@ -0,0 +1,2 @@ +SVELTEKIT_QUICKSTART_CLIENT_ID=SVELTEKIT_QUICKSTART +SVELTEKIT_QUICKSTART_REDIRECT_URIS=["http://localhost:5173"] diff --git a/samples/sveltekit/quickstart/tsconfig.json b/samples/sveltekit/quickstart/tsconfig.json new file mode 100644 index 0000000..2c2ed3c --- /dev/null +++ b/samples/sveltekit/quickstart/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "rewriteRelativeImportExtensions": true, + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // To make changes to top-level options such as include and exclude, we recommend extending + // the generated config; see https://svelte.dev/docs/kit/configuration#typescript +} diff --git a/samples/sveltekit/quickstart/vite.config.ts b/samples/sveltekit/quickstart/vite.config.ts new file mode 100644 index 0000000..cb76b81 --- /dev/null +++ b/samples/sveltekit/quickstart/vite.config.ts @@ -0,0 +1,20 @@ +import adapter from '@sveltejs/adapter-auto'; +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [ + sveltekit({ + compilerOptions: { + // Force runes mode for the project, except for libraries. Can be removed in svelte 6. + runes: ({ filename }) => + filename.split(/[/\\]/).includes('node_modules') ? undefined : true + }, + + // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. + // See https://svelte.dev/docs/kit/adapters for more information about adapters. + adapter: adapter() + }) + ] +});