From 93e96befc3d7f13383dea4ead02f4ea10a0cf1f9 Mon Sep 17 00:00:00 2001 From: Marsel Shaikhin Date: Thu, 8 Aug 2024 15:32:23 +0200 Subject: [PATCH 1/3] feat(#673, #811, #848): back-port authjs migration --- .../server/services/authjs/nuxtAuthHandler.ts | 318 ++++++++++-------- src/runtime/server/services/utils.ts | 35 +- src/runtime/types.ts | 1 + src/runtime/utils/checkSessionResult.ts | 2 +- 4 files changed, 200 insertions(+), 156 deletions(-) diff --git a/src/runtime/server/services/authjs/nuxtAuthHandler.ts b/src/runtime/server/services/authjs/nuxtAuthHandler.ts index 55690cf0..8da8c206 100644 --- a/src/runtime/server/services/authjs/nuxtAuthHandler.ts +++ b/src/runtime/server/services/authjs/nuxtAuthHandler.ts @@ -1,11 +1,11 @@ import type { IncomingHttpHeaders } from 'http' -import { getQuery, setCookie, readBody, sendRedirect, eventHandler, parseCookies, createError, isMethod, getHeaders, getResponseHeader, setResponseHeader } from 'h3' +import { getQuery, setCookie, readBody, sendRedirect, eventHandler, parseCookies, createError, isMethod, getHeaders, getResponseHeader, setResponseHeader, getRequestHost, getRequestProtocol } from 'h3' import type { H3Event } from 'h3' import type { CookieSerializeOptions } from 'cookie-es' import { AuthHandler } from 'next-auth/core' -import { getToken as nextGetToken } from 'next-auth/jwt' -import type { RequestInternal } from 'next-auth/core' +import { getToken as authjsGetToken } from 'next-auth/jwt' +import type { RequestInternal, ResponseInternal } from 'next-auth/core' import type { AuthAction, AuthOptions, Session } from 'next-auth' import type { GetTokenParams } from 'next-auth/jwt' @@ -13,57 +13,18 @@ import { defu } from 'defu' import { joinURL } from 'ufo' import { ERROR_MESSAGES } from '../errors' import { isNonEmptyObject } from '../../../utils/checkSessionResult' -import { getServerOrigin, getRequestURLFromRequest } from '../utils' +import { getServerOrigin } from '../utils' import { useTypedBackendConfig } from '../../../helpers' import { useRuntimeConfig } from '#imports' -let preparedAuthHandler: ReturnType | undefined +let preparedAuthjsHandler: ((req: RequestInternal) => Promise) | undefined let usedSecret: string | undefined -const SUPPORTED_ACTIONS: AuthAction[] = ['providers', 'session', 'csrf', 'signin', 'signout', 'callback', 'verify-request', 'error', '_log'] - -const useConfig = () => useTypedBackendConfig(useRuntimeConfig(), 'authjs') - -/** - * Parse a body if the request method is supported, return `undefined` otherwise. - -* @param event H3Event event to read body of - */ -const readBodyForNext = async (event: H3Event) => { - let body: any - - if (isMethod(event, ['PATCH', 'POST', 'PUT', 'DELETE'])) { - body = await readBody(event) - } - return body -} - -/** - * Get action and optional provider from a request. - * - * E.g., with a request like `/api/signin/github` get the action `signin` with the provider `github` - */ -const parseActionAndProvider = ({ context }: H3Event): { action: AuthAction, providerId: string | undefined } => { - const params: string[] | undefined = context.params?._?.split('/') - - if (!params || ![1, 2].includes(params.length)) { - throw createError({ statusCode: 400, statusMessage: `Invalid path used for auth-endpoint. Supply either one path parameter (e.g., \`/api/auth/session\`) or two (e.g., \`/api/auth/signin/github\` after the base path (in previous examples base path was: \`/api/auth/\`. Received \`${params}\`` }) - } - - const [unvalidatedAction, providerId] = params - - // Get TS to correctly infer the type of `unvalidatedAction` - const action = SUPPORTED_ACTIONS.find(action => action === unvalidatedAction) - if (!action) { - throw createError({ statusCode: 400, statusMessage: `Called endpoint with unsupported action ${unvalidatedAction}. Only the following actions are supported: ${SUPPORTED_ACTIONS.join(', ')}` }) - } - - return { action, providerId } -} /** Setup the nuxt (next) auth event handler, based on the passed in options */ -export const NuxtAuthHandler = (nuxtAuthOptions?: AuthOptions) => { +export function NuxtAuthHandler (nuxtAuthOptions?: AuthOptions) { const isProduction = process.env.NODE_ENV === 'production' + const trustHostUserPreference = useTypedBackendConfig(useRuntimeConfig(), 'authjs').trustHost usedSecret = nuxtAuthOptions?.secret if (!usedSecret) { @@ -79,73 +40,33 @@ export const NuxtAuthHandler = (nuxtAuthOptions?: AuthOptions) => { secret: usedSecret, logger: undefined, providers: [], - trustHost: useConfig().trustHost - }) - /** - * Generate a NextAuth.js internal request object that we can pass into the NextAuth.js - * handler. This method will either try to fill all fields for a request that targets - * the auth-REST API or return a minimal internal request to support server-side - * session fetching for requests with arbitrary, non auth-REST API - * targets (set via: `event.context.checkSessionOnNonAuthRequest = true`) - * - * @param event H3Event event to transform into `RequestInternal` - */ - const getInternalNextAuthRequestData = async (event: H3Event): Promise => { - const nextRequest: Omit = { - host: getRequestURLFromRequest(event, { trustHost: useConfig().trustHost }), - body: undefined, - cookies: parseCookies(event), - query: undefined, - headers: getHeaders(event), - method: event.method, - providerId: undefined, - error: undefined - } - - // Setting `event.context.checkSessionOnNonAuthRequest = true` allows callers of `authHandler`. - // We can use this to check session status on the server-side. - // - // When doing this, most other data is not required, e.g., we do not need to parse the body. For this reason, - // we return the minimum required data for session checking. - if (event.context.checkSessionOnNonAuthRequest === true) { - return { - ...nextRequest, - method: 'GET', - action: 'session' - } - } + // SAFETY: We trust host here because `getRequestURLFromH3Event` is responsible for producing a trusted URL + trustHost: true, - // Figure out what action, providerId (optional) and error (optional) of the NextAuth.js lib is targeted - const query = getQuery(event) - const { action, providerId } = parseActionAndProvider(event) - const error = query.error - if (Array.isArray(error)) { - throw createError({ statusCode: 400, statusMessage: 'Error query parameter can only appear once' }) - } + // AuthJS uses `/auth` as default, but we rely on `/api/auth` (same as in previous `next-auth`) + basePath: '/api/auth' - const body = await readBodyForNext(event) + // Uncomment to enable framework-author specific functionality + // raw: raw as typeof raw + }) - return { - ...nextRequest, - body, - query, - action, - providerId, - error: error ? String(error) : undefined - } + // Save handler so that it can be used in other places + if (preparedAuthjsHandler) { + console.error('You setup the auth handler for a second time - this is likely undesired. Make sure that you only call `NuxtAuthHandler( ... )` once') } - const handler = eventHandler(async (event: H3Event) => { + preparedAuthjsHandler = (req: RequestInternal) => AuthHandler({ req, options }) + + return eventHandler(async (event: H3Event) => { const { res } = event.node - // 1. Assemble and perform request to the NextAuth.js auth handler - const nextRequest = await getInternalNextAuthRequestData(event) + // 1.1. Assemble and perform request to the NextAuth.js auth handler + const nextRequest = await createRequestForAuthjs(event, trustHostUserPreference) - const nextResult = await AuthHandler({ - req: nextRequest, - options - }) + // 1.2. Call Authjs + // Safety: `preparedAuthjsHandler` was assigned earlier and never re-assigned + const nextResult = await preparedAuthjsHandler!(nextRequest) // 2. Set response status, headers, cookies if (nextResult.status) { @@ -155,7 +76,7 @@ export const NuxtAuthHandler = (nuxtAuthOptions?: AuthOptions) => { nextResult.headers?.forEach(header => appendHeaderDeduped(event, header.key, header.value)) // 3. Return either: - // 3.1 the body directly if no redirect is set: + // 3.1. the body directly if no redirect is set: if (!nextResult.redirect) { return nextResult.body } @@ -175,37 +96,52 @@ export const NuxtAuthHandler = (nuxtAuthOptions?: AuthOptions) => { // 3.3 via a redirect: return await sendRedirect(event, nextResult.redirect) }) - - // Save handler so that it can be used in other places - if (preparedAuthHandler) { - console.warn('You setup the auth handler for a second time - this is likely undesired. Make sure that you only call `NuxtAuthHandler( ... )` once') - } - preparedAuthHandler = handler - return handler } -export const getServerSession = async (event: H3Event) => { - const authBasePath = useRuntimeConfig().public.auth.computed.pathname +/** Gets session on server-side */ +export async function getServerSession (event: H3Event) { + const runtimeConfig = useRuntimeConfig() + const authBasePath = runtimeConfig.public.auth.computed.pathname + const trustHostUserPreference = useTypedBackendConfig(runtimeConfig, 'authjs').trustHost // avoid running auth middleware on auth middleware (see #186) if (event.path && event.path.startsWith(authBasePath)) { return null } - if (!preparedAuthHandler) { - const headers = getHeaders(event) as HeadersInit - // Edge-case: If no auth-endpoint was called yet, `preparedAuthHandler`-initialization was also not attempted as Nuxt lazily loads endpoints in production-mode. This call gives it a chance to load + initialize the variable. If it fails we still throw. This edge-case has happened to user matijao#7025 on discord. - await $fetch(joinURL(authBasePath, '/session'), { headers }).catch(error => error.data) - if (!preparedAuthHandler) { + const sessionUrlPath = joinURL(authBasePath, '/session') + const headers = getHeaders(event) as HeadersInit + if (!preparedAuthjsHandler) { + // Edge-case: If no auth-endpoint was called yet, `preparedAuthHandler`-initialization was also not attempted as Nuxt lazily loads endpoints in production-mode. + // This call gives it a chance to load + initialize the variable. If it fails we still throw. This edge-case has happened to user matijao#7025 on discord. + await $fetch(sessionUrlPath, { headers }).catch(error => error.data) + if (!preparedAuthjsHandler) { throw createError({ statusCode: 500, statusMessage: 'Tried to get server session without setting up an endpoint to handle authentication (see https://github.com/sidebase/nuxt-auth#quick-start)' }) } } - // Run a session check on the event with an arbitrary target endpoint - event.context.checkSessionOnNonAuthRequest = true - const session = await preparedAuthHandler(event) - delete event.context.checkSessionOnNonAuthRequest + // Build a correct endpoint + const sessionUrlBase = getRequestBaseFromH3Event(event, trustHostUserPreference) + const sessionUrl = new URL(sessionUrlPath, sessionUrlBase) + // Create a virtual Request to check the session + const authjsRequest: RequestInternal = { + action: 'session', + method: 'GET', + headers, + body: undefined, + cookies: parseCookies(event), + providerId: undefined, + error: undefined, + host: sessionUrl.origin, + query: Object.fromEntries(sessionUrl.searchParams) + } + + // Invoke Auth.js + const authjsResponse = await preparedAuthjsHandler(authjsRequest) + + // Get the body of response + const session = authjsResponse.body if (isNonEmptyObject(session)) { return session as Session } @@ -216,21 +152,133 @@ export const getServerSession = async (event: H3Event) => { /** * Get the decoded JWT token either from cookies or header (both are attempted). * - * The only change from the original `getToken` implementation is that the `req` is not passed in, in favor of `event` being passed in. See https://next-auth.js.org/tutorials/securing-pages-and-api-routes#using-gettoken for further documentation. + * The only change from the original `getToken` implementation is that the `req` is not passed in, in favor of `event` being passed in. + * See https://next-auth.js.org/tutorials/securing-pages-and-api-routes#using-gettoken for further documentation. + * + * @param eventAndOptions The event to get the cookie or authorization header from that contains the JWT Token and options you want to alter token getting behavior. + */ +export function getToken ({ event, secureCookie, secret, ...rest }: Omit, 'req'> & { event: H3Event }) { + return authjsGetToken({ + // @ts-expect-error As our request is not a real next-auth request, we pass down only what's required for the method, as per code from https://github.com/nextauthjs/next-auth/blob/8387c78e3fef13350d8a8c6102caeeb05c70a650/packages/next-auth/src/jwt/index.ts#L68 + req: { + cookies: parseCookies(event), + headers: getHeaders(event) as IncomingHttpHeaders + }, + // see https://github.com/nextauthjs/next-auth/blob/8387c78e3fef13350d8a8c6102caeeb05c70a650/packages/next-auth/src/jwt/index.ts#L73 + secureCookie: secureCookie ?? getServerOrigin(event).startsWith('https://'), + secret: secret || usedSecret, + ...rest + }) +} + +/** + * Generate an Auth.js request object that can be passed into the handler. + * This method should only be used for authentication endpoints. * - * @param eventAndOptions Omit & { event: H3Event } The event to get the cookie or authorization header from that contains the JWT Token and options you want to alter token getting behavior. + * @param event H3Event to transform into `RequestInternal` */ -export const getToken = ({ event, secureCookie, secret, ...rest }: Omit, 'req'> & { event: H3Event }) => nextGetToken({ - // @ts-expect-error As our request is not a real next-auth request, we pass down only what's required for the method, as per code from https://github.com/nextauthjs/next-auth/blob/8387c78e3fef13350d8a8c6102caeeb05c70a650/packages/next-auth/src/jwt/index.ts#L68 - req: { +async function createRequestForAuthjs (event: H3Event, trustHostUserPreference: boolean): Promise { + const nextRequest: Omit = { + host: getRequestURLFromH3Event(event, trustHostUserPreference).origin, + body: undefined, cookies: parseCookies(event), - headers: getHeaders(event) as IncomingHttpHeaders - }, - // see https://github.com/nextauthjs/next-auth/blob/8387c78e3fef13350d8a8c6102caeeb05c70a650/packages/next-auth/src/jwt/index.ts#L73 - secureCookie: secureCookie ?? getServerOrigin(event).startsWith('https://'), - secret: secret || usedSecret, - ...rest -}) + query: undefined, + headers: getHeaders(event), + method: event.method, + providerId: undefined, + error: undefined + } + + // Figure out what action, providerId (optional) and error (optional) of the NextAuth.js lib is targeted + const query = getQuery(event) + const { action, providerId } = parseActionAndProvider(event) + const error = query.error + if (Array.isArray(error)) { + throw createError({ statusCode: 400, statusMessage: 'Error query parameter can only appear once' }) + } + + // Parse a body if the request method is supported, use `undefined` otherwise + const body = isMethod(event, ['PATCH', 'POST', 'PUT', 'DELETE']) + ? await readBody(event) + : undefined + + return { + ...nextRequest, + body, + query, + action, + providerId, + error: error ? String(error) : undefined + } +} + +/** + * Get the request url or construct it. + * Adapted from `h3` to also account for server origin. + * + * ## WARNING + * Please ensure that any URL produced by this function has a trusted host! + * + * @param trustHost Whether the host can be trusted. If `true`, base will be inferred from the request, otherwise the configured origin will be used. + * @throws {Error} When server origin was incorrectly configured or when URL building failed + */ +function getRequestURLFromH3Event (event: H3Event, trustHost: boolean): URL { + const path = (event.node.req.originalUrl || event.path).replace( + /^[/\\]+/g, + '/' + ) + const base = getRequestBaseFromH3Event(event, trustHost) + return new URL(path, base) +} + +/** + * Gets the request base in the form of origin. + * + * ## WARNING + * Please ensure that any URL produced by this function has a trusted host! + * + * @param trustHost Whether the host can be trusted. If `true`, base will be inferred from the request, otherwise the configured origin will be used. + * @throws {Error} When server origin was incorrectly configured + */ +function getRequestBaseFromH3Event (event: H3Event, trustHost: boolean): string { + if (trustHost) { + const host = getRequestHost(event, { xForwardedHost: trustHost }) + const protocol = getRequestProtocol(event) + + return `${protocol}://${host}` + } else { + // This may throw, we don't catch it + const origin = getServerOrigin(event) + + return origin + } +} + +/** Actions supported by auth handler */ +const SUPPORTED_ACTIONS: AuthAction[] = ['providers', 'session', 'csrf', 'signin', 'signout', 'callback', 'verify-request', 'error', '_log'] + +/** + * Get action and optional provider from a request. + * + * E.g. with a request like `/api/signin/github` get the action `signin` with the provider `github` + */ +function parseActionAndProvider ({ context }: H3Event): { action: AuthAction; providerId: string | undefined} { + const params: string[] | undefined = context.params?._?.split('/') + + if (!params || ![1, 2].includes(params.length)) { + throw createError({ statusCode: 400, statusMessage: `Invalid path used for auth-endpoint. Supply either one path parameter (e.g., \`/api/auth/session\`) or two (e.g., \`/api/auth/signin/github\` after the base path (in previous examples base path was: \`/api/auth/\`. Received \`${params}\`` }) + } + + const [unvalidatedAction, providerId] = params + + // Get TS to correctly infer the type of `unvalidatedAction` + const action = SUPPORTED_ACTIONS.find(action => action === unvalidatedAction) + if (!action) { + throw createError({ statusCode: 400, statusMessage: `Called endpoint with unsupported action ${unvalidatedAction}. Only the following actions are supported: ${SUPPORTED_ACTIONS.join(', ')}` }) + } + + return { action, providerId } +} /** Adapted from `h3` to fix https://github.com/sidebase/nuxt-auth/issues/523 */ function appendHeaderDeduped (event: H3Event, name: string, value: string) { diff --git a/src/runtime/server/services/utils.ts b/src/runtime/server/services/utils.ts index 17a34bfe..ce9ca768 100644 --- a/src/runtime/server/services/utils.ts +++ b/src/runtime/server/services/utils.ts @@ -1,6 +1,5 @@ import { H3Event } from 'h3' import getURL from 'requrl' -import { joinURL } from 'ufo' import { camelCase } from 'scule' import { isProduction } from '../../helpers' import { ERROR_MESSAGES } from './errors' @@ -9,13 +8,13 @@ import { useRuntimeConfig } from '#imports' /** * Get `origin` and fallback to `x-forwarded-host` or `host` headers if not in production. */ -export const getServerOrigin = (event?: H3Event): string => { +export function getServerOrigin (event?: H3Event): string { const config = useRuntimeConfig() // Prio 1: Environment variable - const envOriginKey = config.public.auth.originEnvKey! - const envOriginKeyCamelcase = camelCase(envOriginKey, { normalize: true }) - const envOrigin = (config[envOriginKeyCamelcase] ?? process.env[envOriginKey]) as string | undefined + const envOriginKey = config.public.auth.originEnvKey + const envFromRuntimeConfig = extractFromRuntimeConfig(config, envOriginKey) + const envOrigin = envFromRuntimeConfig ?? process.env[envOriginKey] if (envOrigin) { return envOrigin } @@ -34,20 +33,16 @@ export const getServerOrigin = (event?: H3Event): string => { throw new Error(ERROR_MESSAGES.NO_ORIGIN) } -/** Get the request url or construct it */ -export const getRequestURLFromRequest = (event: H3Event, { trustHost }: { trustHost: boolean }): string | undefined => { - if (trustHost) { - const forwardedValue = getURL(event.node.req) - if (forwardedValue) { - return Array.isArray(forwardedValue) ? forwardedValue[0] : forwardedValue - } - } +type RuntimeConfig = ReturnType - let origin - try { - origin = getServerOrigin(event) - } catch (error) { - return undefined - } - return joinURL(origin, useRuntimeConfig().public.auth.computed.pathname) +function extractFromRuntimeConfig (config: RuntimeConfig, envVariableName: string): string | undefined { + let normalized = envVariableName.startsWith('NUXT_') + ? envVariableName.slice(5) + : envVariableName + normalized = camelCase(normalized, { normalize: true }) + + const extracted = config[normalized] + return typeof extracted === 'string' + ? extracted + : undefined } diff --git a/src/runtime/types.ts b/src/runtime/types.ts index 29dc73e8..ff1f2272 100644 --- a/src/runtime/types.ts +++ b/src/runtime/types.ts @@ -573,6 +573,7 @@ export interface ModuleOptionsNormalized extends ModuleOptions { provider: Required> sessionRefresh: NonNullable globalAppMiddleware: NonNullable + originEnvKey: string computed: { origin: string | undefined diff --git a/src/runtime/utils/checkSessionResult.ts b/src/runtime/utils/checkSessionResult.ts index 74d654cb..6677b41f 100644 --- a/src/runtime/utils/checkSessionResult.ts +++ b/src/runtime/utils/checkSessionResult.ts @@ -1 +1 @@ -export const isNonEmptyObject = (obj: any) => typeof obj === 'object' && Object.keys(obj).length > 0 +export const isNonEmptyObject = (obj: any) => typeof obj === 'object' && obj !== null && Object.keys(obj).length > 0 From 73a941e0c56637c54e918657943e047f6e2f1657 Mon Sep 17 00:00:00 2001 From: Marsel Shaikhin Date: Thu, 15 Aug 2024 13:09:32 +0200 Subject: [PATCH 2/3] chore: update some deps --- playground-local/package.json | 6 +- playground-refresh/package.json | 4 +- pnpm-lock.yaml | 306 +++++++++++++++++++++++--------- 3 files changed, 231 insertions(+), 85 deletions(-) diff --git a/playground-local/package.json b/playground-local/package.json index c25c44e0..b3209bab 100644 --- a/playground-local/package.json +++ b/playground-local/package.json @@ -16,10 +16,10 @@ "zod": "^3.23.8" }, "devDependencies": { - "@nuxt/test-utils": "^3.14.0", - "@playwright/test": "^1.45.3", + "@nuxt/test-utils": "^3.14.1", + "@playwright/test": "^1.46.0", "@types/jsonwebtoken": "^9.0.6", - "@types/node": "^18.19.42", + "@types/node": "^18.19.44", "@vue/test-utils": "^2.4.6", "eslint": "^8.57.0", "nuxt": "^3.12.4", diff --git a/playground-refresh/package.json b/playground-refresh/package.json index f7beb7fd..043868b7 100644 --- a/playground-refresh/package.json +++ b/playground-refresh/package.json @@ -16,8 +16,8 @@ "zod": "^3.23.8" }, "devDependencies": { - "@nuxt/test-utils": "^3.14.0", - "@playwright/test": "^1.45.3", + "@nuxt/test-utils": "^3.14.1", + "@playwright/test": "^1.46.0", "@types/jsonwebtoken": "^9.0.6", "@vue/test-utils": "^2.4.6", "eslint": "^8.57.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 607b421a..2e0ffeee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -95,17 +95,17 @@ importers: version: 3.23.8 devDependencies: '@nuxt/test-utils': - specifier: ^3.14.0 - version: 3.14.0(@playwright/test@1.45.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.45.3)(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3))(vitest@1.6.0(@types/node@18.19.42)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)) + specifier: ^3.14.1 + version: 3.14.1(@playwright/test@1.46.0)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.46.0)(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))(vitest@1.6.0(@types/node@18.19.44)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)) '@playwright/test': - specifier: ^1.45.3 - version: 1.45.3 + specifier: ^1.46.0 + version: 1.46.0 '@types/jsonwebtoken': specifier: ^9.0.6 version: 9.0.6 '@types/node': - specifier: ^18.19.42 - version: 18.19.42 + specifier: ^18.19.44 + version: 18.19.44 '@vue/test-utils': specifier: ^2.4.6 version: 2.4.6 @@ -114,13 +114,13 @@ importers: version: 8.57.0 nuxt: specifier: ^3.12.4 - version: 3.12.4(@parcel/watcher@2.4.1)(@types/node@18.19.42)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.19.2)(terser@5.30.3)(typescript@5.5.4)(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3))(vue-tsc@2.0.29(typescript@5.5.4)) + version: 3.12.4(@parcel/watcher@2.4.1)(@types/node@18.19.44)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.19.2)(terser@5.30.3)(typescript@5.5.4)(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))(vue-tsc@2.0.29(typescript@5.5.4)) typescript: specifier: ^5.5.4 version: 5.5.4 vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@18.19.42)(terser@5.30.3) + version: 1.6.0(@types/node@18.19.44)(terser@5.30.3) vue-tsc: specifier: ^2.0.29 version: 2.0.29(typescript@5.5.4) @@ -135,11 +135,11 @@ importers: version: 3.23.8 devDependencies: '@nuxt/test-utils': - specifier: ^3.14.0 - version: 3.14.0(@playwright/test@1.45.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.45.3)(rollup@4.19.2)(vite@5.3.5(@types/node@20.12.7)(terser@5.30.3))(vitest@1.6.0(@types/node@20.12.7)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)) + specifier: ^3.14.1 + version: 3.14.1(@playwright/test@1.46.0)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.46.0)(rollup@4.19.2)(vite@5.3.5(@types/node@20.12.7)(terser@5.30.3))(vitest@1.6.0(@types/node@20.12.7)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)) '@playwright/test': - specifier: ^1.45.3 - version: 1.45.3 + specifier: ^1.46.0 + version: 1.46.0 '@types/jsonwebtoken': specifier: ^9.0.6 version: 9.0.6 @@ -1279,8 +1279,8 @@ packages: resolution: {integrity: sha512-KH6wxzsNys69daSO0xUv0LEBAfhwwjK1M+0Cdi1/vxmifCslMIY7lN11B4eywSfscbyVPAYJvANyc7XiVPImBQ==} hasBin: true - '@nuxt/test-utils@3.14.0': - resolution: {integrity: sha512-8HJOvGChQ70s6RKduKlrNABJXizNCLodBRbgepa4RYA3QFv2KrTxLvlHlhEUwd9r2E55LcQacv9P7Er47Z2GaA==} + '@nuxt/test-utils@3.14.1': + resolution: {integrity: sha512-D8F18hnOHQSarKnzsLORRXzFPlI9Y5fcQFRKwJgGhnejlIRX6sFvVnyl2SDgCvoV+F2x2czQsdGkwg51iWAshA==} engines: {node: '>=18.20.4'} peerDependencies: '@cucumber/cucumber': ^10.3.1 @@ -1428,8 +1428,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.45.3': - resolution: {integrity: sha512-UKF4XsBfy+u3MFWEH44hva1Q8Da28G6RFtR2+5saw+jgAFQV5yYnB1fu68Mz7fO+5GJF3wgwAIs0UelU8TxFrA==} + '@playwright/test@1.46.0': + resolution: {integrity: sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w==} engines: {node: '>=18'} hasBin: true @@ -1740,6 +1740,9 @@ packages: '@types/node@18.19.42': resolution: {integrity: sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==} + '@types/node@18.19.44': + resolution: {integrity: sha512-ZsbGerYg72WMXUIE9fYxtvfzLEuq6q8mKERdWFnqTmOvudMxnz+CBNRoOwJ2kNpFOncrKjT1hZwxjlFgQ9qvQA==} + '@types/node@20.12.7': resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} @@ -2332,6 +2335,9 @@ packages: caniuse-lite@1.0.30001646: resolution: {integrity: sha512-dRg00gudiBDDTmUhClSdv3hqRfpbOnU28IpI1T6PBTLWa+kOj0681C8uML3PifYfREuBrVjDGhL3adYpBT6spw==} + caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} @@ -4233,13 +4239,13 @@ packages: pkg-types@1.1.3: resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} - playwright-core@1.45.3: - resolution: {integrity: sha512-+ym0jNbcjikaOwwSZycFbwkWgfruWvYlJfThKYAlImbxUgdWFO2oW70ojPm4OpE4t6TAo2FY/smM+hpVTtkhDA==} + playwright-core@1.46.0: + resolution: {integrity: sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A==} engines: {node: '>=18'} hasBin: true - playwright@1.45.3: - resolution: {integrity: sha512-QhVaS+lpluxCaioejDZ95l4Y4jSFCsBvl2UZkpeXlzxmqS+aABr5c82YmfMHrL6x27nvrvykJAFpkzT2eWdJww==} + playwright@1.46.0: + resolution: {integrity: sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw==} engines: {node: '>=18'} hasBin: true @@ -5302,6 +5308,10 @@ packages: resolution: {integrity: sha512-KeczzHl2sATPQUx1gzo+EnUkmN4VmGBYRRVOZSGvGITE9rGHRDGqft6ONceP3vgXcyJ2XjX5axG5jMWUwNCYLw==} engines: {node: '>=14.0.0'} + unplugin@1.12.1: + resolution: {integrity: sha512-aXEH9c5qi3uYZHo0niUtxDlT9ylG/luMW/dZslSCkbtC31wCyFkmM0kyoBBh+Grhn7CL+/kvKLfN61/EdxPxMQ==} + engines: {node: '>=14.0.0'} + unstorage@1.10.2: resolution: {integrity: sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ==} peerDependencies: @@ -6702,12 +6712,12 @@ snapshots: - rollup - supports-color - '@nuxt/devtools-kit@1.3.9(magicast@0.3.4)(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3))': + '@nuxt/devtools-kit@1.3.9(magicast@0.3.4)(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))': dependencies: '@nuxt/kit': 3.12.4(magicast@0.3.4)(rollup@4.19.2) '@nuxt/schema': 3.12.4(rollup@4.19.2) execa: 7.2.0 - vite: 5.3.5(@types/node@18.19.42)(terser@5.30.3) + vite: 5.3.5(@types/node@18.19.44)(terser@5.30.3) transitivePeerDependencies: - magicast - rollup @@ -6783,13 +6793,13 @@ snapshots: - supports-color - utf-8-validate - '@nuxt/devtools@1.3.9(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3))': + '@nuxt/devtools@1.3.9(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))': dependencies: '@antfu/utils': 0.7.10 - '@nuxt/devtools-kit': 1.3.9(magicast@0.3.4)(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3)) + '@nuxt/devtools-kit': 1.3.9(magicast@0.3.4)(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3)) '@nuxt/devtools-wizard': 1.3.9 '@nuxt/kit': 3.12.4(magicast@0.3.4)(rollup@4.19.2) - '@vue/devtools-core': 7.3.3(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3)) + '@vue/devtools-core': 7.3.3(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3)) '@vue/devtools-kit': 7.3.3 birpc: 0.2.17 consola: 3.2.3 @@ -6818,9 +6828,9 @@ snapshots: simple-git: 3.25.0 sirv: 2.0.4 unimport: 3.9.1(rollup@4.19.2) - vite: 5.3.5(@types/node@18.19.42)(terser@5.30.3) - vite-plugin-inspect: 0.8.5(@nuxt/kit@3.12.4(magicast@0.3.4)(rollup@4.19.2))(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3)) - vite-plugin-vue-inspector: 5.1.3(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3)) + vite: 5.3.5(@types/node@18.19.44)(terser@5.30.3) + vite-plugin-inspect: 0.8.5(@nuxt/kit@3.12.4(magicast@0.3.4)(rollup@4.19.2))(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3)) + vite-plugin-vue-inspector: 5.1.3(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3)) which: 3.0.1 ws: 8.18.0 transitivePeerDependencies: @@ -6958,7 +6968,7 @@ snapshots: - rollup - supports-color - '@nuxt/test-utils@3.14.0(@playwright/test@1.45.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.45.3)(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3))(vitest@1.6.0(@types/node@18.19.42)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4))': + '@nuxt/test-utils@3.14.1(@playwright/test@1.46.0)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.46.0)(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))(vitest@1.6.0(@types/node@18.19.44)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4))': dependencies: '@nuxt/kit': 3.12.4(magicast@0.3.4)(rollup@4.19.2) '@nuxt/schema': 3.12.4(rollup@4.19.2) @@ -6972,7 +6982,7 @@ snapshots: get-port-please: 3.1.2 h3: 1.12.0 local-pkg: 0.5.0 - magic-string: 0.30.10 + magic-string: 0.30.11 nitropack: 2.9.7(encoding@0.1.13)(magicast@0.3.4) node-fetch-native: 1.6.4 ofetch: 1.3.4 @@ -6983,22 +6993,22 @@ snapshots: std-env: 3.7.0 ufo: 1.5.4 unenv: 1.10.0 - unplugin: 1.12.0 - vite: 5.3.5(@types/node@18.19.42)(terser@5.30.3) - vitest-environment-nuxt: 1.0.0(@playwright/test@1.45.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.45.3)(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3))(vitest@1.6.0(@types/node@18.19.42)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)) + unplugin: 1.12.1 + vite: 5.3.5(@types/node@18.19.44)(terser@5.30.3) + vitest-environment-nuxt: 1.0.0(@playwright/test@1.46.0)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.46.0)(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))(vitest@1.6.0(@types/node@18.19.44)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)) vue: 3.4.35(typescript@5.5.4) vue-router: 4.4.2(vue@3.4.35(typescript@5.5.4)) optionalDependencies: - '@playwright/test': 1.45.3 + '@playwright/test': 1.46.0 '@vue/test-utils': 2.4.6 - playwright-core: 1.45.3 - vitest: 1.6.0(@types/node@18.19.42)(terser@5.30.3) + playwright-core: 1.46.0 + vitest: 1.6.0(@types/node@18.19.44)(terser@5.30.3) transitivePeerDependencies: - magicast - rollup - supports-color - '@nuxt/test-utils@3.14.0(@playwright/test@1.45.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.45.3)(rollup@4.19.2)(vite@5.3.5(@types/node@20.12.7)(terser@5.30.3))(vitest@1.6.0(@types/node@20.12.7)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4))': + '@nuxt/test-utils@3.14.1(@playwright/test@1.46.0)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.46.0)(rollup@4.19.2)(vite@5.3.5(@types/node@20.12.7)(terser@5.30.3))(vitest@1.6.0(@types/node@20.12.7)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4))': dependencies: '@nuxt/kit': 3.12.4(magicast@0.3.4)(rollup@4.19.2) '@nuxt/schema': 3.12.4(rollup@4.19.2) @@ -7012,7 +7022,7 @@ snapshots: get-port-please: 3.1.2 h3: 1.12.0 local-pkg: 0.5.0 - magic-string: 0.30.10 + magic-string: 0.30.11 nitropack: 2.9.7(encoding@0.1.13)(magicast@0.3.4) node-fetch-native: 1.6.4 ofetch: 1.3.4 @@ -7023,15 +7033,15 @@ snapshots: std-env: 3.7.0 ufo: 1.5.4 unenv: 1.10.0 - unplugin: 1.12.0 + unplugin: 1.12.1 vite: 5.3.5(@types/node@20.12.7)(terser@5.30.3) - vitest-environment-nuxt: 1.0.0(@playwright/test@1.45.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.45.3)(rollup@4.19.2)(vite@5.3.5(@types/node@20.12.7)(terser@5.30.3))(vitest@1.6.0(@types/node@20.12.7)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)) + vitest-environment-nuxt: 1.0.0(@playwright/test@1.46.0)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.46.0)(rollup@4.19.2)(vite@5.3.5(@types/node@20.12.7)(terser@5.30.3))(vitest@1.6.0(@types/node@20.12.7)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)) vue: 3.4.35(typescript@5.5.4) vue-router: 4.4.2(vue@3.4.35(typescript@5.5.4)) optionalDependencies: - '@playwright/test': 1.45.3 + '@playwright/test': 1.46.0 '@vue/test-utils': 2.4.6 - playwright-core: 1.45.3 + playwright-core: 1.46.0 vitest: 1.6.0(@types/node@20.12.7)(terser@5.30.3) transitivePeerDependencies: - magicast @@ -7096,6 +7106,64 @@ snapshots: - vti - vue-tsc + '@nuxt/vite-builder@3.12.4(@types/node@18.19.44)(eslint@8.57.0)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.19.2)(terser@5.30.3)(typescript@5.5.4)(vue-tsc@2.0.29(typescript@5.5.4))(vue@3.4.35(typescript@5.5.4))': + dependencies: + '@nuxt/kit': 3.12.4(magicast@0.3.4)(rollup@4.19.2) + '@rollup/plugin-replace': 5.0.7(rollup@4.19.2) + '@vitejs/plugin-vue': 5.1.1(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))(vue@3.4.35(typescript@5.5.4)) + '@vitejs/plugin-vue-jsx': 4.0.0(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))(vue@3.4.35(typescript@5.5.4)) + autoprefixer: 10.4.19(postcss@8.4.40) + clear: 0.1.0 + consola: 3.2.3 + cssnano: 7.0.4(postcss@8.4.40) + defu: 6.1.4 + esbuild: 0.23.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + externality: 1.0.2 + get-port-please: 3.1.2 + h3: 1.12.0 + knitwork: 1.1.0 + magic-string: 0.30.10 + mlly: 1.7.1 + ohash: 1.1.3 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.1.3 + postcss: 8.4.40 + rollup-plugin-visualizer: 5.12.0(rollup@4.19.2) + std-env: 3.7.0 + strip-literal: 2.1.0 + ufo: 1.5.4 + unenv: 1.10.0 + unplugin: 1.12.0 + vite: 5.3.5(@types/node@18.19.44)(terser@5.30.3) + vite-node: 2.0.5(@types/node@18.19.44)(terser@5.30.3) + vite-plugin-checker: 0.7.2(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.4)(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))(vue-tsc@2.0.29(typescript@5.5.4)) + vue: 3.4.35(typescript@5.5.4) + vue-bundle-renderer: 2.1.0 + transitivePeerDependencies: + - '@biomejs/biome' + - '@types/node' + - eslint + - less + - lightningcss + - magicast + - meow + - optionator + - rollup + - sass + - stylelint + - stylus + - sugarss + - supports-color + - terser + - typescript + - uWebSockets.js + - vls + - vti + - vue-tsc + '@nuxt/vite-builder@3.12.4(@types/node@20.12.7)(eslint@8.57.0)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.19.2)(terser@5.30.3)(typescript@5.5.4)(vue-tsc@2.0.29(typescript@5.5.4))(vue@3.4.35(typescript@5.5.4))': dependencies: '@nuxt/kit': 3.12.4(magicast@0.3.4)(rollup@4.19.2) @@ -7254,9 +7322,9 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.45.3': + '@playwright/test@1.46.0': dependencies: - playwright: 1.45.3 + playwright: 1.46.0 '@polka/url@1.0.0-next.25': {} @@ -7279,7 +7347,7 @@ snapshots: estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 - magic-string: 0.30.10 + magic-string: 0.30.7 optionalDependencies: rollup: 3.29.4 @@ -7339,7 +7407,7 @@ snapshots: '@rollup/plugin-replace@5.0.5(rollup@3.29.4)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) - magic-string: 0.30.10 + magic-string: 0.30.7 optionalDependencies: rollup: 3.29.4 @@ -7509,7 +7577,7 @@ snapshots: '@types/jsonwebtoken@9.0.6': dependencies: - '@types/node': 18.19.42 + '@types/node': 18.19.44 '@types/linkify-it@5.0.0': {} @@ -7524,6 +7592,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@18.19.44': + dependencies: + undici-types: 5.26.5 + '@types/node@20.12.7': dependencies: undici-types: 5.26.5 @@ -7682,6 +7754,16 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitejs/plugin-vue-jsx@4.0.0(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))(vue@3.4.35(typescript@5.5.4))': + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2) + '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.25.2) + vite: 5.3.5(@types/node@18.19.44)(terser@5.30.3) + vue: 3.4.35(typescript@5.5.4) + transitivePeerDependencies: + - supports-color + '@vitejs/plugin-vue-jsx@4.0.0(vite@5.3.5(@types/node@20.12.7)(terser@5.30.3))(vue@3.4.35(typescript@5.5.4))': dependencies: '@babel/core': 7.25.2 @@ -7702,6 +7784,11 @@ snapshots: vite: 5.3.5(@types/node@18.19.42)(terser@5.30.3) vue: 3.4.35(typescript@5.5.4) + '@vitejs/plugin-vue@5.1.1(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))(vue@3.4.35(typescript@5.5.4))': + dependencies: + vite: 5.3.5(@types/node@18.19.44)(terser@5.30.3) + vue: 3.4.35(typescript@5.5.4) + '@vitejs/plugin-vue@5.1.1(vite@5.3.5(@types/node@20.12.7)(terser@5.30.3))(vue@3.4.35(typescript@5.5.4))': dependencies: vite: 5.3.5(@types/node@20.12.7)(terser@5.30.3) @@ -7872,14 +7959,14 @@ snapshots: transitivePeerDependencies: - vite - '@vue/devtools-core@7.3.3(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3))': + '@vue/devtools-core@7.3.3(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))': dependencies: '@vue/devtools-kit': 7.3.5 '@vue/devtools-shared': 7.3.7 mitt: 3.0.1 nanoid: 3.3.7 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3)) + vite-hot-client: 0.2.3(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3)) transitivePeerDependencies: - vite @@ -8350,6 +8437,8 @@ snapshots: caniuse-lite@1.0.30001646: {} + caniuse-lite@1.0.30001651: {} + chai@4.4.1: dependencies: assertion-error: 1.1.0 @@ -10092,7 +10181,7 @@ snapshots: mlly@1.6.1: dependencies: - acorn: 8.11.3 + acorn: 8.12.1 pathe: 1.1.2 pkg-types: 1.0.3 ufo: 1.5.4 @@ -10142,7 +10231,7 @@ snapshots: '@next/env': 13.5.6 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001646 + caniuse-lite: 1.0.30001651 postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -10417,14 +10506,14 @@ snapshots: - vue-tsc - xml2js - nuxt@3.12.4(@parcel/watcher@2.4.1)(@types/node@18.19.42)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.19.2)(terser@5.30.3)(typescript@5.5.4)(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3))(vue-tsc@2.0.29(typescript@5.5.4)): + nuxt@3.12.4(@parcel/watcher@2.4.1)(@types/node@18.19.44)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.19.2)(terser@5.30.3)(typescript@5.5.4)(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))(vue-tsc@2.0.29(typescript@5.5.4)): dependencies: '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 1.3.9(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3)) + '@nuxt/devtools': 1.3.9(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3)) '@nuxt/kit': 3.12.4(magicast@0.3.4)(rollup@4.19.2) '@nuxt/schema': 3.12.4(rollup@4.19.2) '@nuxt/telemetry': 2.5.4(magicast@0.3.4)(rollup@4.19.2) - '@nuxt/vite-builder': 3.12.4(@types/node@18.19.42)(eslint@8.57.0)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.19.2)(terser@5.30.3)(typescript@5.5.4)(vue-tsc@2.0.29(typescript@5.5.4))(vue@3.4.35(typescript@5.5.4)) + '@nuxt/vite-builder': 3.12.4(@types/node@18.19.44)(eslint@8.57.0)(magicast@0.3.4)(optionator@0.9.3)(rollup@4.19.2)(terser@5.30.3)(typescript@5.5.4)(vue-tsc@2.0.29(typescript@5.5.4))(vue@3.4.35(typescript@5.5.4)) '@unhead/dom': 1.9.16 '@unhead/ssr': 1.9.16 '@unhead/vue': 1.9.16(vue@3.4.35(typescript@5.5.4)) @@ -10480,7 +10569,7 @@ snapshots: vue-router: 4.4.2(vue@3.4.35(typescript@5.5.4)) optionalDependencies: '@parcel/watcher': 2.4.1 - '@types/node': 18.19.42 + '@types/node': 18.19.44 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -10947,11 +11036,11 @@ snapshots: mlly: 1.7.1 pathe: 1.1.2 - playwright-core@1.45.3: {} + playwright-core@1.46.0: {} - playwright@1.45.3: + playwright@1.46.0: dependencies: - playwright-core: 1.45.3 + playwright-core: 1.46.0 optionalDependencies: fsevents: 2.3.2 @@ -12093,6 +12182,13 @@ snapshots: webpack-sources: 3.2.3 webpack-virtual-modules: 0.6.2 + unplugin@1.12.1: + dependencies: + acorn: 8.12.1 + chokidar: 3.6.0 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.6.2 + unstorage@1.10.2(ioredis@5.4.1): dependencies: anymatch: 3.1.3 @@ -12135,7 +12231,7 @@ snapshots: mlly: 1.7.1 pathe: 1.1.2 pkg-types: 1.1.3 - unplugin: 1.12.0 + unplugin: 1.12.1 update-browserslist-db@1.0.13(browserslist@4.23.0): dependencies: @@ -12170,21 +12266,21 @@ snapshots: dependencies: vite: 5.3.3(@types/node@18.19.42)(terser@5.30.3) - vite-hot-client@0.2.3(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3)): + vite-hot-client@0.2.3(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3)): dependencies: - vite: 5.3.5(@types/node@18.19.42)(terser@5.30.3) + vite: 5.3.5(@types/node@18.19.44)(terser@5.30.3) vite-hot-client@0.2.3(vite@5.3.5(@types/node@20.12.7)(terser@5.30.3)): dependencies: vite: 5.3.5(@types/node@20.12.7)(terser@5.30.3) - vite-node@1.6.0(@types/node@18.19.42)(terser@5.30.3): + vite-node@1.6.0(@types/node@18.19.44)(terser@5.30.3): dependencies: cac: 6.7.14 debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.9(@types/node@18.19.42)(terser@5.30.3) + vite: 5.2.9(@types/node@18.19.44)(terser@5.30.3) transitivePeerDependencies: - '@types/node' - less @@ -12229,6 +12325,23 @@ snapshots: - supports-color - terser + vite-node@2.0.5(@types/node@18.19.44)(terser@5.30.3): + dependencies: + cac: 6.7.14 + debug: 4.3.6 + pathe: 1.1.2 + tinyrainbow: 1.2.0 + vite: 5.3.5(@types/node@18.19.44)(terser@5.30.3) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + vite-node@2.0.5(@types/node@20.12.7)(terser@5.30.3): dependencies: cac: 6.7.14 @@ -12269,6 +12382,29 @@ snapshots: typescript: 5.5.4 vue-tsc: 2.0.29(typescript@5.5.4) + vite-plugin-checker@0.7.2(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.4)(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))(vue-tsc@2.0.29(typescript@5.5.4)): + dependencies: + '@babel/code-frame': 7.24.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + chokidar: 3.6.0 + commander: 8.3.0 + fast-glob: 3.3.2 + fs-extra: 11.2.0 + npm-run-path: 4.0.1 + strip-ansi: 6.0.1 + tiny-invariant: 1.3.3 + vite: 5.3.5(@types/node@18.19.44)(terser@5.30.3) + vscode-languageclient: 7.0.0 + vscode-languageserver: 7.0.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + optionalDependencies: + eslint: 8.57.0 + optionator: 0.9.3 + typescript: 5.5.4 + vue-tsc: 2.0.29(typescript@5.5.4) + vite-plugin-checker@0.7.2(eslint@8.57.0)(optionator@0.9.3)(typescript@5.5.4)(vite@5.3.5(@types/node@20.12.7)(terser@5.30.3))(vue-tsc@2.0.29(typescript@5.5.4)): dependencies: '@babel/code-frame': 7.24.7 @@ -12310,7 +12446,7 @@ snapshots: - rollup - supports-color - vite-plugin-inspect@0.8.5(@nuxt/kit@3.12.4(magicast@0.3.4)(rollup@4.19.2))(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3)): + vite-plugin-inspect@0.8.5(@nuxt/kit@3.12.4(magicast@0.3.4)(rollup@4.19.2))(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@4.19.2) @@ -12321,7 +12457,7 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.0.1 sirv: 2.0.4 - vite: 5.3.5(@types/node@18.19.42)(terser@5.30.3) + vite: 5.3.5(@types/node@18.19.44)(terser@5.30.3) optionalDependencies: '@nuxt/kit': 3.12.4(magicast@0.3.4)(rollup@4.19.2) transitivePeerDependencies: @@ -12356,12 +12492,12 @@ snapshots: '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.25.2) '@vue/compiler-dom': 3.4.35 kolorist: 1.8.0 - magic-string: 0.30.11 + magic-string: 0.30.10 vite: 5.3.3(@types/node@18.19.42)(terser@5.30.3) transitivePeerDependencies: - supports-color - vite-plugin-vue-inspector@5.1.3(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3)): + vite-plugin-vue-inspector@5.1.3(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3)): dependencies: '@babel/core': 7.25.2 '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.25.2) @@ -12371,8 +12507,8 @@ snapshots: '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.25.2) '@vue/compiler-dom': 3.4.35 kolorist: 1.8.0 - magic-string: 0.30.11 - vite: 5.3.5(@types/node@18.19.42)(terser@5.30.3) + magic-string: 0.30.10 + vite: 5.3.5(@types/node@18.19.44)(terser@5.30.3) transitivePeerDependencies: - supports-color @@ -12386,18 +12522,18 @@ snapshots: '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.25.2) '@vue/compiler-dom': 3.4.35 kolorist: 1.8.0 - magic-string: 0.30.11 + magic-string: 0.30.10 vite: 5.3.5(@types/node@20.12.7)(terser@5.30.3) transitivePeerDependencies: - supports-color - vite@5.2.9(@types/node@18.19.42)(terser@5.30.3): + vite@5.2.9(@types/node@18.19.44)(terser@5.30.3): dependencies: esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.14.3 optionalDependencies: - '@types/node': 18.19.42 + '@types/node': 18.19.44 fsevents: 2.3.3 terser: 5.30.3 @@ -12431,6 +12567,16 @@ snapshots: fsevents: 2.3.3 terser: 5.30.3 + vite@5.3.5(@types/node@18.19.44)(terser@5.30.3): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.40 + rollup: 4.19.2 + optionalDependencies: + '@types/node': 18.19.44 + fsevents: 2.3.3 + terser: 5.30.3 + vite@5.3.5(@types/node@20.12.7)(terser@5.30.3): dependencies: esbuild: 0.21.5 @@ -12488,9 +12634,9 @@ snapshots: - typescript - universal-cookie - vitest-environment-nuxt@1.0.0(@playwright/test@1.45.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.45.3)(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3))(vitest@1.6.0(@types/node@18.19.42)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)): + vitest-environment-nuxt@1.0.0(@playwright/test@1.46.0)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.46.0)(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))(vitest@1.6.0(@types/node@18.19.44)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)): dependencies: - '@nuxt/test-utils': 3.14.0(@playwright/test@1.45.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.45.3)(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.42)(terser@5.30.3))(vitest@1.6.0(@types/node@18.19.42)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)) + '@nuxt/test-utils': 3.14.1(@playwright/test@1.46.0)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.46.0)(rollup@4.19.2)(vite@5.3.5(@types/node@18.19.44)(terser@5.30.3))(vitest@1.6.0(@types/node@18.19.44)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)) transitivePeerDependencies: - '@cucumber/cucumber' - '@jest/globals' @@ -12511,9 +12657,9 @@ snapshots: - vue - vue-router - vitest-environment-nuxt@1.0.0(@playwright/test@1.45.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.45.3)(rollup@4.19.2)(vite@5.3.5(@types/node@20.12.7)(terser@5.30.3))(vitest@1.6.0(@types/node@20.12.7)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)): + vitest-environment-nuxt@1.0.0(@playwright/test@1.46.0)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.46.0)(rollup@4.19.2)(vite@5.3.5(@types/node@20.12.7)(terser@5.30.3))(vitest@1.6.0(@types/node@20.12.7)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)): dependencies: - '@nuxt/test-utils': 3.14.0(@playwright/test@1.45.3)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.45.3)(rollup@4.19.2)(vite@5.3.5(@types/node@20.12.7)(terser@5.30.3))(vitest@1.6.0(@types/node@20.12.7)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)) + '@nuxt/test-utils': 3.14.1(@playwright/test@1.46.0)(@vue/test-utils@2.4.6)(h3@1.12.0)(magicast@0.3.4)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.4))(playwright-core@1.46.0)(rollup@4.19.2)(vite@5.3.5(@types/node@20.12.7)(terser@5.30.3))(vitest@1.6.0(@types/node@20.12.7)(terser@5.30.3))(vue-router@4.4.2(vue@3.4.35(typescript@5.5.4)))(vue@3.4.35(typescript@5.5.4)) transitivePeerDependencies: - '@cucumber/cucumber' - '@jest/globals' @@ -12534,7 +12680,7 @@ snapshots: - vue - vue-router - vitest@1.6.0(@types/node@18.19.42)(terser@5.30.3): + vitest@1.6.0(@types/node@18.19.44)(terser@5.30.3): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -12553,11 +12699,11 @@ snapshots: strip-literal: 2.0.0 tinybench: 2.6.0 tinypool: 0.8.4 - vite: 5.2.9(@types/node@18.19.42)(terser@5.30.3) - vite-node: 1.6.0(@types/node@18.19.42)(terser@5.30.3) + vite: 5.2.9(@types/node@18.19.44)(terser@5.30.3) + vite-node: 1.6.0(@types/node@18.19.44)(terser@5.30.3) why-is-node-running: 2.2.2 optionalDependencies: - '@types/node': 18.19.42 + '@types/node': 18.19.44 transitivePeerDependencies: - less - lightningcss From 1e2b5a8729695e78244c503b78aabdac00325a14 Mon Sep 17 00:00:00 2001 From: Marsel Shaikhin Date: Thu, 15 Aug 2024 13:10:05 +0200 Subject: [PATCH 3/3] fix: work around useFetch bug --- playground-authjs/app.vue | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/playground-authjs/app.vue b/playground-authjs/app.vue index 6ea39f5c..174c7a70 100644 --- a/playground-authjs/app.vue +++ b/playground-authjs/app.vue @@ -1,13 +1,23 @@