diff --git a/.changeset/itchy-eels-remain.md b/.changeset/itchy-eels-remain.md new file mode 100644 index 000000000..7bd5047ae --- /dev/null +++ b/.changeset/itchy-eels-remain.md @@ -0,0 +1,8 @@ +--- +"@logto/console": minor +"@logto/core": minor +--- + +enable custom JWT feature for OSS version + +OSS version users can now use custom JWT feature to add custom claims to JWT access tokens payload (previously, this feature was only available to Logto Cloud). diff --git a/packages/console/src/containers/ConsoleContent/Sidebar/hook.tsx b/packages/console/src/containers/ConsoleContent/Sidebar/hook.tsx index 1d1cb002e..2cc9cede8 100644 --- a/packages/console/src/containers/ConsoleContent/Sidebar/hook.tsx +++ b/packages/console/src/containers/ConsoleContent/Sidebar/hook.tsx @@ -130,7 +130,6 @@ export const useSidebarMenuItems = (): { { Icon: JwtClaims, title: 'customize_jwt', - isHidden: !isCloud, }, { Icon: Hook, diff --git a/packages/console/src/hooks/use-console-routes/index.tsx b/packages/console/src/hooks/use-console-routes/index.tsx index 92277b99f..597a9e575 100644 --- a/packages/console/src/hooks/use-console-routes/index.tsx +++ b/packages/console/src/hooks/use-console-routes/index.tsx @@ -63,7 +63,7 @@ export const useConsoleRoutes = () => { }, { path: 'signing-keys', element: }, isCloud && tenantSettings, - isCloud && customizeJwt + customizeJwt ), [tenantSettings] ); diff --git a/packages/core/src/libraries/jwt-customizer.ts b/packages/core/src/libraries/jwt-customizer.ts index d8be39a76..6ae1e5380 100644 --- a/packages/core/src/libraries/jwt-customizer.ts +++ b/packages/core/src/libraries/jwt-customizer.ts @@ -1,14 +1,19 @@ +import { runScriptFunctionInLocalVm, buildErrorResponse } from '@logto/core-kit/custom-jwt'; import { userInfoSelectFields, jwtCustomizerUserContextGuard, type LogtoJwtTokenKey, type JwtCustomizerType, type JwtCustomizerUserContext, + type CustomJwtFetcher, + LogtoJwtTokenKeyType, } from '@logto/schemas'; import { type ConsoleLog } from '@logto/shared'; import { deduplicate, pick, pickState, assert } from '@silverhand/essentials'; import deepmerge from 'deepmerge'; +import { z, ZodError } from 'zod'; +import { EnvSet } from '#src/env-set/index.js'; import RequestError from '#src/errors/RequestError/index.js'; import type { LogtoConfigLibrary } from '#src/libraries/logto-config.js'; import { type ScopeLibrary } from '#src/libraries/scope.js'; @@ -18,26 +23,49 @@ import { getJwtCustomizerScripts, type CustomJwtDeployRequestBody, } from '#src/utils/custom-jwt/index.js'; +import { LocalVmError } from '#src/utils/custom-jwt/index.js'; import { type CloudConnectionLibrary } from './cloud-connection.js'; -export const createJwtCustomizerLibrary = ( - queries: Queries, - logtoConfigs: LogtoConfigLibrary, - cloudConnection: CloudConnectionLibrary, - userLibrary: UserLibrary, - scopeLibrary: ScopeLibrary -) => { - const { - users: { findUserById }, - rolesScopes: { findRolesScopesByRoleIds }, - scopes: { findScopesByIds }, - userSsoIdentities, - organizations: { relations }, - } = queries; - const { findUserRoles } = userLibrary; - const { attachResourceToScopes } = scopeLibrary; - const { getJwtCustomizers } = logtoConfigs; +export class JwtCustomizerLibrary { + // Convert errors to WithTyped client response error to share the error handling logic. + static async runScriptInLocalVm(data: CustomJwtFetcher) { + try { + const payload = + data.tokenType === LogtoJwtTokenKeyType.AccessToken + ? pick(data, 'token', 'context', 'environmentVariables') + : pick(data, 'token', 'environmentVariables'); + const result = await runScriptFunctionInLocalVm(data.script, 'getCustomJwtClaims', payload); + + // If the `result` is not a record, we cannot merge it to the existing token payload. + return z.record(z.unknown()).parse(result); + } catch (error: unknown) { + // Assuming we only use zod for request body validation + if (error instanceof ZodError) { + const { errors } = error; + throw new LocalVmError( + { + message: 'Invalid input', + errors, + }, + 400 + ); + } + + throw new LocalVmError( + buildErrorResponse(error), + error instanceof SyntaxError || error instanceof TypeError ? 422 : 500 + ); + } + } + + constructor( + private readonly queries: Queries, + private readonly logtoConfigs: LogtoConfigLibrary, + private readonly cloudConnection: CloudConnectionLibrary, + private readonly userLibrary: UserLibrary, + private readonly scopeLibrary: ScopeLibrary + ) {} /** * We does not include org roles' scopes for the following reason: @@ -45,15 +73,20 @@ export const createJwtCustomizerLibrary = ( * these APIs from console setup while this library method is a backend used method. * 2. Logto developers can get the org roles' id from this user context and hence query the org roles' scopes via management API. */ - const getUserContext = async (userId: string): Promise => { - const user = await findUserById(userId); - const fullSsoIdentities = await userSsoIdentities.findUserSsoIdentitiesByUserId(userId); - const roles = await findUserRoles(userId); - const rolesScopes = await findRolesScopesByRoleIds(roles.map(({ id }) => id)); + async getUserContext(userId: string): Promise { + const user = await this.queries.users.findUserById(userId); + const fullSsoIdentities = await this.queries.userSsoIdentities.findUserSsoIdentitiesByUserId( + userId + ); + const roles = await this.userLibrary.findUserRoles(userId); + const rolesScopes = await this.queries.rolesScopes.findRolesScopesByRoleIds( + roles.map(({ id }) => id) + ); const scopeIds = rolesScopes.map(({ scopeId }) => scopeId); - const scopes = await findScopesByIds(scopeIds); - const scopesWithResources = await attachResourceToScopes(scopes); - const organizationsWithRoles = await relations.users.getOrganizationsByUserId(userId); + const scopes = await this.queries.scopes.findScopesByIds(scopeIds); + const scopesWithResources = await this.scopeLibrary.attachResourceToScopes(scopes); + const organizationsWithRoles = + await this.queries.organizations.relations.users.getOrganizationsByUserId(userId); const userContext = { ...pick(user, ...userInfoSelectFields), ssoIdentities: fullSsoIdentities.map(pickState('issuer', 'identityId', 'detail')), @@ -81,7 +114,7 @@ export const createJwtCustomizerLibrary = ( }; return jwtCustomizerUserContextGuard.parse(userContext); - }; + } /** * This method is used to deploy the give JWT customizer scripts to the cloud worker service. @@ -95,17 +128,24 @@ export const createJwtCustomizerLibrary = ( * @params payload.value - JWT customizer value * @params payload.useCase - The use case of JWT customizer script, can be either `test` or `production`. */ - const deployJwtCustomizerScript = async ( + async deployJwtCustomizerScript( consoleLog: ConsoleLog, payload: { key: T; value: JwtCustomizerType[T]; useCase: 'test' | 'production'; } - ) => { + ) { + if (!EnvSet.values.isCloud) { + consoleLog.warn( + 'Early terminate `deployJwtCustomizerScript` since we do not provide dedicated computing resource for OSS version.' + ); + return; + } + const [client, jwtCustomizers] = await Promise.all([ - cloudConnection.getClient(), - getJwtCustomizers(consoleLog), + this.cloudConnection.getClient(), + this.logtoConfigs.getJwtCustomizers(consoleLog), ]); const customizerScriptsFromDatabase = getJwtCustomizerScripts(jwtCustomizers); @@ -129,15 +169,19 @@ export const createJwtCustomizerLibrary = ( await client.put(`/api/services/custom-jwt/worker`, { body: deepmerge(customizerScriptsFromDatabase, newCustomizerScripts), }); - }; + } + + async undeployJwtCustomizerScript(consoleLog: ConsoleLog, key: T) { + if (!EnvSet.values.isCloud) { + consoleLog.warn( + 'Early terminate `undeployJwtCustomizerScript` since we do not deploy the script to dedicated computing resource for OSS version.' + ); + return; + } - const undeployJwtCustomizerScript = async ( - consoleLog: ConsoleLog, - key: T - ) => { const [client, jwtCustomizers] = await Promise.all([ - cloudConnection.getClient(), - getJwtCustomizers(consoleLog), + this.cloudConnection.getClient(), + this.logtoConfigs.getJwtCustomizers(consoleLog), ]); assert(jwtCustomizers[key], new RequestError({ code: 'entity.not_exists', key })); @@ -160,10 +204,5 @@ export const createJwtCustomizerLibrary = ( await client.put(`/api/services/custom-jwt/worker`, { body: deepmerge(customizerScriptsFromDatabase, newCustomizerScripts), }); - }; - return { - getUserContext, - deployJwtCustomizerScript, - undeployJwtCustomizerScript, - }; -}; + } +} diff --git a/packages/core/src/oidc/extra-token-claims.ts b/packages/core/src/oidc/extra-token-claims.ts index 5b9fbb42b..906e51345 100644 --- a/packages/core/src/oidc/extra-token-claims.ts +++ b/packages/core/src/oidc/extra-token-claims.ts @@ -4,6 +4,7 @@ import { LogtoJwtTokenKeyType, LogResult, jwtCustomizer as jwtCustomizerLog, + type CustomJwtFetcher, } from '@logto/schemas'; import { generateStandardId } from '@logto/shared'; import { conditional, trySafe } from '@silverhand/essentials'; @@ -11,6 +12,7 @@ import { type KoaContextWithOIDC, type UnknownObject } from 'oidc-provider'; import { EnvSet } from '#src/env-set/index.js'; import { type CloudConnectionLibrary } from '#src/libraries/cloud-connection.js'; +import { JwtCustomizerLibrary } from '#src/libraries/jwt-customizer.js'; import { type LogtoConfigLibrary } from '#src/libraries/logto-config.js'; import { LogEntry } from '#src/middleware/koa-audit-log.js'; import type Libraries from '#src/tenants/Libraries.js'; @@ -66,12 +68,6 @@ export const getExtraTokenClaimsForJwtCustomization = async ( cloudConnection: CloudConnectionLibrary; } ): Promise => { - const { isCloud } = EnvSet.values; - // No cloud connection for OSS version, skip. - if (!isCloud) { - return; - } - // Narrow down the token type to `AccessToken` and `ClientCredentials`. if ( !(token instanceof ctx.oidc.provider.AccessToken) && @@ -110,14 +106,6 @@ export const getExtraTokenClaimsForJwtCustomization = async ( .map((field) => [field, Reflect.get(token, field)]) ); - const client = await cloudConnection.getClient(); - - const commonPayload = { - script, - environmentVariables, - token: readOnlyToken, - }; - // We pass context to the cloud API only when it is a user's access token. const logtoUserInfo = conditional( !isTokenClientCredentials && @@ -125,22 +113,29 @@ export const getExtraTokenClaimsForJwtCustomization = async ( (await libraries.jwtCustomizers.getUserContext(token.accountId)) ); - // `context` parameter is only eligible for user's access token for now. - return await client.post(`/api/services/custom-jwt`, { - body: isTokenClientCredentials - ? { - ...commonPayload, - tokenType: LogtoJwtTokenKeyType.ClientCredentials, - } + const payload: CustomJwtFetcher = { + script, + environmentVariables, + token: readOnlyToken, + ...(isTokenClientCredentials + ? { tokenType: LogtoJwtTokenKeyType.ClientCredentials } : { - ...commonPayload, tokenType: LogtoJwtTokenKeyType.AccessToken, // TODO (LOG-8555): the newly added `UserProfile` type includes undefined fields and can not be directly assigned to `Json` type. And the `undefined` fields should be removed by zod guard. + // `context` parameter is only eligible for user's access token for now. // eslint-disable-next-line no-restricted-syntax context: { user: logtoUserInfo as Record }, - }, - search: {}, - }); + }), + }; + + if (EnvSet.values.isCloud) { + const client = await cloudConnection.getClient(); + return await client.post(`/api/services/custom-jwt`, { + body: payload, + search: {}, + }); + } + return await JwtCustomizerLibrary.runScriptInLocalVm(payload); } catch (error: unknown) { const entry = new LogEntry( `${jwtCustomizerLog.prefix}.${ diff --git a/packages/core/src/routes/logto-config/jwt-customizer.test.ts b/packages/core/src/routes/logto-config/jwt-customizer.test.ts index 0c5e3428c..b31381929 100644 --- a/packages/core/src/routes/logto-config/jwt-customizer.test.ts +++ b/packages/core/src/routes/logto-config/jwt-customizer.test.ts @@ -157,10 +157,9 @@ describe('configs JWT customizer routes', () => { expect(response.status).toEqual(204); }); - it('POST /configs/jwt-customizer/test should return 200', async () => { - const cloudConnectionResponse = { success: true }; + it('POST /configs/jwt-customizer/test should not call cloud connection client post', async () => { jest.spyOn(tenantContext.cloudConnection, 'getClient').mockResolvedValue(mockCloudClient); - jest.spyOn(mockCloudClient, 'post').mockResolvedValue(cloudConnectionResponse); + const clientPostSpy = jest.spyOn(mockCloudClient, 'post'); const payload: JwtCustomizerTestRequestBody = { tokenType: LogtoJwtTokenKeyType.ClientCredentials, @@ -169,7 +168,7 @@ describe('configs JWT customizer routes', () => { token: {}, }; - const response = await routeRequester.post('/configs/jwt-customizer/test').send(payload); + await routeRequester.post('/configs/jwt-customizer/test').send(payload); expect(tenantContext.libraries.jwtCustomizers.deployJwtCustomizerScript).toHaveBeenCalledWith( expect.any(ConsoleLog), @@ -180,13 +179,8 @@ describe('configs JWT customizer routes', () => { } ); - expect(mockCloudClient.post).toHaveBeenCalledWith('/api/services/custom-jwt', { - body: payload, - search: { - isTest: 'true', - }, - }); + expect(clientPostSpy).toHaveBeenCalledTimes(0); - expect(response.status).toEqual(200); + // TODO: Add the test on nested class static method. }); }); diff --git a/packages/core/src/routes/logto-config/jwt-customizer.ts b/packages/core/src/routes/logto-config/jwt-customizer.ts index f69cadaa6..43ae020e5 100644 --- a/packages/core/src/routes/logto-config/jwt-customizer.ts +++ b/packages/core/src/routes/logto-config/jwt-customizer.ts @@ -13,6 +13,7 @@ import { ZodError, z } from 'zod'; import { EnvSet } from '#src/env-set/index.js'; import RequestError, { formatZodError } from '#src/errors/RequestError/index.js'; +import { JwtCustomizerLibrary } from '#src/libraries/jwt-customizer.js'; import koaGuard, { parse } from '#src/middleware/koa-guard.js'; import koaQuotaGuard from '#src/middleware/koa-quota-guard.js'; import { getConsoleLogFromContext } from '#src/utils/console.js'; @@ -41,7 +42,6 @@ export default function logtoConfigJwtCustomizerRoutes, statusCode: number) { + super( + new Response( + new Blob([JSON.stringify(errorBody)], { + type: 'application/json', + }), + { + status: statusCode, + } + ) + ); + } +} diff --git a/packages/integration-tests/src/__mocks__/jwt-customizer.ts b/packages/integration-tests/src/__mocks__/jwt-customizer.ts index 398c27854..72f9831ae 100644 --- a/packages/integration-tests/src/__mocks__/jwt-customizer.ts +++ b/packages/integration-tests/src/__mocks__/jwt-customizer.ts @@ -1,11 +1,38 @@ +import type { AccessTokenPayload, ClientCredentialsPayload } from '@logto/schemas'; + +const standardTokenPayloadData = { + jti: 'f1d3d2d1-1f2d-3d4e-5d6f-7d8a9d0e1d2', + aud: 'http://localhost:3000/api/test', + scope: 'read write', + clientId: 'my_app', +}; + +export const accessTokenSample: AccessTokenPayload = { + ...standardTokenPayloadData, + accountId: 'uid_123', + grantId: 'grant_123', + gty: 'authorization_code', + kind: 'AccessToken', +}; + +export const clientCredentialsTokenSample: ClientCredentialsPayload = { + ...standardTokenPayloadData, + kind: 'ClientCredentials', +}; + export const clientCredentialsJwtCustomizerPayload = { script: '', - environmentVariables: {}, + environmentVariables: { + foo: 'bar', + API_KEY: '12345', + }, contextSample: {}, + tokenSample: clientCredentialsTokenSample, }; export const accessTokenJwtCustomizerPayload = { ...clientCredentialsJwtCustomizerPayload, + tokenSample: accessTokenSample, contextSample: { user: { id: '123', @@ -26,3 +53,11 @@ export const accessTokenJwtCustomizerPayload = { }, }, }; + +export const accessTokenSampleScript = `const getCustomJwtClaims = async ({ token, context, environmentVariables }) => { + return { user_id: context?.user?.id ?? 'unknown' }; +}`; + +export const clientCredentialsSampleScript = `const getCustomJwtClaims = async ({ token, context, environmentVariables }) => { + return { ...environmentVariables }; +}`; diff --git a/packages/integration-tests/src/api/logto-config.ts b/packages/integration-tests/src/api/logto-config.ts index 78ce7c7ec..37804b5b3 100644 --- a/packages/integration-tests/src/api/logto-config.ts +++ b/packages/integration-tests/src/api/logto-config.ts @@ -6,6 +6,8 @@ import { type AccessTokenJwtCustomizer, type ClientCredentialsJwtCustomizer, type JwtCustomizerConfigs, + type JwtCustomizerTestRequestBody, + type Json, } from '@logto/schemas'; import { authedAdminApi } from './api.js'; @@ -60,3 +62,10 @@ export const updateJwtCustomizer = async ( authedAdminApi .patch(`configs/jwt-customizer/${keyTypePath}`, { json: value }) .json(); + +export const testJwtCustomizer = async (payload: JwtCustomizerTestRequestBody) => + authedAdminApi + .post(`configs/jwt-customizer/test`, { + json: payload, + }) + .json(); diff --git a/packages/integration-tests/src/tests/api/application/application.roles.test.ts b/packages/integration-tests/src/tests/api/application/application.roles.test.ts index 6fe86b462..0e012e47b 100644 --- a/packages/integration-tests/src/tests/api/application/application.roles.test.ts +++ b/packages/integration-tests/src/tests/api/application/application.roles.test.ts @@ -1,7 +1,12 @@ import { ApplicationType, RoleType } from '@logto/schemas'; -import { generateStandardId } from '@logto/shared'; +import { generateStandardId, formUrlEncodedHeaders } from '@logto/shared'; import { HTTPError } from 'ky'; +import { + clientCredentialsJwtCustomizerPayload, + clientCredentialsSampleScript, +} from '#src/__mocks__/jwt-customizer.js'; +import { oidcApi } from '#src/api/api.js'; import { createApplication, getApplicationRoles, @@ -9,9 +14,14 @@ import { deleteRoleFromApplication, putRolesToApplication, getApplications, + createResource, + upsertJwtCustomizer, + deleteJwtCustomizer, } from '#src/api/index.js'; import { createRole, assignApplicationsToRole } from '#src/api/role.js'; +import { createScope } from '#src/api/scope.js'; import { expectRejects } from '#src/helpers/index.js'; +import { getAccessTokenPayload } from '#src/utils.js'; describe('admin console application management (roles)', () => { it('should get empty list successfully', async () => { @@ -146,4 +156,40 @@ describe('admin console application management (roles)', () => { expect(applications.find(({ name }) => name === 'test-m2m-app-002')).toBeFalsy(); expect(applications.find(({ name }) => name === 'test-spa-app-002')).toBeTruthy(); }); + + it('test m2m application client credentials grant type with custom JWT', async () => { + await upsertJwtCustomizer('client-credentials', { + ...clientCredentialsJwtCustomizerPayload, + script: clientCredentialsSampleScript, + }); + + const m2mApp = await createApplication(generateStandardId(), ApplicationType.MachineToMachine); + const resource = await createResource(); + const createdScope = await createScope(resource.id); + const createdScope2 = await createScope(resource.id); + const role = await createRole({ + type: RoleType.MachineToMachine, + scopeIds: [createdScope.id, createdScope2.id], + }); + await assignApplicationsToRole([m2mApp.id], role.id); + + const { access_token: accessToken } = await oidcApi + .post('token', { + headers: formUrlEncodedHeaders, + body: new URLSearchParams({ + client_id: m2mApp.id, + client_secret: m2mApp.secret, + grant_type: 'client_credentials', + resource: resource.indicator, + scope: [createdScope.name, createdScope2.name].join(' '), + }), + }) + .json<{ access_token: string }>(); + + const payload = getAccessTokenPayload(accessToken); + expect(payload).toHaveProperty('foo', 'bar'); + expect(payload).toHaveProperty('API_KEY', '12345'); + + await deleteJwtCustomizer('client-credentials'); + }); }); diff --git a/packages/integration-tests/src/tests/api/logto-config.test.ts b/packages/integration-tests/src/tests/api/logto-config.test.ts index 3cb093077..04b16662b 100644 --- a/packages/integration-tests/src/tests/api/logto-config.test.ts +++ b/packages/integration-tests/src/tests/api/logto-config.test.ts @@ -3,11 +3,14 @@ import { type AdminConsoleData, LogtoOidcConfigKeyType, LogtoJwtTokenKey, + LogtoJwtTokenKeyType, } from '@logto/schemas'; import { accessTokenJwtCustomizerPayload, clientCredentialsJwtCustomizerPayload, + accessTokenSampleScript, + clientCredentialsSampleScript, } from '#src/__mocks__/jwt-customizer.js'; import { deleteOidcKey, @@ -20,6 +23,7 @@ import { getJwtCustomizer, getJwtCustomizers, deleteJwtCustomizer, + testJwtCustomizer, } from '#src/api/index.js'; import { expectRejects } from '#src/helpers/index.js'; @@ -241,4 +245,27 @@ describe('admin console sign-in experience', () => { await deleteJwtCustomizer('client-credentials'); await expect(getJwtCustomizers()).resolves.toEqual([]); }); + + it('should successfully test an access token JWT customizer', async () => { + const testResult = await testJwtCustomizer({ + tokenType: LogtoJwtTokenKeyType.AccessToken, + token: accessTokenJwtCustomizerPayload.tokenSample, + context: accessTokenJwtCustomizerPayload.contextSample, + script: accessTokenSampleScript, + environmentVariables: accessTokenJwtCustomizerPayload.environmentVariables, + }); + expect(testResult).toMatchObject({ + user_id: accessTokenJwtCustomizerPayload.contextSample.user.id, + }); + }); + + it('should successfully test a client credentials JWT customizer', async () => { + const testResult = await testJwtCustomizer({ + tokenType: LogtoJwtTokenKeyType.ClientCredentials, + token: clientCredentialsJwtCustomizerPayload.tokenSample, + script: clientCredentialsSampleScript, + environmentVariables: clientCredentialsJwtCustomizerPayload.environmentVariables, + }); + expect(testResult).toMatchObject(clientCredentialsJwtCustomizerPayload.environmentVariables); + }); }); diff --git a/packages/integration-tests/src/tests/api/oidc/get-access-token.test.ts b/packages/integration-tests/src/tests/api/oidc/get-access-token.test.ts index 63da8bb4f..5857de7ca 100644 --- a/packages/integration-tests/src/tests/api/oidc/get-access-token.test.ts +++ b/packages/integration-tests/src/tests/api/oidc/get-access-token.test.ts @@ -5,7 +5,18 @@ import { InteractionEvent, type Resource, RoleType } from '@logto/schemas'; import { assert } from '@silverhand/essentials'; import { createRemoteJWKSet, jwtVerify } from 'jose'; -import { createResource, deleteResource, deleteUser, putInteraction } from '#src/api/index.js'; +import { + accessTokenJwtCustomizerPayload, + accessTokenSampleScript, +} from '#src/__mocks__/jwt-customizer.js'; +import { + createResource, + deleteJwtCustomizer, + deleteResource, + deleteUser, + putInteraction, + upsertJwtCustomizer, +} from '#src/api/index.js'; import { assignUsersToRole, createRole, deleteRole } from '#src/api/role.js'; import { createScope, deleteScope } from '#src/api/scope.js'; import MockClient, { defaultConfig } from '#src/client/index.js'; @@ -91,6 +102,11 @@ describe('get access token', () => { }); it('can sign in and getAccessToken with guest user', async () => { + await upsertJwtCustomizer('access-token', { + ...accessTokenJwtCustomizerPayload, + script: accessTokenSampleScript, + }); + const client = new MockClient({ resources: [testApiResourceInfo.indicator], scopes: testApiScopeNames, @@ -108,6 +124,9 @@ describe('get access token', () => { 'scope', testApiScopeNames.join(' ') ); + expect(getAccessTokenPayload(accessToken)).toHaveProperty('user_id', guestUserId); + + await deleteJwtCustomizer('access-token'); }); it('sign in and verify jwt', async () => { diff --git a/packages/schemas/src/types/logto-config/jwt-customizer.ts b/packages/schemas/src/types/logto-config/jwt-customizer.ts index 6c64073d9..ef6714aa8 100644 --- a/packages/schemas/src/types/logto-config/jwt-customizer.ts +++ b/packages/schemas/src/types/logto-config/jwt-customizer.ts @@ -1,12 +1,24 @@ +import { jsonObjectGuard } from '@logto/connector-kit'; import { z } from 'zod'; import { Organizations, Roles, UserSsoIdentities } from '../../db-entries/index.js'; -import { jsonObjectGuard, mfaFactorsGuard } from '../../foundations/index.js'; +import { mfaFactorsGuard } from '../../foundations/index.js'; import { scopeResponseGuard } from '../scope.js'; import { userInfoGuard } from '../user.js'; import { accessTokenPayloadGuard, clientCredentialsPayloadGuard } from './oidc-provider.js'; +export const jwtCustomizerGuard = z.object({ + script: z.string(), + environmentVariables: z.record(z.string()).optional(), + contextSample: jsonObjectGuard.optional(), +}); + +export enum LogtoJwtTokenKeyType { + AccessToken = 'access-token', + ClientCredentials = 'client-credentials', +} + export const jwtCustomizerUserContextGuard = userInfoGuard.extend({ ssoIdentities: UserSsoIdentities.guard .pick({ issuer: true, identityId: true, detail: true }) @@ -32,12 +44,6 @@ export const jwtCustomizerUserContextGuard = userInfoGuard.extend({ export type JwtCustomizerUserContext = z.infer; -export const jwtCustomizerGuard = z.object({ - script: z.string(), - environmentVariables: z.record(z.string()).optional(), - contextSample: jsonObjectGuard.optional(), -}); - export const accessTokenJwtCustomizerGuard = jwtCustomizerGuard .extend({ // Use partial token guard since users customization may not rely on all fields. @@ -57,11 +63,6 @@ export const clientCredentialsJwtCustomizerGuard = jwtCustomizerGuard export type ClientCredentialsJwtCustomizer = z.infer; -export enum LogtoJwtTokenKeyType { - AccessToken = 'access-token', - ClientCredentials = 'client-credentials', -} - /** * This guard is for the core JWT customizer testing API request body guard. * Unlike the DB guard diff --git a/packages/toolkit/core-kit/package.json b/packages/toolkit/core-kit/package.json index 91b6f3251..034e3b079 100644 --- a/packages/toolkit/core-kit/package.json +++ b/packages/toolkit/core-kit/package.json @@ -17,7 +17,11 @@ "import": "./lib/index.js" }, "./declaration": "./declaration/index.ts", - "./scss/*": "./scss/*.scss" + "./scss/*": "./scss/*.scss", + "./custom-jwt": { + "node": "./lib/custom-jwt/index.js", + "types": "./lib/custom-jwt/index.d.ts" + } }, "types": "./lib/index.d.ts", "files": [ diff --git a/packages/toolkit/core-kit/src/custom-jwt/error-handling.ts b/packages/toolkit/core-kit/src/custom-jwt/error-handling.ts new file mode 100644 index 000000000..ae013172b --- /dev/null +++ b/packages/toolkit/core-kit/src/custom-jwt/error-handling.ts @@ -0,0 +1,10 @@ +import { types } from 'node:util'; + +export const buildErrorResponse = (error: unknown) => + /** + * Use `isNativeError` to check if the error is an instance of `Error`. + * If the error comes from `node:vm` module, then it will not be an instance of `Error` but can be captured by `isNativeError`. + */ + types.isNativeError(error) + ? { message: error.message, stack: error.stack } + : { message: String(error) }; diff --git a/packages/toolkit/core-kit/src/custom-jwt/index.ts b/packages/toolkit/core-kit/src/custom-jwt/index.ts new file mode 100644 index 000000000..5d732ce66 --- /dev/null +++ b/packages/toolkit/core-kit/src/custom-jwt/index.ts @@ -0,0 +1,2 @@ +export * from './script-execution.js'; +export * from './error-handling.js'; diff --git a/packages/toolkit/core-kit/src/custom-jwt/script-execution.ts b/packages/toolkit/core-kit/src/custom-jwt/script-execution.ts new file mode 100644 index 000000000..32ee65f4c --- /dev/null +++ b/packages/toolkit/core-kit/src/custom-jwt/script-execution.ts @@ -0,0 +1,41 @@ +import { runInNewContext } from 'node:vm'; + +/** + * This function is used to execute a named function in a customized code script in a local + * virtual machine with the given payload as input. + * + * @param script Custom code snippet. + * @param functionName The name of the function to be executed. + * @param payload The input payload for the function. + * @returns The result of the function execution. + */ +export const runScriptFunctionInLocalVm = async ( + script: string, + functionName: string, + payload: unknown +) => { + const globalContext = Object.freeze({ + fetch: async (...args: Parameters) => fetch(...args), + }); + const customFunction: unknown = runInNewContext(script + `;${functionName};`, globalContext); + + if (typeof customFunction !== 'function') { + throw new TypeError(`The script does not have a function named \`${functionName}\``); + } + + /** + * We can not use top-level await in `vm`, use the following implementation instead. + * + * Ref: + * 1. https://github.com/nodejs/node/issues/40898 + * 2. https://github.com/n-riesco/ijavascript/issues/173#issuecomment-693924098 + */ + const result: unknown = await runInNewContext( + '(async () => customFunction(payload))();', + Object.freeze({ customFunction, payload }), + // Limit the execution time to 3 seconds, throws error if the script takes too long to execute. + { timeout: 3000 } + ); + + return result; +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4fc91804b..caa106faa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,7 +63,7 @@ importers: version: 20.10.4 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -78,7 +78,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.10.4) + version: 1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1) packages/cli: dependencies: @@ -190,7 +190,7 @@ importers: version: 17.0.13 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1)) '@withtyped/server': specifier: ^0.13.6 version: 0.13.6(zod@3.22.4) @@ -208,7 +208,7 @@ importers: version: 17.0.0 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.10.4) + version: 1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-alipay-native: dependencies: @@ -245,7 +245,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@shopify/jest-koa-mocks': specifier: ^5.0.0 version: 5.0.0 @@ -263,7 +263,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -290,7 +290,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-alipay-web: dependencies: @@ -327,7 +327,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@shopify/jest-koa-mocks': specifier: ^5.0.0 version: 5.0.0 @@ -345,7 +345,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -372,7 +372,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-aliyun-dm: dependencies: @@ -403,7 +403,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -418,7 +418,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -445,7 +445,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-aliyun-sms: dependencies: @@ -476,7 +476,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -491,7 +491,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -518,7 +518,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-apple: dependencies: @@ -555,7 +555,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -570,7 +570,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -597,7 +597,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-aws-ses: dependencies: @@ -634,7 +634,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -649,7 +649,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -676,7 +676,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-azuread: dependencies: @@ -710,7 +710,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -725,7 +725,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -752,7 +752,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-discord: dependencies: @@ -783,7 +783,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -798,7 +798,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -825,7 +825,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-facebook: dependencies: @@ -856,7 +856,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -871,7 +871,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -898,7 +898,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-feishu-web: dependencies: @@ -929,7 +929,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -944,7 +944,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -971,7 +971,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-github: dependencies: @@ -1005,7 +1005,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -1020,7 +1020,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -1047,7 +1047,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-google: dependencies: @@ -1078,7 +1078,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -1093,7 +1093,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -1120,7 +1120,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-huggingface: dependencies: @@ -1151,7 +1151,7 @@ importers: version: 15.2.3(rollup@4.14.3) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.14.3)(typescript@5.3.3) + version: 11.1.6(rollup@4.14.3)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -1166,7 +1166,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.12.7)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -1193,7 +1193,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.12.7) + version: 1.4.0(@types/node@20.12.7)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-kakao: dependencies: @@ -1224,7 +1224,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -1239,7 +1239,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -1266,7 +1266,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-logto-email: dependencies: @@ -1300,7 +1300,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -1315,7 +1315,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -1342,7 +1342,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-logto-sms: dependencies: @@ -1373,7 +1373,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -1388,7 +1388,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -1415,7 +1415,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-logto-social-demo: dependencies: @@ -1446,7 +1446,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -1461,7 +1461,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -1488,7 +1488,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-mailgun: dependencies: @@ -1519,7 +1519,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -1534,7 +1534,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -1561,7 +1561,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-mock-email: dependencies: @@ -1592,7 +1592,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -1607,7 +1607,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -1634,7 +1634,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-mock-email-alternative: dependencies: @@ -1665,7 +1665,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -1680,7 +1680,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -1707,7 +1707,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-mock-sms: dependencies: @@ -1738,7 +1738,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -1753,7 +1753,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -1780,7 +1780,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-mock-social: dependencies: @@ -1811,7 +1811,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -1826,7 +1826,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -1853,7 +1853,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-naver: dependencies: @@ -1884,7 +1884,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -1899,7 +1899,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -1926,7 +1926,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-oauth2: dependencies: @@ -1966,7 +1966,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -1981,7 +1981,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -2008,7 +2008,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-oidc: dependencies: @@ -2051,7 +2051,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -2066,7 +2066,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -2093,7 +2093,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-saml: dependencies: @@ -2130,7 +2130,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -2145,7 +2145,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -2172,7 +2172,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-sendgrid-email: dependencies: @@ -2203,7 +2203,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -2218,7 +2218,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -2245,7 +2245,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-smsaero: dependencies: @@ -2276,7 +2276,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -2291,7 +2291,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -2318,7 +2318,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-smtp: dependencies: @@ -2352,7 +2352,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -2370,7 +2370,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -2397,7 +2397,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-tencent-sms: dependencies: @@ -2428,7 +2428,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -2443,7 +2443,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -2470,7 +2470,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-twilio-sms: dependencies: @@ -2501,7 +2501,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -2516,7 +2516,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -2543,7 +2543,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-wechat-native: dependencies: @@ -2574,7 +2574,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -2589,7 +2589,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -2616,7 +2616,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-wechat-web: dependencies: @@ -2647,7 +2647,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -2662,7 +2662,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -2689,7 +2689,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.20) + version: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) packages/connectors/connector-wecom: dependencies: @@ -2720,7 +2720,7 @@ importers: version: 15.2.3(rollup@4.12.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -2735,7 +2735,7 @@ importers: version: 6.0.2 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -2762,7 +2762,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.10.4) + version: 1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1) packages/console: devDependencies: @@ -2804,7 +2804,7 @@ importers: version: 1.6.22(react@18.2.0) '@monaco-editor/react': specifier: ^4.6.0 - version: 4.6.0(monaco-editor@0.47.0)(react-dom@18.2.0)(react@18.2.0) + version: 4.6.0(monaco-editor@0.47.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@parcel/compressor-brotli': specifier: 2.9.3 version: 2.9.3(@parcel/core@2.9.3) @@ -2816,7 +2816,7 @@ importers: version: 2.9.3 '@parcel/transformer-mdx': specifier: 2.9.3 - version: 2.9.3(@mdx-js/react@1.6.22)(@parcel/core@2.9.3) + version: 2.9.3(@mdx-js/react@1.6.22(react@18.2.0))(@parcel/core@2.9.3) '@parcel/transformer-sass': specifier: 2.9.3 version: 2.9.3(@parcel/core@2.9.3) @@ -2828,7 +2828,7 @@ importers: version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) '@silverhand/eslint-config-react': specifier: 6.0.2 - version: 6.0.2(eslint@8.57.0)(postcss@8.4.31)(prettier@3.0.0)(stylelint@15.11.0)(typescript@5.3.3) + version: 6.0.2(eslint@8.57.0)(postcss@8.4.31)(prettier@3.0.0)(stylelint@15.11.0(typescript@5.3.3))(typescript@5.3.3) '@silverhand/essentials': specifier: ^2.9.0 version: 2.9.0 @@ -2840,13 +2840,13 @@ importers: version: 6.0.0(typescript@5.3.3) '@swc/core': specifier: ^1.3.52 - version: 1.3.52 + version: 1.3.52(@swc/helpers@0.5.1) '@swc/jest': specifier: ^0.2.26 - version: 0.2.26(@swc/core@1.3.52) + version: 0.2.26(@swc/core@1.3.52(@swc/helpers@0.5.1)) '@testing-library/react': specifier: ^15.0.0 - version: 15.0.2(react-dom@18.2.0)(react@18.2.0) + version: 15.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/color': specifier: ^3.0.3 version: 3.0.3 @@ -2933,7 +2933,7 @@ importers: version: 3.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) + version: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) jest-environment-jsdom: specifier: ^29.0.0 version: 29.2.2 @@ -2942,7 +2942,7 @@ importers: version: 2.0.0 jest-transformer-svg: specifier: ^2.0.0 - version: 2.0.0(jest@29.7.0)(react@18.2.0) + version: 2.0.0(jest@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)))(react@18.2.0) just-kebab-case: specifier: ^4.2.0 version: 4.2.0 @@ -2966,7 +2966,7 @@ importers: version: 0.5.0(overlayscrollbars@2.0.3)(react@18.2.0) parcel: specifier: 2.9.3 - version: 2.9.3(postcss@8.4.31) + version: 2.9.3(@swc/helpers@0.5.1)(postcss@8.4.31)(srcset@4.0.0) postcss: specifier: ^8.4.31 version: 8.4.31 @@ -2990,7 +2990,7 @@ importers: version: 18.2.0 react-animate-height: specifier: ^3.0.4 - version: 3.0.4(react-dom@18.2.0)(react@18.2.0) + version: 3.0.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-color: specifier: ^2.19.3 version: 2.19.3(react@18.2.0) @@ -3017,31 +3017,31 @@ importers: version: 7.43.9(react@18.2.0) react-hot-toast: specifier: ^2.2.0 - version: 2.2.0(csstype@3.0.11)(react-dom@18.2.0)(react@18.2.0) + version: 2.2.0(csstype@3.0.11)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-i18next: specifier: ^12.3.1 - version: 12.3.1(i18next@22.4.15)(react-dom@18.2.0)(react@18.2.0) + version: 12.3.1(i18next@22.4.15)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-markdown: specifier: ^9.0.0 version: 9.0.0(@types/react@18.0.31)(react@18.2.0) react-modal: specifier: ^3.15.1 - version: 3.15.1(react-dom@18.2.0)(react@18.2.0) + version: 3.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-paginate: specifier: ^8.1.3 version: 8.1.3(react@18.2.0) react-router-dom: specifier: ^6.10.0 - version: 6.10.0(react-dom@18.2.0)(react@18.2.0) + version: 6.10.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-syntax-highlighter: specifier: ^15.5.0 version: 15.5.0(react@18.2.0) react-timer-hook: specifier: ^3.0.5 - version: 3.0.5(react-dom@18.2.0)(react@18.2.0) + version: 3.0.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) recharts: specifier: ^2.1.13 - version: 2.1.13(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + version: 2.1.13(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) remark-gfm: specifier: ^4.0.0 version: 4.0.0 @@ -3056,7 +3056,7 @@ importers: version: 4.0.0 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.3.52)(@types/node@20.12.7)(typescript@5.3.3) + version: 10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3) tslib: specifier: ^2.4.1 version: 2.4.1 @@ -3336,7 +3336,7 @@ importers: version: 8.57.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.10.4) + version: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) jest-matcher-specific-error: specifier: ^1.0.0 version: 1.0.0 @@ -3402,7 +3402,7 @@ importers: version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) '@silverhand/eslint-config-react': specifier: 6.0.2 - version: 6.0.2(eslint@8.57.0)(postcss@8.4.31)(prettier@3.0.0)(stylelint@15.11.0)(typescript@5.3.3) + version: 6.0.2(eslint@8.57.0)(postcss@8.4.31)(prettier@3.0.0)(stylelint@15.11.0(typescript@5.3.3))(typescript@5.3.3) '@silverhand/ts-config': specifier: 6.0.0 version: 6.0.0(typescript@5.3.3) @@ -3435,7 +3435,7 @@ importers: version: 15.0.2 parcel: specifier: 2.9.3 - version: 2.9.3(postcss@8.4.31) + version: 2.9.3(@swc/helpers@0.5.1)(postcss@8.4.31)(srcset@4.0.0) postcss: specifier: ^8.4.31 version: 8.4.31 @@ -3450,7 +3450,7 @@ importers: version: 18.2.0(react@18.2.0) react-i18next: specifier: ^12.3.1 - version: 12.3.1(i18next@22.4.15)(react-dom@18.2.0)(react@18.2.0) + version: 12.3.1(i18next@22.4.15)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) stylelint: specifier: ^15.0.0 version: 15.11.0(typescript@5.3.3) @@ -3504,13 +3504,13 @@ importers: version: 9.6.1(react@18.2.0) '@react-spring/web': specifier: ^9.6.1 - version: 9.6.1(react-dom@18.2.0)(react@18.2.0) + version: 9.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) '@silverhand/eslint-config-react': specifier: 6.0.2 - version: 6.0.2(eslint@8.57.0)(postcss@8.4.31)(prettier@3.0.0)(stylelint@15.11.0)(typescript@5.3.3) + version: 6.0.2(eslint@8.57.0)(postcss@8.4.31)(prettier@3.0.0)(stylelint@15.11.0(typescript@5.3.3))(typescript@5.3.3) '@silverhand/essentials': specifier: ^2.9.0 version: 2.9.0 @@ -3528,16 +3528,16 @@ importers: version: 9.0.1 '@swc/core': specifier: ^1.3.52 - version: 1.3.52 + version: 1.3.52(@swc/helpers@0.5.1) '@swc/jest': specifier: ^0.2.26 - version: 0.2.26(@swc/core@1.3.52) + version: 0.2.26(@swc/core@1.3.52(@swc/helpers@0.5.1)) '@testing-library/react': specifier: ^15.0.0 - version: 15.0.2(react-dom@18.2.0)(react@18.2.0) + version: 15.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@testing-library/react-hooks': specifier: ^8.0.1 - version: 8.0.1(@types/react@18.0.31)(react-dom@18.2.0)(react@18.2.0) + version: 8.0.1(@types/react@18.0.31)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/color': specifier: ^3.0.3 version: 3.0.3 @@ -3588,7 +3588,7 @@ importers: version: 3.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.12.7) + version: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) jest-environment-jsdom: specifier: ^29.0.0 version: 29.2.2 @@ -3597,7 +3597,7 @@ importers: version: 2.0.0 jest-transformer-svg: specifier: ^2.0.0 - version: 2.0.0(jest@29.7.0)(react@18.2.0) + version: 2.0.0(jest@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)))(react@18.2.0) js-base64: specifier: ^3.7.5 version: 3.7.5 @@ -3612,10 +3612,10 @@ importers: version: 15.0.2 parcel: specifier: 2.9.3 - version: 2.9.3(postcss@8.4.31) + version: 2.9.3(@swc/helpers@0.5.1)(postcss@8.4.31)(srcset@4.0.0) parcel-resolver-ignore: specifier: ^2.1.3 - version: 2.1.3(parcel@2.9.3) + version: 2.1.3(parcel@2.9.3(@swc/helpers@0.5.1)(postcss@8.4.31)(srcset@4.0.0)) postcss: specifier: ^8.4.31 version: 8.4.31 @@ -3630,7 +3630,7 @@ importers: version: 18.2.0 react-device-detect: specifier: ^2.2.3 - version: 2.2.3(react-dom@18.2.0)(react@18.2.0) + version: 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-dom: specifier: ^18.0.0 version: 18.2.0(react@18.2.0) @@ -3642,19 +3642,19 @@ importers: version: 7.34.0(react@18.2.0) react-i18next: specifier: ^12.3.1 - version: 12.3.1(i18next@22.4.15)(react-dom@18.2.0)(react@18.2.0) + version: 12.3.1(i18next@22.4.15)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-modal: specifier: ^3.15.1 - version: 3.15.1(react-dom@18.2.0)(react@18.2.0) + version: 3.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-router-dom: specifier: ^6.10.0 - version: 6.10.0(react-dom@18.2.0)(react@18.2.0) + version: 6.10.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-string-replace: specifier: ^1.0.0 version: 1.0.0 react-timer-hook: specifier: ^3.0.5 - version: 3.0.5(react-dom@18.2.0)(react@18.2.0) + version: 3.0.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-top-loading-bar: specifier: ^2.3.1 version: 2.3.1(react@18.2.0) @@ -3736,13 +3736,13 @@ importers: version: 10.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.10.4) + version: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) jest-matcher-specific-error: specifier: ^1.0.0 version: 1.0.0 jest-puppeteer: specifier: ^10.0.1 - version: 10.0.1(puppeteer@22.6.5)(typescript@5.3.3) + version: 10.0.1(puppeteer@22.6.5(typescript@5.3.3))(typescript@5.3.3) jose: specifier: ^5.0.0 version: 5.0.1 @@ -3886,7 +3886,7 @@ importers: version: 0.0.33 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1)) camelcase: specifier: ^8.0.0 version: 8.0.0 @@ -3913,7 +3913,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.10.4) + version: 1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1) packages/shared: dependencies: @@ -3947,7 +3947,7 @@ importers: version: 20.10.4 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -3962,7 +3962,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.10.4) + version: 1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1) packages/toolkit/connector-kit: dependencies: @@ -3994,7 +3994,7 @@ importers: version: 20.10.4 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -4009,7 +4009,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.10.4) + version: 1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1) packages/toolkit/core-kit: dependencies: @@ -4035,7 +4035,7 @@ importers: version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) '@silverhand/eslint-config-react': specifier: 6.0.2 - version: 6.0.2(eslint@8.57.0)(postcss@8.4.31)(prettier@3.0.0)(stylelint@15.11.0)(typescript@5.3.3) + version: 6.0.2(eslint@8.57.0)(postcss@8.4.31)(prettier@3.0.0)(stylelint@15.11.0(typescript@5.3.3))(typescript@5.3.3) '@silverhand/ts-config': specifier: 6.0.0 version: 6.0.0(typescript@5.3.3) @@ -4053,7 +4053,7 @@ importers: version: 18.0.31 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -4074,7 +4074,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.10.4) + version: 1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1) packages/toolkit/language-kit: optionalDependencies: @@ -4093,7 +4093,7 @@ importers: version: 20.10.4 '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.4.0(vitest@1.4.0) + version: 1.4.0(vitest@1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -4108,7 +4108,7 @@ importers: version: 5.3.3 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.10.4) + version: 1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1) packages: @@ -5215,7 +5215,7 @@ packages: '@logto/react@3.0.8': resolution: {integrity: sha512-p3pV4rX4g8ZwHQ159mxI+pP3Bwome47dNEmP1hI8/10WqdIPXGYTnfYn5c2l4Y2DyslYyK3ur2Sy4i4K6ept9A==} peerDependencies: - react: '>=16.8.0 || ^18.0.0' + react: '>=16.8.0' '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -5229,7 +5229,7 @@ packages: '@mdx-js/react@1.6.22': resolution: {integrity: sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==} peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react: ^16.13.1 || ^17.0.0 '@mdx-js/util@1.6.22': resolution: {integrity: sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==} @@ -5898,7 +5898,7 @@ packages: resolution: {integrity: sha512-4PqhypLqrX5FVXimKBz3S1c+usDns3N/XG66n2FQtO1FIa8WUVw1CsuWHT+tkqeIxDR1PRQX1e8Iwyy7vPclPA==} engines: {node: ^20.9.0} peerDependencies: - stylelint: ^15.0.0 || ^16.0.0 + stylelint: ^15.0.0 '@silverhand/eslint-config@6.0.1': resolution: {integrity: sha512-v7VbAiNgVwcjwGXe4LK6qNVKgltcm4XX9dkYgyaD22vcYCtp1BSd8NVsPDISV1nAwwirCklL0KSDtcD7pxkbHw==} @@ -6334,7 +6334,7 @@ packages: engines: {node: '>=12'} peerDependencies: '@types/react': ^16.9.0 || ^17.0.0 - react: ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.9.0 || ^17.0.0 react-dom: ^16.9.0 || ^17.0.0 react-test-renderer: ^16.9.0 || ^17.0.0 peerDependenciesMeta: @@ -9577,7 +9577,7 @@ packages: jest-transformer-svg@2.0.0: resolution: {integrity: sha512-+f6er7UZTiHTeel9nma1i0NTAU8AjbEvhK2RYUoMxTNihwo98z2rrrDBIbppZI6ACDzeul3bhRmI9M6d25J/Nw==} peerDependencies: - jest: ^28.1.0 || ^29.1.2 + jest: ^28.1.0 react: ^17.0.0 || ^18.0.0 jest-util@29.5.0: @@ -10675,7 +10675,7 @@ packages: resolution: {integrity: sha512-uCNTnkfWW74veoiEv3kSwoLelKt4e8gTNv65D771X3il0x5g5Yo0fUbro7SpQzR9yNgi23cvB2mQHTTdQH96pA==} peerDependencies: overlayscrollbars: ^2.0.0 - react: '>=16.8.0 || ^18.0.0' + react: '>=16.8.0' overlayscrollbars@2.0.3: resolution: {integrity: sha512-boOkJFER1Tc21sxF4a7ghGl+ETV3WtP7YgsUyDPo1VTHUIPdQLfnTzMyOOdMkKkVcpJOYMKwwr4m+saCtgawCg==} @@ -10772,9 +10772,6 @@ packages: resolution: {integrity: sha512-2GTVocFkwblV/TIg9AmT7TI2fO4xdWkyN8aFUEVtiVNWt96GTR3FgQyHFValfCbcj1k9Xf962Ws2hYXYUr9k1Q==} engines: {node: '>= 12.0.0'} hasBin: true - peerDependenciesMeta: - '@parcel/core': - optional: true parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -11257,7 +11254,7 @@ packages: resolution: {integrity: sha512-k+mBS8yCzpFp+7BdrHsL5bXd6CO/2bYO2SvRGKfxK+Ss3nzplAJLlgnd6Zhcxe/avdpy/CgcziicFj7pIHgG5g==} engines: {node: '>= 12.0.0'} peerDependencies: - react: '>=16.8.0 || ^18.0.0' + react: '>=16.8.0' react-dom: '>=16.8.0' react-color@2.19.3: @@ -11274,7 +11271,7 @@ packages: react-device-detect@2.2.3: resolution: {integrity: sha512-buYY3qrCnQVlIFHrC5UcUoAj7iANs/+srdkwsnNjI7anr3Tt7UY6MqNxtMLlr0tMBied0O49UZVK8XKs3ZIiPw==} peerDependencies: - react: '>= 0.14.0 || ^18.0.0' + react: '>= 0.14.0' react-dom: '>= 0.14.0' react-dnd-html5-backend@16.0.0: @@ -11286,7 +11283,7 @@ packages: '@types/hoist-non-react-statics': '>= 3.3.1' '@types/node': '>= 12' '@types/react': '>= 16' - react: '>= 16.14 || ^18.0.0' + react: '>= 16.14' peerDependenciesMeta: '@types/hoist-non-react-statics': optional: true @@ -11298,19 +11295,19 @@ packages: react-dom@18.2.0: resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: - react: ^18.2.0 || ^18.0.0 + react: ^18.2.0 react-dropzone@14.2.3: resolution: {integrity: sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==} engines: {node: '>= 10.13'} peerDependencies: - react: '>= 16.8 || 18.0.0 || ^18.0.0' + react: '>= 16.8 || 18.0.0' react-error-boundary@3.1.4: resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} engines: {node: '>=10', npm: '>=6'} peerDependencies: - react: '>=16.13.1 || ^18.0.0' + react: '>=16.13.1' react-error-overlay@6.0.9: resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==} @@ -11321,32 +11318,32 @@ packages: react-helmet@6.1.0: resolution: {integrity: sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==} peerDependencies: - react: '>=16.3.0 || ^18.0.0' + react: '>=16.3.0' react-hook-form@7.34.0: resolution: {integrity: sha512-s0/TJ09NVlEk2JPp3yit1WnMuPNBXFmUKEQPulgDi9pYBw/ZmmAFHe6AXWq73Y+kp8ye4OcMf0Jv+i/qLPektg==} engines: {node: '>=12.22.0'} peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^18.0.0 + react: ^16.8.0 || ^17 || ^18 react-hook-form@7.43.9: resolution: {integrity: sha512-AUDN3Pz2NSeoxQ7Hs6OhQhDr6gtF9YRuutGDwPQqhSUAHJSgGl2VeY3qN19MG0SucpjgDiuMJ4iC5T5uB+eaNQ==} engines: {node: '>=12.22.0'} peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^18.0.0 + react: ^16.8.0 || ^17 || ^18 react-hot-toast@2.2.0: resolution: {integrity: sha512-248rXw13uhf/6TNDVzagX+y7R8J183rp7MwUMNkcrBRyHj/jWOggfXTGlM8zAOuh701WyVW+eUaWG2LeSufX9g==} engines: {node: '>=10'} peerDependencies: - react: '>=16 || ^18.0.0' + react: '>=16' react-dom: '>=16' react-i18next@12.3.1: resolution: {integrity: sha512-5v8E2XjZDFzK7K87eSwC7AJcAkcLt5xYZ4+yTPDAW1i7C93oOY1dnr4BaQM7un4Hm+GmghuiPvevWwlca5PwDA==} peerDependencies: i18next: '>= 19.0.0' - react: '>= 16.8.0 || ^18.0.0' + react: '>= 16.8.0' react-dom: '*' react-native: '*' peerDependenciesMeta: @@ -11371,19 +11368,19 @@ packages: resolution: {integrity: sha512-v6yNf3AB8GfJ8lCpUvzxAXKxgsHpdmWPlcVRQ6Nocsezp255E/IDrF31kLQsPJeB/cKto/geUwjU36wH784FCA==} peerDependencies: '@types/react': '>=18' - react: '>=18 || ^18.0.0' + react: '>=18' react-modal@3.15.1: resolution: {integrity: sha512-duB9bxOaYg7Zt6TMFldIFxQRtSP+Dg3F1ZX3FXxSUn+3tZZ/9JCgeAQKDg7rhZSAqopq8TFRw3yIbnx77gyFTw==} engines: {node: '>=8'} peerDependencies: - react: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^18.0.0 + react: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 react-dom: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 react-paginate@8.1.3: resolution: {integrity: sha512-zBp80DBRcaeBnAeHUfbGKD0XHfbGNUolQ+S60Ymfs8o7rusYaJYZMAt1j93ADDNLlzRmJ0tMF/NeTlcdKf7dlQ==} peerDependencies: - react: ^16 || ^17 || ^18 || ^18.0.0 + react: ^16 || ^17 || ^18 react-refresh@0.9.0: resolution: {integrity: sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==} @@ -11399,14 +11396,14 @@ packages: resolution: {integrity: sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==} engines: {node: '>=14'} peerDependencies: - react: '>=16.8 || ^18.0.0' + react: '>=16.8' react-dom: '>=16.8' react-router@6.10.0: resolution: {integrity: sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==} engines: {node: '>=14'} peerDependencies: - react: '>=16.8 || ^18.0.0' + react: '>=16.8' react-side-effect@2.1.2: resolution: {integrity: sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==} @@ -11427,24 +11424,24 @@ packages: react-syntax-highlighter@15.5.0: resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==} peerDependencies: - react: '>= 0.14.0 || ^18.0.0' + react: '>= 0.14.0' react-timer-hook@3.0.5: resolution: {integrity: sha512-n+98SdmYvui2ne3KyWb3Ldu4k0NYQa3g/VzW6VEIfZJ8GAk/jJsIY700M8Nd2vNSTj05c7wKyQfJBqZ0x7zfiA==} peerDependencies: - react: '>=16.8.0 || ^18.0.0' + react: '>=16.8.0' react-dom: '>=16.8.0' react-top-loading-bar@2.3.1: resolution: {integrity: sha512-rQk2Nm+TOBrM1C4E3e6KwT65iXyRSgBHjCkr2FNja1S51WaPulRA5nKj/xazuQ3x89wDDdGsrqkqy0RBIfd0xg==} engines: {node: '>=10'} peerDependencies: - react: ^16 || ^17 || ^18 || ^18.0.0 + react: ^16 || ^17 || ^18 react-transition-group@2.9.0: resolution: {integrity: sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==} peerDependencies: - react: '>=15.0.0 || ^18.0.0' + react: '>=15.0.0' react-dom: '>=15.0.0' react@18.2.0: @@ -12100,7 +12097,7 @@ packages: resolution: {integrity: sha512-E4IoDwgJqG+Q3LjeZGXNi3uOXOH5Sx6mCyxp1V4eaAm1DhuA+3X40c2GtobEIHfCv6itN/T3QKRb4V4/snIxUg==} engines: {node: '>=16'} peerDependencies: - stylelint: '>=14 || ^16.0.0' + stylelint: '>=14' stylelint-declaration-block-no-ignored-properties@2.8.0: resolution: {integrity: sha512-Ws8Cav7Y+SPN0JsV407LrnNXWOrqGjxShf+37GBtnU/C58Syve9c0+I/xpLcFOosST3ternykn3Lp77f3ITnFw==} @@ -12111,13 +12108,13 @@ packages: stylelint-order@6.0.4: resolution: {integrity: sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==} peerDependencies: - stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1 || ^16.0.0 + stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1 stylelint-scss@6.2.1: resolution: {integrity: sha512-ZoGLbVb1keZYRVGQlhB8G6sZOoNqw61whzzzGFWp05N12ErqLFfBv3JPrXiMLZaW98sBS7K/vUQhRnvUj4vwdw==} engines: {node: '>=18.12.0'} peerDependencies: - stylelint: ^16.0.2 || ^16.0.0 + stylelint: ^16.0.2 stylelint@15.11.0: resolution: {integrity: sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==} @@ -12560,7 +12557,7 @@ packages: resolution: {integrity: sha512-FbY/ynor7wZV55v1EvvAvu8CvSoEKT1azS2zFb/aLlL0vySbqTM7x9fIcaOJN++E52mVINNDe2VmWWd+Q00S+A==} engines: {node: '>=10'} peerDependencies: - react: '>=16 || ^18.0.0' + react: '>=16' use-sync-external-store@1.2.0: resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} @@ -14157,7 +14154,7 @@ snapshots: '@commitlint/types': 19.0.3 chalk: 5.3.0 cosmiconfig: 8.3.6(typescript@5.0.2) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.12.7)(cosmiconfig@8.3.6)(typescript@5.0.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.12.7)(cosmiconfig@8.3.6(typescript@5.0.2))(typescript@5.0.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -14218,7 +14215,7 @@ snapshots: '@csstools/css-tokenizer@2.2.4': {} - '@csstools/media-query-list-parser@2.1.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4)': + '@csstools/media-query-list-parser@2.1.9(@csstools/css-parser-algorithms@2.6.1(@csstools/css-tokenizer@2.2.4))(@csstools/css-tokenizer@2.2.4)': dependencies: '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) '@csstools/css-tokenizer': 2.2.4 @@ -14416,7 +14413,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2)': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -14430,7 +14427,42 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -14807,7 +14839,7 @@ snapshots: monaco-editor: 0.47.0 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.47.0)(react-dom@18.2.0)(react@18.2.0)': + '@monaco-editor/react@4.6.0(monaco-editor@0.47.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@monaco-editor/loader': 1.4.0(monaco-editor@0.47.0) monaco-editor: 0.47.0 @@ -14941,17 +14973,17 @@ snapshots: transitivePeerDependencies: - '@parcel/core' - '@parcel/config-default@2.9.3(@parcel/core@2.9.3)(postcss@8.4.31)': + '@parcel/config-default@2.9.3(@parcel/core@2.9.3)(@swc/helpers@0.5.1)(postcss@8.4.31)(srcset@4.0.0)': dependencies: '@parcel/bundler-default': 2.9.3(@parcel/core@2.9.3) '@parcel/compressor-raw': 2.9.3(@parcel/core@2.9.3) '@parcel/core': 2.9.3 '@parcel/namer-default': 2.9.3(@parcel/core@2.9.3) '@parcel/optimizer-css': 2.9.3(@parcel/core@2.9.3) - '@parcel/optimizer-htmlnano': 2.9.3(@parcel/core@2.9.3)(postcss@8.4.31) + '@parcel/optimizer-htmlnano': 2.9.3(@parcel/core@2.9.3)(postcss@8.4.31)(srcset@4.0.0) '@parcel/optimizer-image': 2.9.3(@parcel/core@2.9.3) '@parcel/optimizer-svgo': 2.9.3(@parcel/core@2.9.3) - '@parcel/optimizer-swc': 2.9.3(@parcel/core@2.9.3) + '@parcel/optimizer-swc': 2.9.3(@parcel/core@2.9.3)(@swc/helpers@0.5.1) '@parcel/packager-css': 2.9.3(@parcel/core@2.9.3) '@parcel/packager-html': 2.9.3(@parcel/core@2.9.3) '@parcel/packager-js': 2.9.3(@parcel/core@2.9.3) @@ -15078,10 +15110,10 @@ snapshots: transitivePeerDependencies: - '@parcel/core' - '@parcel/optimizer-htmlnano@2.9.3(@parcel/core@2.9.3)(postcss@8.4.31)': + '@parcel/optimizer-htmlnano@2.9.3(@parcel/core@2.9.3)(postcss@8.4.31)(srcset@4.0.0)': dependencies: '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) - htmlnano: 2.0.3(postcss@8.4.31)(svgo@2.8.0) + htmlnano: 2.0.3(postcss@8.4.31)(srcset@4.0.0)(svgo@2.8.0) nullthrows: 1.1.1 posthtml: 0.16.6 svgo: 2.8.0 @@ -15112,13 +15144,13 @@ snapshots: transitivePeerDependencies: - '@parcel/core' - '@parcel/optimizer-swc@2.9.3(@parcel/core@2.9.3)': + '@parcel/optimizer-swc@2.9.3(@parcel/core@2.9.3)(@swc/helpers@0.5.1)': dependencies: '@parcel/diagnostic': 2.9.3 '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.9.3 - '@swc/core': 1.3.52 + '@swc/core': 1.3.52(@swc/helpers@0.5.1) nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' @@ -15333,7 +15365,7 @@ snapshots: transitivePeerDependencies: - '@parcel/core' - '@parcel/transformer-mdx@2.9.3(@mdx-js/react@1.6.22)(@parcel/core@2.9.3)': + '@parcel/transformer-mdx@2.9.3(@mdx-js/react@1.6.22(react@18.2.0))(@parcel/core@2.9.3)': dependencies: '@mdx-js/mdx': 1.6.22 '@mdx-js/react': 1.6.22(react@18.2.0) @@ -15532,7 +15564,7 @@ snapshots: '@react-spring/types@9.6.1': {} - '@react-spring/web@9.6.1(react-dom@18.2.0)(react@18.2.0)': + '@react-spring/web@9.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@react-spring/animated': 9.6.1(react@18.2.0) '@react-spring/core': 9.6.1(react@18.2.0) @@ -15577,6 +15609,7 @@ snapshots: glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.30.7 + optionalDependencies: rollup: 4.12.0 '@rollup/plugin-commonjs@25.0.7(rollup@4.14.3)': @@ -15587,16 +15620,19 @@ snapshots: glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.30.7 + optionalDependencies: rollup: 4.14.3 '@rollup/plugin-json@6.1.0(rollup@4.12.0)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.12.0) + optionalDependencies: rollup: 4.12.0 '@rollup/plugin-json@6.1.0(rollup@4.14.3)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.14.3) + optionalDependencies: rollup: 4.14.3 '@rollup/plugin-node-resolve@15.2.3(rollup@4.12.0)': @@ -15607,6 +15643,7 @@ snapshots: is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.2 + optionalDependencies: rollup: 4.12.0 '@rollup/plugin-node-resolve@15.2.3(rollup@4.14.3)': @@ -15617,27 +15654,33 @@ snapshots: is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.2 + optionalDependencies: rollup: 4.14.3 - '@rollup/plugin-typescript@11.1.6(rollup@4.12.0)(typescript@5.3.3)': + '@rollup/plugin-typescript@11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.12.0) resolve: 1.22.8 - rollup: 4.12.0 typescript: 5.3.3 + optionalDependencies: + rollup: 4.12.0 + tslib: 2.6.2 - '@rollup/plugin-typescript@11.1.6(rollup@4.14.3)(typescript@5.3.3)': + '@rollup/plugin-typescript@11.1.6(rollup@4.14.3)(tslib@2.6.2)(typescript@5.3.3)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.14.3) resolve: 1.22.8 - rollup: 4.14.3 typescript: 5.3.3 + optionalDependencies: + rollup: 4.14.3 + tslib: 2.6.2 '@rollup/pluginutils@5.1.0(rollup@4.12.0)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 + optionalDependencies: rollup: 4.12.0 '@rollup/pluginutils@5.1.0(rollup@4.14.3)': @@ -15645,6 +15688,7 @@ snapshots: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 + optionalDependencies: rollup: 4.14.3 '@rollup/rollup-android-arm-eabi@4.12.0': @@ -15749,17 +15793,17 @@ snapshots: '@sideway/pinpoint@2.0.0': {} - '@silverhand/eslint-config-react@6.0.2(eslint@8.57.0)(postcss@8.4.31)(prettier@3.0.0)(stylelint@15.11.0)(typescript@5.3.3)': + '@silverhand/eslint-config-react@6.0.2(eslint@8.57.0)(postcss@8.4.31)(prettier@3.0.0)(stylelint@15.11.0(typescript@5.3.3))(typescript@5.3.3)': dependencies: '@silverhand/eslint-config': 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) - eslint-config-xo-react: 0.27.0(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.34.1)(eslint@8.57.0) + eslint-config-xo-react: 0.27.0(eslint-plugin-react-hooks@4.6.0(eslint@8.57.0))(eslint-plugin-react@7.34.1(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-react: 7.34.1(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) postcss-scss: 4.0.9(postcss@8.4.31) stylelint: 15.11.0(typescript@5.3.3) - stylelint-config-xo: 0.22.0(stylelint@15.11.0) - stylelint-scss: 6.2.1(stylelint@15.11.0) + stylelint-config-xo: 0.22.0(stylelint@15.11.0(typescript@5.3.3)) + stylelint-scss: 6.2.1(stylelint@15.11.0(typescript@5.3.3)) transitivePeerDependencies: - '@types/eslint' - eslint @@ -15773,23 +15817,23 @@ snapshots: '@silverhand/eslint-config@6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3)': dependencies: '@silverhand/eslint-plugin-fp': 2.5.0(eslint@8.57.0) - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3) '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.3.3) eslint: 8.57.0 eslint-config-prettier: 9.1.0(eslint@8.57.0) eslint-config-xo: 0.44.0(eslint@8.57.0) - eslint-config-xo-typescript: 4.0.0(@typescript-eslint/eslint-plugin@7.7.0)(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.3.3) - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-config-xo-typescript: 4.0.0(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-consistent-default-export-name: 0.0.15 eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-n: 17.2.1(eslint@8.57.0) eslint-plugin-no-use-extend-native: 0.5.0 - eslint-plugin-prettier: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.0.0) + eslint-plugin-prettier: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.0.0) eslint-plugin-promise: 6.1.1(eslint@8.57.0) eslint-plugin-sql: 2.1.0(eslint@8.57.0) eslint-plugin-unicorn: 52.0.0(eslint@8.57.0) - eslint-plugin-unused-imports: 3.1.0(@typescript-eslint/eslint-plugin@7.7.0)(eslint@8.57.0) + eslint-plugin-unused-imports: 3.1.0(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0) prettier: 3.0.0 transitivePeerDependencies: - '@types/eslint' @@ -16311,7 +16355,7 @@ snapshots: '@swc/core-win32-x64-msvc@1.3.52': optional: true - '@swc/core@1.3.52': + '@swc/core@1.3.52(@swc/helpers@0.5.1)': optionalDependencies: '@swc/core-darwin-arm64': 1.3.52 '@swc/core-darwin-x64': 1.3.52 @@ -16323,15 +16367,16 @@ snapshots: '@swc/core-win32-arm64-msvc': 1.3.52 '@swc/core-win32-ia32-msvc': 1.3.52 '@swc/core-win32-x64-msvc': 1.3.52 + '@swc/helpers': 0.5.1 '@swc/helpers@0.5.1': dependencies: tslib: 2.6.2 - '@swc/jest@0.2.26(@swc/core@1.3.52)': + '@swc/jest@0.2.26(@swc/core@1.3.52(@swc/helpers@0.5.1))': dependencies: '@jest/create-cache-key-function': 27.5.1 - '@swc/core': 1.3.52 + '@swc/core': 1.3.52(@swc/helpers@0.5.1) jsonc-parser: 3.2.0 '@szmarczak/http-timer@5.0.1': @@ -16349,15 +16394,16 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/react-hooks@8.0.1(@types/react@18.0.31)(react-dom@18.2.0)(react@18.2.0)': + '@testing-library/react-hooks@8.0.1(@types/react@18.0.31)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.21.0 - '@types/react': 18.0.31 react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) react-error-boundary: 3.1.4(react@18.2.0) + optionalDependencies: + '@types/react': 18.0.31 + react-dom: 18.2.0(react@18.2.0) - '@testing-library/react@15.0.2(react-dom@18.2.0)(react@18.2.0)': + '@testing-library/react@15.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.21.0 '@testing-library/dom': 10.0.0 @@ -16778,7 +16824,7 @@ snapshots: '@types/node': 20.12.7 optional: true - '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.3.3)': + '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3)': dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.3.3) @@ -16793,6 +16839,7 @@ snapshots: natural-compare: 1.4.0 semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.3.3) + optionalDependencies: typescript: 5.3.3 transitivePeerDependencies: - supports-color @@ -16805,6 +16852,7 @@ snapshots: '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 eslint: 8.57.0 + optionalDependencies: typescript: 5.3.3 transitivePeerDependencies: - supports-color @@ -16821,6 +16869,7 @@ snapshots: debug: 4.3.4 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.3.3) + optionalDependencies: typescript: 5.3.3 transitivePeerDependencies: - supports-color @@ -16837,6 +16886,7 @@ snapshots: minimatch: 9.0.4 semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.3.3) + optionalDependencies: typescript: 5.3.3 transitivePeerDependencies: - supports-color @@ -16862,7 +16912,7 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitest/coverage-v8@1.4.0(vitest@1.4.0)': + '@vitest/coverage-v8@1.4.0(vitest@1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -16878,7 +16928,47 @@ snapshots: strip-literal: 2.0.0 test-exclude: 6.0.0 v8-to-istanbul: 9.2.0 - vitest: 1.4.0(@types/node@20.10.4) + vitest: 1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1) + transitivePeerDependencies: + - supports-color + + '@vitest/coverage-v8@1.4.0(vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.4 + istanbul-reports: 3.1.7 + magic-string: 0.30.7 + magicast: 0.3.3 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + test-exclude: 6.0.0 + v8-to-istanbul: 9.2.0 + vitest: 1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1) + transitivePeerDependencies: + - supports-color + + '@vitest/coverage-v8@1.4.0(vitest@1.4.0(@types/node@20.12.7)(jsdom@20.0.2)(sass@1.56.1))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.4 + istanbul-reports: 3.1.7 + magic-string: 0.30.7 + magicast: 0.3.3 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + test-exclude: 6.0.0 + v8-to-istanbul: 9.2.0 + vitest: 1.4.0(@types/node@20.12.7)(jsdom@20.0.2)(sass@1.56.1) transitivePeerDependencies: - supports-color @@ -16992,11 +17082,11 @@ snapshots: - supports-color ajv-draft-04@1.0.0(ajv@8.12.0): - dependencies: + optionalDependencies: ajv: 8.12.0 ajv-formats@2.1.1(ajv@8.12.0): - dependencies: + optionalDependencies: ajv: 8.12.0 ajv@6.12.6: @@ -17727,7 +17817,7 @@ snapshots: core-js@3.34.0: {} - cosmiconfig-typescript-loader@5.0.0(@types/node@20.12.7)(cosmiconfig@8.3.6)(typescript@5.0.2): + cosmiconfig-typescript-loader@5.0.0(@types/node@20.12.7)(cosmiconfig@8.3.6(typescript@5.0.2))(typescript@5.0.2): dependencies: '@types/node': 20.12.7 cosmiconfig: 8.3.6(typescript@5.0.2) @@ -17748,6 +17838,7 @@ snapshots: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 + optionalDependencies: typescript: 5.0.2 cosmiconfig@8.3.6(typescript@5.3.3): @@ -17756,6 +17847,7 @@ snapshots: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 + optionalDependencies: typescript: 5.3.3 cosmiconfig@9.0.0(typescript@5.3.3): @@ -17764,19 +17856,20 @@ snapshots: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 + optionalDependencies: typescript: 5.3.3 create-eslint-index@1.0.0: dependencies: lodash.get: 4.4.2 - create-jest@29.7.0(@types/node@20.10.4): + create-jest@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.10.4) + jest-config: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -17785,13 +17878,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.12.7)(ts-node@10.9.2): + create-jest@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -17953,6 +18046,7 @@ snapshots: debug@3.2.7(supports-color@5.5.0): dependencies: ms: 2.1.3 + optionalDependencies: supports-color: 5.5.0 debug@4.3.4: @@ -18400,15 +18494,15 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-config-xo-react@0.27.0(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.34.1)(eslint@8.57.0): + eslint-config-xo-react@0.27.0(eslint-plugin-react-hooks@4.6.0(eslint@8.57.0))(eslint-plugin-react@7.34.1(eslint@8.57.0))(eslint@8.57.0): dependencies: eslint: 8.57.0 eslint-plugin-react: 7.34.1(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - eslint-config-xo-typescript@4.0.0(@typescript-eslint/eslint-plugin@7.7.0)(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.3.3): + eslint-config-xo-typescript@4.0.0(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3): dependencies: - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3) '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.3.3) eslint: 8.57.0 typescript: 5.3.3 @@ -18426,13 +18520,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: debug: 4.3.4 enhanced-resolve: 5.16.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.3 is-core-module: 2.13.1 @@ -18443,13 +18537,14 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.3.3) debug: 3.2.7(supports-color@5.5.0) + optionalDependencies: + '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.3.3) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -18471,9 +18566,8 @@ snapshots: eslint: 8.57.0 ignore: 5.3.1 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.3.3) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -18482,7 +18576,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -18492,6 +18586,8 @@ snapshots: object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.3.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -18536,13 +18632,14 @@ snapshots: is-obj-prop: 1.0.0 is-proto-prop: 2.0.0 - eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.0.0): + eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.0.0): dependencies: eslint: 8.57.0 - eslint-config-prettier: 9.1.0(eslint@8.57.0) prettier: 3.0.0 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.0) eslint-plugin-promise@6.1.1(eslint@8.57.0): dependencies: @@ -18607,11 +18704,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-unused-imports@3.1.0(@typescript-eslint/eslint-plugin@7.7.0)(eslint@8.57.0): + eslint-plugin-unused-imports@3.1.0(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0): dependencies: - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.3.3) eslint: 8.57.0 eslint-rule-composer: 0.3.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3) eslint-rule-composer@0.3.0: {} @@ -19381,13 +19479,15 @@ snapshots: html-void-elements@1.0.5: {} - htmlnano@2.0.3(postcss@8.4.31)(svgo@2.8.0): + htmlnano@2.0.3(postcss@8.4.31)(srcset@4.0.0)(svgo@2.8.0): dependencies: cosmiconfig: 7.1.0 - postcss: 8.4.31 posthtml: 0.16.6 - svgo: 2.8.0 timsort: 0.3.0 + optionalDependencies: + postcss: 8.4.31 + srcset: 4.0.0 + svgo: 2.8.0 htmlparser2@7.2.0: dependencies: @@ -19662,7 +19762,7 @@ snapshots: is-date-object@1.0.5: dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-decimal@1.0.4: {} @@ -19680,7 +19780,7 @@ snapshots: is-generator-function@1.0.10: dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-get-set-prop@1.0.0: dependencies: @@ -19746,7 +19846,7 @@ snapshots: is-regex@1.1.4: dependencies: call-bind: 1.0.7 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-set@2.0.3: {} @@ -19908,16 +20008,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.10.4): + jest-cli@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.10.4) + create-jest: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.10.4) + jest-config: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -19927,16 +20027,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.12.7): + jest-cli@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) + create-jest: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -19946,60 +20046,42 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.12.7)(ts-node@10.9.2): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest-config@29.7.0(@types/node@20.10.4): + jest-config@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)): dependencies: '@babel/core': 7.24.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.4) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: '@types/node': 20.10.4 - babel-jest: 29.7.0(@babel/core@7.24.4) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 + ts-node: 10.9.2(@types/node@20.10.4)(typescript@5.3.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.12.7)(ts-node@10.9.2): + jest-config@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)): dependencies: '@babel/core': 7.24.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.7 babel-jest: 29.7.0(@babel/core@7.24.4) chalk: 4.1.2 ci-info: 3.8.0 @@ -20019,7 +20101,40 @@ snapshots: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.2(@swc/core@1.3.52)(@types/node@20.12.7)(typescript@5.3.3) + optionalDependencies: + '@types/node': 20.12.7 + ts-node: 10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)): + dependencies: + '@babel/core': 7.24.4 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.4) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.12.7 + ts-node: 10.9.2(@types/node@20.10.4)(typescript@5.3.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -20177,10 +20292,10 @@ snapshots: jest-util: 29.7.0 jest-pnp-resolver@1.2.2(jest-resolve@29.7.0): - dependencies: + optionalDependencies: jest-resolve: 29.7.0 - jest-puppeteer@10.0.1(puppeteer@22.6.5)(typescript@5.3.3): + jest-puppeteer@10.0.1(puppeteer@22.6.5(typescript@5.3.3))(typescript@5.3.3): dependencies: expect-puppeteer: 10.0.0 jest-environment-puppeteer: 10.0.1(typescript@5.3.3) @@ -20293,9 +20408,9 @@ snapshots: jest-transform-stub@2.0.0: {} - jest-transformer-svg@2.0.0(jest@29.7.0)(react@18.2.0): + jest-transformer-svg@2.0.0(jest@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)))(react@18.2.0): dependencies: - jest: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) + jest: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) react: 18.2.0 jest-util@29.5.0: @@ -20350,36 +20465,24 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.10.4): + jest@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.10.4) + jest-cli: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@20.12.7): + jest@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.12.7) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest@29.7.0(@types/node@20.12.7)(ts-node@10.9.2): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) + jest-cli: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -21815,13 +21918,13 @@ snapshots: pako@1.0.11: {} - parcel-resolver-ignore@2.1.3(parcel@2.9.3): + parcel-resolver-ignore@2.1.3(parcel@2.9.3(@swc/helpers@0.5.1)(postcss@8.4.31)(srcset@4.0.0)): dependencies: - parcel: 2.9.3(postcss@8.4.31) + parcel: 2.9.3(@swc/helpers@0.5.1)(postcss@8.4.31)(srcset@4.0.0) - parcel@2.9.3(postcss@8.4.31): + parcel@2.9.3(@swc/helpers@0.5.1)(postcss@8.4.31)(srcset@4.0.0): dependencies: - '@parcel/config-default': 2.9.3(@parcel/core@2.9.3)(postcss@8.4.31) + '@parcel/config-default': 2.9.3(@parcel/core@2.9.3)(@swc/helpers@0.5.1)(postcss@8.4.31)(srcset@4.0.0) '@parcel/core': 2.9.3 '@parcel/diagnostic': 2.9.3 '@parcel/events': 2.9.3 @@ -22293,7 +22396,7 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - react-animate-height@3.0.4(react-dom@18.2.0)(react@18.2.0): + react-animate-height@3.0.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: classnames: 2.3.1 react: 18.2.0 @@ -22315,7 +22418,7 @@ snapshots: react: 18.2.0 tween-functions: 1.2.0 - react-device-detect@2.2.3(react-dom@18.2.0)(react@18.2.0): + react-device-detect@2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -22329,12 +22432,13 @@ snapshots: dependencies: '@react-dnd/invariant': 4.0.0 '@react-dnd/shallowequal': 4.0.0 - '@types/node': 20.12.7 - '@types/react': 18.0.31 dnd-core: 16.0.0 fast-deep-equal: 3.1.3 hoist-non-react-statics: 3.3.2 react: 18.2.0 + optionalDependencies: + '@types/node': 20.12.7 + '@types/react': 18.0.31 react-dom@18.2.0(react@18.2.0): dependencies: @@ -22374,7 +22478,7 @@ snapshots: dependencies: react: 18.2.0 - react-hot-toast@2.2.0(csstype@3.0.11)(react-dom@18.2.0)(react@18.2.0): + react-hot-toast@2.2.0(csstype@3.0.11)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: goober: 2.1.8(csstype@3.0.11) react: 18.2.0 @@ -22382,12 +22486,13 @@ snapshots: transitivePeerDependencies: - csstype - react-i18next@12.3.1(i18next@22.4.15)(react-dom@18.2.0)(react@18.2.0): + react-i18next@12.3.1(i18next@22.4.15)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.21.0 html-parse-stringify: 3.0.1 i18next: 22.4.15 react: 18.2.0 + optionalDependencies: react-dom: 18.2.0(react@18.2.0) react-is@16.13.1: {} @@ -22416,7 +22521,7 @@ snapshots: transitivePeerDependencies: - supports-color - react-modal@3.15.1(react-dom@18.2.0)(react@18.2.0): + react-modal@3.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: exenv: 1.2.2 prop-types: 15.8.1 @@ -22432,13 +22537,13 @@ snapshots: react-refresh@0.9.0: {} - react-resize-detector@7.1.2(react-dom@18.2.0)(react@18.2.0): + react-resize-detector@7.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-router-dom@6.10.0(react-dom@18.2.0)(react@18.2.0): + react-router-dom@6.10.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@remix-run/router': 1.5.0 react: 18.2.0 @@ -22454,13 +22559,13 @@ snapshots: dependencies: react: 18.2.0 - react-smooth@2.0.1(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): + react-smooth@2.0.1(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: fast-equals: 2.0.4 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-transition-group: 2.9.0(react-dom@18.2.0)(react@18.2.0) + react-transition-group: 2.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-string-replace@1.0.0: {} @@ -22473,7 +22578,7 @@ snapshots: react: 18.2.0 refractor: 3.6.0 - react-timer-hook@3.0.5(react-dom@18.2.0)(react@18.2.0): + react-timer-hook@3.0.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -22482,7 +22587,7 @@ snapshots: dependencies: react: 18.2.0 - react-transition-group@2.9.0(react-dom@18.2.0)(react@18.2.0): + react-transition-group@2.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: dom-helpers: 3.4.0 loose-envify: 1.4.0 @@ -22547,7 +22652,7 @@ snapshots: dependencies: decimal.js-light: 2.5.1 - recharts@2.1.13(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): + recharts@2.1.13(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: classnames: 2.3.1 d3-interpolate: 3.0.1 @@ -22559,8 +22664,8 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-is: 16.13.1 - react-resize-detector: 7.1.2(react-dom@18.2.0)(react@18.2.0) - react-smooth: 2.0.1(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + react-resize-detector: 7.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-smooth: 2.0.1(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) recharts-scale: 0.4.5 reduce-css-calc: 2.1.8 @@ -22815,6 +22920,7 @@ snapshots: colorette: 2.0.20 gzip-size: 7.0.0 pretty-bytes: 6.1.1 + optionalDependencies: rollup: 4.12.0 rollup-plugin-output-size@1.3.0(rollup@4.14.3): @@ -22822,6 +22928,7 @@ snapshots: colorette: 2.0.20 gzip-size: 7.0.0 pretty-bytes: 6.1.1 + optionalDependencies: rollup: 4.14.3 rollup@4.12.0: @@ -23297,23 +23404,23 @@ snapshots: dependencies: inline-style-parser: 0.1.1 - stylelint-config-xo@0.22.0(stylelint@15.11.0): + stylelint-config-xo@0.22.0(stylelint@15.11.0(typescript@5.3.3)): dependencies: stylelint: 15.11.0(typescript@5.3.3) - stylelint-declaration-block-no-ignored-properties: 2.8.0(stylelint@15.11.0) - stylelint-order: 6.0.4(stylelint@15.11.0) + stylelint-declaration-block-no-ignored-properties: 2.8.0(stylelint@15.11.0(typescript@5.3.3)) + stylelint-order: 6.0.4(stylelint@15.11.0(typescript@5.3.3)) - stylelint-declaration-block-no-ignored-properties@2.8.0(stylelint@15.11.0): + stylelint-declaration-block-no-ignored-properties@2.8.0(stylelint@15.11.0(typescript@5.3.3)): dependencies: stylelint: 15.11.0(typescript@5.3.3) - stylelint-order@6.0.4(stylelint@15.11.0): + stylelint-order@6.0.4(stylelint@15.11.0(typescript@5.3.3)): dependencies: postcss: 8.4.38 postcss-sorting: 8.0.2(postcss@8.4.38) stylelint: 15.11.0(typescript@5.3.3) - stylelint-scss@6.2.1(stylelint@15.11.0): + stylelint-scss@6.2.1(stylelint@15.11.0(typescript@5.3.3)): dependencies: known-css-properties: 0.29.0 postcss-media-query-parser: 0.2.3 @@ -23326,7 +23433,7 @@ snapshots: dependencies: '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) '@csstools/css-tokenizer': 2.2.4 - '@csstools/media-query-list-parser': 2.1.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/media-query-list-parser': 2.1.9(@csstools/css-parser-algorithms@2.6.1(@csstools/css-tokenizer@2.2.4))(@csstools/css-tokenizer@2.2.4) '@csstools/selector-specificity': 3.0.3(postcss-selector-parser@6.0.16) balanced-match: 2.0.0 colord: 2.9.3 @@ -23572,10 +23679,9 @@ snapshots: dependencies: typescript: 5.3.3 - ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.12.7)(typescript@5.3.3): + ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.3.52 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 @@ -23590,6 +23696,27 @@ snapshots: typescript: 5.3.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.3.52(@swc/helpers@0.5.1) + + ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.10.4 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.3.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true tsconfig-paths@3.15.0: dependencies: @@ -23879,13 +24006,13 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - vite-node@1.4.0(@types/node@20.10.4): + vite-node@1.4.0(@types/node@20.10.4)(sass@1.56.1): dependencies: cac: 6.7.14 debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.9(@types/node@20.10.4) + vite: 5.2.9(@types/node@20.10.4)(sass@1.56.1) transitivePeerDependencies: - '@types/node' - less @@ -23896,13 +24023,13 @@ snapshots: - supports-color - terser - vite-node@1.4.0(@types/node@20.11.20): + vite-node@1.4.0(@types/node@20.11.20)(sass@1.56.1): dependencies: cac: 6.7.14 debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.9(@types/node@20.11.20) + vite: 5.2.9(@types/node@20.11.20)(sass@1.56.1) transitivePeerDependencies: - '@types/node' - less @@ -23913,13 +24040,13 @@ snapshots: - supports-color - terser - vite-node@1.4.0(@types/node@20.12.7): + vite-node@1.4.0(@types/node@20.12.7)(sass@1.56.1): dependencies: cac: 6.7.14 debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.9(@types/node@20.12.7) + vite: 5.2.9(@types/node@20.12.7)(sass@1.56.1) transitivePeerDependencies: - '@types/node' - less @@ -23930,36 +24057,72 @@ snapshots: - supports-color - terser - vite@5.2.9(@types/node@20.10.4): + vite@5.2.9(@types/node@20.10.4)(sass@1.56.1): dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.14.3 + optionalDependencies: '@types/node': 20.10.4 + fsevents: 2.3.3 + sass: 1.56.1 + + vite@5.2.9(@types/node@20.11.20)(sass@1.56.1): + dependencies: esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.14.3 optionalDependencies: - fsevents: 2.3.3 - - vite@5.2.9(@types/node@20.11.20): - dependencies: '@types/node': 20.11.20 + fsevents: 2.3.3 + sass: 1.56.1 + + vite@5.2.9(@types/node@20.12.7)(sass@1.56.1): + dependencies: esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.14.3 optionalDependencies: - fsevents: 2.3.3 - - vite@5.2.9(@types/node@20.12.7): - dependencies: '@types/node': 20.12.7 - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.14.3 - optionalDependencies: fsevents: 2.3.3 + sass: 1.56.1 - vitest@1.4.0(@types/node@20.10.4): + vitest@1.4.0(@types/node@20.10.4)(jsdom@20.0.2)(sass@1.56.1): dependencies: + '@vitest/expect': 1.4.0 + '@vitest/runner': 1.4.0 + '@vitest/snapshot': 1.4.0 + '@vitest/spy': 1.4.0 + '@vitest/utils': 1.4.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.7 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.2 + vite: 5.2.9(@types/node@20.10.4)(sass@1.56.1) + vite-node: 1.4.0(@types/node@20.10.4)(sass@1.56.1) + why-is-node-running: 2.2.2 + optionalDependencies: '@types/node': 20.10.4 + jsdom: 20.0.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vitest@1.4.0(@types/node@20.11.20)(jsdom@20.0.2)(sass@1.56.1): + dependencies: '@vitest/expect': 1.4.0 '@vitest/runner': 1.4.0 '@vitest/snapshot': 1.4.0 @@ -23977,41 +24140,12 @@ snapshots: strip-literal: 2.0.0 tinybench: 2.6.0 tinypool: 0.8.2 - vite: 5.2.9(@types/node@20.10.4) - vite-node: 1.4.0(@types/node@20.10.4) + vite: 5.2.9(@types/node@20.11.20)(sass@1.56.1) + vite-node: 1.4.0(@types/node@20.11.20)(sass@1.56.1) why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - vitest@1.4.0(@types/node@20.11.20): - dependencies: + optionalDependencies: '@types/node': 20.11.20 - '@vitest/expect': 1.4.0 - '@vitest/runner': 1.4.0 - '@vitest/snapshot': 1.4.0 - '@vitest/spy': 1.4.0 - '@vitest/utils': 1.4.0 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.4 - execa: 8.0.1 - local-pkg: 0.5.0 - magic-string: 0.30.7 - pathe: 1.1.2 - picocolors: 1.0.0 - std-env: 3.7.0 - strip-literal: 2.0.0 - tinybench: 2.6.0 - tinypool: 0.8.2 - vite: 5.2.9(@types/node@20.11.20) - vite-node: 1.4.0(@types/node@20.11.20) - why-is-node-running: 2.2.2 + jsdom: 20.0.2 transitivePeerDependencies: - less - lightningcss @@ -24021,9 +24155,8 @@ snapshots: - supports-color - terser - vitest@1.4.0(@types/node@20.12.7): + vitest@1.4.0(@types/node@20.12.7)(jsdom@20.0.2)(sass@1.56.1): dependencies: - '@types/node': 20.12.7 '@vitest/expect': 1.4.0 '@vitest/runner': 1.4.0 '@vitest/snapshot': 1.4.0 @@ -24041,9 +24174,12 @@ snapshots: strip-literal: 2.0.0 tinybench: 2.6.0 tinypool: 0.8.2 - vite: 5.2.9(@types/node@20.12.7) - vite-node: 1.4.0(@types/node@20.12.7) + vite: 5.2.9(@types/node@20.12.7)(sass@1.56.1) + vite-node: 1.4.0(@types/node@20.12.7)(sass@1.56.1) why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.12.7 + jsdom: 20.0.2 transitivePeerDependencies: - less - lightningcss