0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-01-06 20:40:08 -05:00

refactor: loose redirect uri restrictions ()

* refactor: loose redirect uri restrictions

* refactor: fix types and add tests

* chore: add changeset
This commit is contained in:
Gao Sun 2024-12-04 15:37:16 +08:00 committed by GitHub
parent 352f4d1a5f
commit 239b81e31a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
43 changed files with 377 additions and 184 deletions

View file

@ -0,0 +1,20 @@
---
"@logto/integration-tests": patch
"@logto/core-kit": patch
"@logto/console": patch
"@logto/phrases": patch
"@logto/core": patch
---
loose redirect uri restrictions
Logto has been following the industry best practices for OAuth2.0 and OIDC from the start. However, in the real world, there are things we cannot control, like third-party services or operation systems like Windows.
This update relaxes restrictions on redirect URIs to allow the following:
1. A mix of native and HTTP(S) redirect URIs. For example, a native app can now use a redirect URI like `https://example.com`.
2. Native schemes without a period (`.`). For example, `myapp://callback` is now allowed.
When such URIs are configured, Logto Console will display a prominent warning. This change is backward-compatible and will not affect existing applications.
We hope this change will make it easier for you to integrate Logto with your applications.

View file

@ -8,6 +8,7 @@ import FormCard from '@/components/FormCard';
import MultiTextInputField from '@/components/MultiTextInputField'; import MultiTextInputField from '@/components/MultiTextInputField';
import CodeEditor from '@/ds-components/CodeEditor'; import CodeEditor from '@/ds-components/CodeEditor';
import FormField from '@/ds-components/FormField'; import FormField from '@/ds-components/FormField';
import InlineNotification from '@/ds-components/InlineNotification';
import type { MultiTextInputRule } from '@/ds-components/MultiTextInput/types'; import type { MultiTextInputRule } from '@/ds-components/MultiTextInput/types';
import { import {
convertRhfErrorMessage, convertRhfErrorMessage,
@ -19,8 +20,33 @@ import useDocumentationUrl from '@/hooks/use-documentation-url';
import { isJsonObject } from '@/utils/json'; import { isJsonObject } from '@/utils/json';
import ProtectedAppSettings from './ProtectedAppSettings'; import ProtectedAppSettings from './ProtectedAppSettings';
import styles from './index.module.scss';
import { type ApplicationForm } from './utils'; import { type ApplicationForm } from './utils';
const hasMixedUriProtocols = (applicationType: ApplicationType, uris: string[]): boolean => {
switch (applicationType) {
case ApplicationType.Native: {
return uris.some((uri) => validateRedirectUrl(uri, 'web'));
}
case ApplicationType.Traditional:
case ApplicationType.SPA: {
return uris.some((uri) => validateRedirectUrl(uri, 'mobile'));
}
default: {
return false;
}
}
};
function MixedUriWarning() {
const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' });
return (
<InlineNotification severity="alert" className={styles.mixedUriWarning}>
{t('application_details.mixed_redirect_uri_warning')}
</InlineNotification>
);
}
type Props = { type Props = {
readonly data: Application; readonly data: Application;
}; };
@ -31,19 +57,27 @@ function Settings({ data }: Props) {
const { const {
control, control,
register, register,
watch,
formState: { errors }, formState: { errors },
} = useFormContext<ApplicationForm>(); } = useFormContext<ApplicationForm>();
const { type: applicationType } = data; const { type: applicationType } = data;
const isNativeApp = applicationType === ApplicationType.Native;
const isProtectedApp = applicationType === ApplicationType.Protected; const isProtectedApp = applicationType === ApplicationType.Protected;
const uriPatternRules: MultiTextInputRule = { const uriPatternRules: MultiTextInputRule = {
pattern: { pattern: {
verify: (value) => !value || validateRedirectUrl(value, isNativeApp ? 'mobile' : 'web'), verify: (value) =>
!value || validateRedirectUrl(value, 'web') || validateRedirectUrl(value, 'mobile'),
message: t('errors.invalid_uri_format'), message: t('errors.invalid_uri_format'),
}, },
}; };
const redirectUris = watch('oidcClientMetadata.redirectUris');
const postLogoutRedirectUris = watch('oidcClientMetadata.postLogoutRedirectUris');
const showRedirectUriMixedWarning = hasMixedUriProtocols(applicationType, redirectUris);
const showPostLogoutUriMixedWarning = hasMixedUriProtocols(
applicationType,
postLogoutRedirectUris
);
if (isProtectedApp) { if (isProtectedApp) {
return <ProtectedAppSettings data={data} />; return <ProtectedAppSettings data={data} />;
@ -113,6 +147,7 @@ function Settings({ data }: Props) {
)} )}
/> />
)} )}
{showRedirectUriMixedWarning && <MixedUriWarning />}
{applicationType !== ApplicationType.MachineToMachine && ( {applicationType !== ApplicationType.MachineToMachine && (
<Controller <Controller
name="oidcClientMetadata.postLogoutRedirectUris" name="oidcClientMetadata.postLogoutRedirectUris"
@ -133,6 +168,7 @@ function Settings({ data }: Props) {
)} )}
/> />
)} )}
{showPostLogoutUriMixedWarning && <MixedUriWarning />}
{applicationType !== ApplicationType.MachineToMachine && ( {applicationType !== ApplicationType.MachineToMachine && (
<Controller <Controller
name="customClientMetadata.corsAllowedOrigins" name="customClientMetadata.corsAllowedOrigins"

View file

@ -22,3 +22,7 @@
display: flex; display: flex;
} }
} }
.mixedUriWarning {
margin-block-start: _.unit(2);
}

View file

@ -81,7 +81,7 @@
"lru-cache": "^11.0.0", "lru-cache": "^11.0.0",
"nanoid": "^5.0.1", "nanoid": "^5.0.1",
"node-forge": "^1.3.1", "node-forge": "^1.3.1",
"oidc-provider": "^8.4.6", "oidc-provider": "github:logto-io/node-oidc-provider#de2d8fd68e91b76d71fb910d44142f9eccd844bc",
"openapi-types": "^12.1.3", "openapi-types": "^12.1.3",
"otplib": "^12.0.1", "otplib": "^12.0.1",
"p-map": "^7.0.2", "p-map": "^7.0.2",
@ -89,7 +89,7 @@
"pg-protocol": "^1.6.0", "pg-protocol": "^1.6.0",
"pluralize": "^8.0.0", "pluralize": "^8.0.0",
"qrcode": "^1.5.3", "qrcode": "^1.5.3",
"raw-body": "^2.5.2", "raw-body": "^3.0.0",
"redis": "^4.6.14", "redis": "^4.6.14",
"roarr": "^7.11.0", "roarr": "^7.11.0",
"samlify": "2.8.11", "samlify": "2.8.11",
@ -116,7 +116,7 @@
"@types/koa__cors": "^5.0.0", "@types/koa__cors": "^5.0.0",
"@types/node": "^20.9.5", "@types/node": "^20.9.5",
"@types/node-forge": "^1.3.1", "@types/node-forge": "^1.3.1",
"@types/oidc-provider": "^8.4.4", "@types/oidc-provider": "^8.5.2",
"@types/pluralize": "^0.0.33", "@types/pluralize": "^0.0.33",
"@types/qrcode": "^1.5.2", "@types/qrcode": "^1.5.2",
"@types/semver": "^7.3.12", "@types/semver": "^7.3.12",

View file

@ -1,4 +1,4 @@
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import type Queries from '#src/tenants/Queries.js'; import type Queries from '#src/tenants/Queries.js';
import { getConsoleLogFromContext } from '#src/utils/console.js'; import { getConsoleLogFromContext } from '#src/utils/console.js';

View file

@ -1,7 +1,6 @@
// https://github.com/panva/node-oidc-provider/blob/cf2069cbb31a6a855876e95157372d25dde2511c/lib/helpers/filter_claims.js // https://github.com/panva/node-oidc-provider/blob/cf2069cbb31a6a855876e95157372d25dde2511c/lib/helpers/filter_claims.js
declare module 'oidc-provider/lib/helpers/filter_claims.js' { declare module 'oidc-provider/lib/helpers/filter_claims.js' {
import { type ClaimsParameter } from 'oidc-provider'; import type { ClaimsParameter, Provider } from 'oidc-provider';
import type Provider from 'oidc-provider';
export default function filterClaims( export default function filterClaims(
source: ClaimsParameter | undefined, source: ClaimsParameter | undefined,

View file

@ -1,5 +1,5 @@
declare module 'oidc-provider/lib/helpers/weak_cache.js' { declare module 'oidc-provider/lib/helpers/weak_cache.js' {
import type Provider, { type Configuration } from 'oidc-provider'; import type { Provider, Configuration } from 'oidc-provider';
/** Deeply make all properties of a record required. */ /** Deeply make all properties of a record required. */
type DeepRequired<T> = T extends Record<string | number | symbol, unknown> type DeepRequired<T> = T extends Record<string | number | symbol, unknown>

View file

@ -1,6 +1,6 @@
import { type User } from '@logto/schemas'; import { type User } from '@logto/schemas';
import { generateStandardId } from '@logto/shared'; import { generateStandardId } from '@logto/shared';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { mockUser } from '#src/__mocks__/user.js'; import { mockUser } from '#src/__mocks__/user.js';
import type Queries from '#src/tenants/Queries.js'; import type Queries from '#src/tenants/Queries.js';

View file

@ -1,7 +1,6 @@
import { conditional } from '@silverhand/essentials'; import { conditional } from '@silverhand/essentials';
import type { Context } from 'koa'; import type { Context } from 'koa';
import type { InteractionResults, PromptDetail } from 'oidc-provider'; import type { InteractionResults, PromptDetail, Provider } from 'oidc-provider';
import type Provider from 'oidc-provider';
import { z } from 'zod'; import { z } from 'zod';
import type Queries from '#src/tenants/Queries.js'; import type Queries from '#src/tenants/Queries.js';

View file

@ -1,7 +1,7 @@
import { pickDefault } from '@logto/shared/esm'; import { pickDefault } from '@logto/shared/esm';
import type { Context } from 'koa'; import type { Context } from 'koa';
import type { IRouterParamContext } from 'koa-router'; import type { IRouterParamContext } from 'koa-router';
import Provider from 'oidc-provider'; import { Provider } from 'oidc-provider';
import Sinon from 'sinon'; import Sinon from 'sinon';
import RequestError from '#src/errors/RequestError/index.js'; import RequestError from '#src/errors/RequestError/index.js';

View file

@ -1,7 +1,7 @@
import { demoAppApplicationId } from '@logto/schemas'; import { demoAppApplicationId } from '@logto/schemas';
import { type MiddlewareType } from 'koa'; import { type MiddlewareType } from 'koa';
import { type IRouterParamContext } from 'koa-router'; import { type IRouterParamContext } from 'koa-router';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { errors } from 'oidc-provider'; import { errors } from 'oidc-provider';
import { consent, getMissingScopes } from '#src/libraries/session.js'; import { consent, getMissingScopes } from '#src/libraries/session.js';

View file

@ -1,6 +1,6 @@
import type { MiddlewareType } from 'koa'; import type { MiddlewareType } from 'koa';
import { type IRouterParamContext } from 'koa-router'; import { type IRouterParamContext } from 'koa-router';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
export type WithInteractionDetailsContext< export type WithInteractionDetailsContext<
ContextT extends IRouterParamContext = IRouterParamContext, ContextT extends IRouterParamContext = IRouterParamContext,

View file

@ -1,5 +1,5 @@
import { createMockUtils } from '@logto/shared/esm'; import { createMockUtils } from '@logto/shared/esm';
import Provider from 'oidc-provider'; import { Provider } from 'oidc-provider';
import Sinon from 'sinon'; import Sinon from 'sinon';
import { EnvSet, UserApps } from '#src/env-set/index.js'; import { EnvSet, UserApps } from '#src/env-set/index.js';

View file

@ -2,7 +2,7 @@ import { logtoConfigGuards, LogtoTenantConfigKey } from '@logto/schemas';
import { appendPath, trySafe } from '@silverhand/essentials'; import { appendPath, trySafe } from '@silverhand/essentials';
import type { MiddlewareType } from 'koa'; import type { MiddlewareType } from 'koa';
import type { IRouterParamContext } from 'koa-router'; import type { IRouterParamContext } from 'koa-router';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { EnvSet, getTenantEndpoint } from '#src/env-set/index.js'; import { EnvSet, getTenantEndpoint } from '#src/env-set/index.js';
import RequestError from '#src/errors/RequestError/index.js'; import RequestError from '#src/errors/RequestError/index.js';

View file

@ -1,5 +1,4 @@
import type Provider from 'oidc-provider'; import type { Provider, TTLFunction, KoaContextWithOIDC } from 'oidc-provider';
import type { TTLFunction, KoaContextWithOIDC } from 'oidc-provider';
/** /**
* Keep the default pre-checks from oidc-provider. * Keep the default pre-checks from oidc-provider.

View file

@ -20,7 +20,7 @@
*/ */
import { cond } from '@silverhand/essentials'; import { cond } from '@silverhand/essentials';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { errors } from 'oidc-provider'; import { errors } from 'oidc-provider';
import instance from 'oidc-provider/lib/helpers/weak_cache.js'; import instance from 'oidc-provider/lib/helpers/weak_cache.js';
import checkResource from 'oidc-provider/lib/shared/check_resource.js'; import checkResource from 'oidc-provider/lib/shared/check_resource.js';

View file

@ -1,5 +1,5 @@
import { GrantType } from '@logto/schemas'; import { GrantType } from '@logto/schemas';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import instance from 'oidc-provider/lib/helpers/weak_cache.js'; import instance from 'oidc-provider/lib/helpers/weak_cache.js';
import { type EnvSet } from '#src/env-set/index.js'; import { type EnvSet } from '#src/env-set/index.js';

View file

@ -21,7 +21,7 @@
import { UserScope } from '@logto/core-kit'; import { UserScope } from '@logto/core-kit';
import { isKeyInObject } from '@silverhand/essentials'; import { isKeyInObject } from '@silverhand/essentials';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { errors } from 'oidc-provider'; import { errors } from 'oidc-provider';
import difference from 'oidc-provider/lib/helpers/_/difference.js'; import difference from 'oidc-provider/lib/helpers/_/difference.js';
import filterClaims from 'oidc-provider/lib/helpers/filter_claims.js'; import filterClaims from 'oidc-provider/lib/helpers/filter_claims.js';

View file

@ -6,7 +6,7 @@
import { buildOrganizationUrn } from '@logto/core-kit'; import { buildOrganizationUrn } from '@logto/core-kit';
import { GrantType } from '@logto/schemas'; import { GrantType } from '@logto/schemas';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { errors } from 'oidc-provider'; import { errors } from 'oidc-provider';
import resolveResource from 'oidc-provider/lib/helpers/resolve_resource.js'; import resolveResource from 'oidc-provider/lib/helpers/resolve_resource.js';
import validatePresence from 'oidc-provider/lib/helpers/validate_presence.js'; import validatePresence from 'oidc-provider/lib/helpers/validate_presence.js';

View file

@ -1,7 +1,7 @@
import { buildOrganizationUrn } from '@logto/core-kit'; import { buildOrganizationUrn } from '@logto/core-kit';
import { cond } from '@silverhand/essentials'; import { cond } from '@silverhand/essentials';
import type Provider from 'oidc-provider'; import { errors } from 'oidc-provider';
import { type Account, errors, type KoaContextWithOIDC } from 'oidc-provider'; import type { Provider, Account, KoaContextWithOIDC } from 'oidc-provider';
import certificateThumbprint from 'oidc-provider/lib/helpers/certificate_thumbprint.js'; import certificateThumbprint from 'oidc-provider/lib/helpers/certificate_thumbprint.js';
import epochTime from 'oidc-provider/lib/helpers/epoch_time.js'; import epochTime from 'oidc-provider/lib/helpers/epoch_time.js';
import dpopValidate from 'oidc-provider/lib/helpers/validate_dpop.js'; import dpopValidate from 'oidc-provider/lib/helpers/validate_dpop.js';

View file

@ -18,7 +18,7 @@ import {
} from '@logto/schemas'; } from '@logto/schemas';
import { removeUndefinedKeys, trySafe, tryThat } from '@silverhand/essentials'; import { removeUndefinedKeys, trySafe, tryThat } from '@silverhand/essentials';
import i18next from 'i18next'; import i18next from 'i18next';
import Provider, { errors } from 'oidc-provider'; import { Provider, errors } from 'oidc-provider';
import getRawBody from 'raw-body'; import getRawBody from 'raw-body';
import snakecaseKeys from 'snakecase-keys'; import snakecaseKeys from 'snakecase-keys';
@ -77,6 +77,7 @@ export default function initOidc(
sameSite: 'lax', sameSite: 'lax',
path: '/', path: '/',
signed: true, signed: true,
overwrite: true,
} as const); } as const);
// Do NOT deconstruct variables from `envSet` earlier, since we might reload `envSet` on the fly, // Do NOT deconstruct variables from `envSet` earlier, since we might reload `envSet` on the fly,

View file

@ -7,7 +7,7 @@ import {
UserSsoIdentities, UserSsoIdentities,
type UserSsoIdentity, type UserSsoIdentity,
} from '@logto/schemas'; } from '@logto/schemas';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { z } from 'zod'; import { z } from 'zod';
import { type WithLogContext } from '#src/middleware/koa-audit-log.js'; import { type WithLogContext } from '#src/middleware/koa-audit-log.js';

View file

@ -1,6 +1,6 @@
import { InteractionEvent, MfaFactor, adminTenantId } from '@logto/schemas'; import { InteractionEvent, MfaFactor, adminTenantId } from '@logto/schemas';
import { createMockUtils, pickDefault } from '@logto/shared/esm'; import { createMockUtils, pickDefault } from '@logto/shared/esm';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { mockWebAuthnBind } from '#src/__mocks__/mfa-verification.js'; import { mockWebAuthnBind } from '#src/__mocks__/mfa-verification.js';
import { createMockLogContext } from '#src/test-utils/koa-audit-log.js'; import { createMockLogContext } from '#src/test-utils/koa-audit-log.js';

View file

@ -6,7 +6,7 @@ import {
type User, type User,
} from '@logto/schemas'; } from '@logto/schemas';
import { createMockUtils, pickDefault } from '@logto/shared/esm'; import { createMockUtils, pickDefault } from '@logto/shared/esm';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { type InsertUserResult } from '#src/libraries/user.js'; import { type InsertUserResult } from '#src/libraries/user.js';
import { createMockLogContext } from '#src/test-utils/koa-audit-log.js'; import { createMockLogContext } from '#src/test-utils/koa-audit-log.js';

View file

@ -2,8 +2,7 @@ import type { Profile } from '@logto/schemas';
import { InteractionEvent } from '@logto/schemas'; import { InteractionEvent } from '@logto/schemas';
import { assert } from '@silverhand/essentials'; import { assert } from '@silverhand/essentials';
import type { Context } from 'koa'; import type { Context } from 'koa';
import type Provider from 'oidc-provider'; import type { Provider, InteractionResults } from 'oidc-provider';
import type { InteractionResults } from 'oidc-provider';
import { errors } from 'oidc-provider'; import { errors } from 'oidc-provider';
import RequestError from '#src/errors/RequestError/index.js'; import RequestError from '#src/errors/RequestError/index.js';

View file

@ -1,5 +1,5 @@
import { type Context } from 'koa'; import { type Context } from 'koa';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { z } from 'zod'; import { z } from 'zod';
import { import {

View file

@ -1,6 +1,6 @@
/* eslint-disable max-lines */ /* eslint-disable max-lines */
import { createMockUtils } from '@logto/shared/esm'; import { createMockUtils } from '@logto/shared/esm';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import Sinon from 'sinon'; import Sinon from 'sinon';
import { import {

View file

@ -3,7 +3,7 @@ import { connectorSessionGuard, GoogleConnector } from '@logto/connector-kit';
import type { SocialConnectorPayload } from '@logto/schemas'; import type { SocialConnectorPayload } from '@logto/schemas';
import { ConnectorType } from '@logto/schemas'; import { ConnectorType } from '@logto/schemas';
import type { Context } from 'koa'; import type { Context } from 'koa';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { z } from 'zod'; import { z } from 'zod';
import type { WithLogContext } from '#src/middleware/koa-audit-log.js'; import type { WithLogContext } from '#src/middleware/koa-audit-log.js';

View file

@ -3,7 +3,7 @@ import crypto from 'node:crypto';
import { PasswordPolicyChecker } from '@logto/core-kit'; import { PasswordPolicyChecker } from '@logto/core-kit';
import { InteractionEvent, MissingProfile, SignInIdentifier } from '@logto/schemas'; import { InteractionEvent, MissingProfile, SignInIdentifier } from '@logto/schemas';
import { createMockUtils, pickDefault } from '@logto/shared/esm'; import { createMockUtils, pickDefault } from '@logto/shared/esm';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { mockSignInExperience } from '#src/__mocks__/sign-in-experience.js'; import { mockSignInExperience } from '#src/__mocks__/sign-in-experience.js';
import RequestError from '#src/errors/RequestError/index.js'; import RequestError from '#src/errors/RequestError/index.js';

View file

@ -1,6 +1,6 @@
import { InteractionEvent, MfaFactor } from '@logto/schemas'; import { InteractionEvent, MfaFactor } from '@logto/schemas';
import { createMockUtils } from '@logto/shared/esm'; import { createMockUtils } from '@logto/shared/esm';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { import {
mockUserBackupCodeMfaVerification, mockUserBackupCodeMfaVerification,

View file

@ -3,7 +3,7 @@ import crypto from 'node:crypto';
import { PasswordPolicyChecker } from '@logto/core-kit'; import { PasswordPolicyChecker } from '@logto/core-kit';
import { InteractionEvent, MfaFactor, MfaPolicy } from '@logto/schemas'; import { InteractionEvent, MfaFactor, MfaPolicy } from '@logto/schemas';
import { createMockUtils } from '@logto/shared/esm'; import { createMockUtils } from '@logto/shared/esm';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { mockBackupCodeBind, mockTotpBind } from '#src/__mocks__/mfa-verification.js'; import { mockBackupCodeBind, mockTotpBind } from '#src/__mocks__/mfa-verification.js';
import { mockSignInExperience } from '#src/__mocks__/sign-in-experience.js'; import { mockSignInExperience } from '#src/__mocks__/sign-in-experience.js';

View file

@ -3,7 +3,7 @@ import crypto from 'node:crypto';
import { PasswordPolicyChecker } from '@logto/core-kit'; import { PasswordPolicyChecker } from '@logto/core-kit';
import { InteractionEvent, MfaFactor, MfaPolicy } from '@logto/schemas'; import { InteractionEvent, MfaFactor, MfaPolicy } from '@logto/schemas';
import { createMockUtils } from '@logto/shared/esm'; import { createMockUtils } from '@logto/shared/esm';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { mockSignInExperience } from '#src/__mocks__/sign-in-experience.js'; import { mockSignInExperience } from '#src/__mocks__/sign-in-experience.js';
import { import {

View file

@ -6,7 +6,7 @@ import {
type MfaVerification, type MfaVerification,
} from '@logto/schemas'; } from '@logto/schemas';
import { type Context } from 'koa'; import { type Context } from 'koa';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { z } from 'zod'; import { z } from 'zod';
import RequestError from '#src/errors/RequestError/index.js'; import RequestError from '#src/errors/RequestError/index.js';

View file

@ -5,7 +5,7 @@ import Koa from 'koa';
import compose from 'koa-compose'; import compose from 'koa-compose';
import koaCompress from 'koa-compress'; import koaCompress from 'koa-compress';
import mount from 'koa-mount'; import mount from 'koa-mount';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { type CacheStore } from '#src/caches/types.js'; import { type CacheStore } from '#src/caches/types.js';
import { WellKnownCache } from '#src/caches/well-known.js'; import { WellKnownCache } from '#src/caches/well-known.js';

View file

@ -1,5 +1,5 @@
import { type Sentinel } from '@logto/schemas'; import { type Sentinel } from '@logto/schemas';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import type { EnvSet } from '#src/env-set/index.js'; import type { EnvSet } from '#src/env-set/index.js';
import type { CloudConnectionLibrary } from '#src/libraries/cloud-connection.js'; import type { CloudConnectionLibrary } from '#src/libraries/cloud-connection.js';

View file

@ -1,4 +1,5 @@
import Provider, { type KoaContextWithOIDC } from 'oidc-provider'; import { type KoaContextWithOIDC } from 'oidc-provider';
import { Provider } from 'oidc-provider';
import Sinon from 'sinon'; import Sinon from 'sinon';
import createMockContext from './jest-koa-mocks/create-mock-context.js'; import createMockContext from './jest-koa-mocks/create-mock-context.js';

View file

@ -1,6 +1,6 @@
import type { ConnectorSession } from '@logto/connector-kit'; import type { ConnectorSession } from '@logto/connector-kit';
import { connectorSessionGuard } from '@logto/connector-kit'; import { connectorSessionGuard } from '@logto/connector-kit';
import type Provider from 'oidc-provider'; import type { Provider } from 'oidc-provider';
import { z } from 'zod'; import { z } from 'zod';
import { import {

View file

@ -134,6 +134,43 @@ describe('application APIs', () => {
}); });
}); });
it('should be able to add a native redirect uri to a web application, and vice versa', async () => {
const [application1, application2] = await Promise.all([
createApplication('test-update-app-1', ApplicationType.Native),
createApplication('test-update-app-2', ApplicationType.SPA),
]);
const nativeRedirectUri = 'io.logto://my-app/callback';
const webRedirectUri = 'https://example.com/callback';
await Promise.all([
updateApplication(application1.id, {
oidcClientMetadata: {
...application1.oidcClientMetadata,
redirectUris: [nativeRedirectUri],
postLogoutRedirectUris: [nativeRedirectUri],
},
}),
updateApplication(application2.id, {
oidcClientMetadata: {
...application2.oidcClientMetadata,
redirectUris: [webRedirectUri],
postLogoutRedirectUris: [webRedirectUri],
},
}),
]);
const [updated1, updated2] = await Promise.all([
getApplication(application1.id),
getApplication(application2.id),
]);
expect(updated1.oidcClientMetadata.redirectUris).toEqual([nativeRedirectUri]);
expect(updated1.oidcClientMetadata.postLogoutRedirectUris).toEqual([nativeRedirectUri]);
expect(updated2.oidcClientMetadata.redirectUris).toEqual([webRedirectUri]);
expect(updated2.oidcClientMetadata.postLogoutRedirectUris).toEqual([webRedirectUri]);
});
it('should update application details for protected app successfully', async () => { it('should update application details for protected app successfully', async () => {
const metadata = { const metadata = {
origin: 'https://example.com', origin: 'https://example.com',

View file

@ -0,0 +1,70 @@
/**
* @fileoverview Tests for mixed redirect URI protocols. It means web applications can have native
* redirect URIs and vice versa. Both should work without any issues.
*/
import { Prompt } from '@logto/js';
import { ApplicationType, InteractionEvent } from '@logto/schemas';
import { deleteUser } from '#src/api/admin-user.js';
import { createApplication } from '#src/api/application.js';
import { putInteraction } from '#src/api/interaction.js';
import MockClient from '#src/client/index.js';
import { processSession } from '#src/helpers/client.js';
import { createUserByAdmin } from '#src/helpers/index.js';
import { enableAllPasswordSignInMethods } from '#src/helpers/sign-in-experience.js';
import { generatePassword, generateUsername } from '#src/utils.js';
describe('mixed redirect URI protocols', () => {
const username = generateUsername();
const password = generatePassword();
// eslint-disable-next-line @silverhand/fp/no-let
let userId = '';
const run = async (applicationType: ApplicationType) => {
if (
![ApplicationType.Native, ApplicationType.Traditional, ApplicationType.SPA].includes(
applicationType
)
) {
throw new Error('Unsupported application type');
}
const redirectUri =
applicationType === ApplicationType.Native ? 'http://localhost' : 'myapp://callback';
const application = await createApplication('Mixed Redirect URI', applicationType, {
oidcClientMetadata: { redirectUris: [redirectUri], postLogoutRedirectUris: [redirectUri] },
});
const client = new MockClient({
appId: application.id,
prompt: Prompt.Login,
scopes: [],
});
await client.initSession(redirectUri);
await client.successSend(putInteraction, {
event: InteractionEvent.SignIn,
identifier: { username, password },
});
const { redirectTo } = await client.submitInteraction();
await processSession(client, redirectTo);
};
beforeAll(async () => {
const { id } = await createUserByAdmin({ username, password });
// eslint-disable-next-line @silverhand/fp/no-mutation
userId = id;
await enableAllPasswordSignInMethods();
});
afterAll(async () => {
await deleteUser(userId);
});
it('should work for native applications', async () => {
await run(ApplicationType.Native);
});
it('should work for web applications', async () => {
await run(ApplicationType.SPA);
});
});

View file

@ -40,6 +40,8 @@ const application_details = {
redirect_uri_placeholder_native: 'io.logto://callback', redirect_uri_placeholder_native: 'io.logto://callback',
redirect_uri_tip: redirect_uri_tip:
'The URI redirects after a user sign-in (whether successful or not). See OpenID Connect <a>AuthRequest</a> for more info.', 'The URI redirects after a user sign-in (whether successful or not). See OpenID Connect <a>AuthRequest</a> for more info.',
mixed_redirect_uri_warning:
'Your application type is not compatible with at least one of the redirect URIs. It does not follow best practices and we strongly recommend keeping the redirect URIs consistent.',
post_sign_out_redirect_uri: 'Post sign-out redirect URI', post_sign_out_redirect_uri: 'Post sign-out redirect URI',
post_sign_out_redirect_uris: 'Post sign-out redirect URIs', post_sign_out_redirect_uris: 'Post sign-out redirect URIs',
post_sign_out_redirect_uri_placeholder: 'https://your.website.com/home', post_sign_out_redirect_uri_placeholder: 'https://your.website.com/home',

View file

@ -3,7 +3,7 @@ export const phoneRegEx = /^\d+$/;
export const phoneInputRegEx = /^\+?[\d-( )]+$/; export const phoneInputRegEx = /^\+?[\d-( )]+$/;
export const usernameRegEx = /^[A-Z_a-z]\w*$/; export const usernameRegEx = /^[A-Z_a-z]\w*$/;
export const webRedirectUriProtocolRegEx = /^https?:$/; export const webRedirectUriProtocolRegEx = /^https?:$/;
export const mobileUriSchemeProtocolRegEx = /^[a-z][\d+_a-z-]*(\.[\d+_a-z-]+)+:$/; export const mobileUriSchemeProtocolRegEx = /^(?!http(s)?:)[a-z][\d+_a-z-]*(\.[\d+_a-z-]+)*:$/;
export const hexColorRegEx = /^#[\da-f]{3}([\da-f]{3})?$/i; export const hexColorRegEx = /^#[\da-f]{3}([\da-f]{3})?$/i;
export const dateRegex = /^\d{4}(-\d{2}){2}/; export const dateRegex = /^\d{4}(-\d{2}){2}/;
export const noSpaceRegEx = /^\S+$/; export const noSpaceRegEx = /^\S+$/;

View file

@ -19,6 +19,8 @@ describe('url utilities', () => {
expect(validateRedirectUrl('com.company://demo:1234', 'mobile')).toBeTruthy(); expect(validateRedirectUrl('com.company://demo:1234', 'mobile')).toBeTruthy();
expect(validateRedirectUrl('io.logto.SwiftUI-Demo://callback', 'mobile')).toBeTruthy(); expect(validateRedirectUrl('io.logto.SwiftUI-Demo://callback', 'mobile')).toBeTruthy();
expect(validateRedirectUrl('io.logto.SwiftUI+Demo://callback', 'mobile')).toBeTruthy(); expect(validateRedirectUrl('io.logto.SwiftUI+Demo://callback', 'mobile')).toBeTruthy();
expect(validateRedirectUrl('logto:/my-app/callback', 'mobile')).toBeTruthy();
expect(validateRedirectUrl('http1://localhost:3001', 'mobile')).toBeTruthy();
}); });
it('should detect invalid redirect URIs', () => { it('should detect invalid redirect URIs', () => {

View file

@ -44,7 +44,7 @@ importers:
version: 8.8.0 version: 8.8.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.0.2)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.0.2)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.0.0 specifier: ^5.0.0
version: 5.0.2 version: 5.0.2
@ -266,7 +266,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -333,7 +333,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -391,7 +391,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -449,7 +449,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -513,7 +513,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -577,7 +577,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -638,7 +638,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -705,7 +705,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -763,7 +763,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -821,7 +821,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -879,7 +879,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -937,7 +937,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -998,7 +998,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1068,7 +1068,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1129,7 +1129,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1184,7 +1184,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1242,7 +1242,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1300,7 +1300,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1358,7 +1358,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1419,7 +1419,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1477,7 +1477,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1535,7 +1535,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1593,7 +1593,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1651,7 +1651,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1709,7 +1709,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1767,7 +1767,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1825,7 +1825,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1883,7 +1883,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -1950,7 +1950,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -2020,7 +2020,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -2078,7 +2078,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -2133,7 +2133,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -2197,7 +2197,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -2255,7 +2255,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -2313,7 +2313,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -2377,7 +2377,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -2435,7 +2435,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -2493,7 +2493,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -2548,7 +2548,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -2606,7 +2606,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -2664,7 +2664,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -2722,7 +2722,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -3186,8 +3186,8 @@ importers:
specifier: ^1.3.1 specifier: ^1.3.1
version: 1.3.1 version: 1.3.1
oidc-provider: oidc-provider:
specifier: ^8.4.6 specifier: github:logto-io/node-oidc-provider#de2d8fd68e91b76d71fb910d44142f9eccd844bc
version: 8.4.6 version: https://codeload.github.com/logto-io/node-oidc-provider/tar.gz/de2d8fd68e91b76d71fb910d44142f9eccd844bc
openapi-types: openapi-types:
specifier: ^12.1.3 specifier: ^12.1.3
version: 12.1.3 version: 12.1.3
@ -3210,8 +3210,8 @@ importers:
specifier: ^1.5.3 specifier: ^1.5.3
version: 1.5.3 version: 1.5.3
raw-body: raw-body:
specifier: ^2.5.2 specifier: ^3.0.0
version: 2.5.2 version: 3.0.0
redis: redis:
specifier: ^4.6.14 specifier: ^4.6.14
version: 4.6.14 version: 4.6.14
@ -3286,8 +3286,8 @@ importers:
specifier: ^1.3.1 specifier: ^1.3.1
version: 1.3.11 version: 1.3.11
'@types/oidc-provider': '@types/oidc-provider':
specifier: ^8.4.4 specifier: ^8.5.2
version: 8.4.4 version: 8.5.2
'@types/pluralize': '@types/pluralize':
specifier: ^0.0.33 specifier: ^0.0.33
version: 0.0.33 version: 0.0.33
@ -3311,7 +3311,7 @@ importers:
version: 8.57.0 version: 8.57.0
jest: jest:
specifier: ^29.7.0 specifier: ^29.7.0
version: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3)) version: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3))
jest-matcher-specific-error: jest-matcher-specific-error:
specifier: ^1.0.0 specifier: ^1.0.0
version: 1.0.0 version: 1.0.0
@ -3341,7 +3341,7 @@ importers:
version: 7.0.0 version: 7.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -3510,7 +3510,7 @@ importers:
version: 3.0.0 version: 3.0.0
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
packages/experience: packages/experience:
devDependencies: devDependencies:
@ -3985,7 +3985,7 @@ importers:
version: 10.0.0 version: 10.0.0
jest: jest:
specifier: ^29.7.0 specifier: ^29.7.0
version: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3)) version: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3))
jest-matcher-specific-error: jest-matcher-specific-error:
specifier: ^1.0.0 specifier: ^1.0.0
version: 1.0.0 version: 1.0.0
@ -4012,7 +4012,7 @@ importers:
version: 22.6.5(typescript@5.5.3) version: 22.6.5(typescript@5.5.3)
tsup: tsup:
specifier: ^8.3.0 specifier: ^8.3.0
version: 8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5) version: 8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5)
typescript: typescript:
specifier: ^5.5.3 specifier: ^5.5.3
version: 5.5.3 version: 5.5.3
@ -5896,10 +5896,9 @@ packages:
resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==}
engines: {node: '>= 14.0.0'} engines: {node: '>= 14.0.0'}
'@koa/router@12.0.1': '@koa/router@13.1.0':
resolution: {integrity: sha512-ribfPYfHb+Uw3b27Eiw6NPqjhIhTpVFzEWLwyc/1Xp+DCdwRRyIlAUODX+9bPARF6aQtUu1+/PHzdNvRzcs/+Q==} resolution: {integrity: sha512-mNVu1nvkpSd8Q8gMebGbCkDWJ51ODetrFvLKYusej+V0ByD4btqHYnPIzTBLXnQMVUlm/oxVwqmWBY3zQfZilw==}
engines: {node: '>= 12'} engines: {node: '>= 18'}
deprecated: Use v12.0.2 or higher to fix the vulnerability issue
'@levischuck/tiny-cbor@0.2.2': '@levischuck/tiny-cbor@0.2.2':
resolution: {integrity: sha512-f5CnPw997Y2GQ8FAvtuVVC19FX8mwNNC+1XJcIi16n/LTJifKO6QBgGLgN3YEmqtGMk17SKSuoWES3imJVxAVw==} resolution: {integrity: sha512-f5CnPw997Y2GQ8FAvtuVVC19FX8mwNNC+1XJcIi16n/LTJifKO6QBgGLgN3YEmqtGMk17SKSuoWES3imJVxAVw==}
@ -7115,8 +7114,8 @@ packages:
'@types/normalize-package-data@2.4.1': '@types/normalize-package-data@2.4.1':
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
'@types/oidc-provider@8.4.4': '@types/oidc-provider@8.5.2':
resolution: {integrity: sha512-+SlmKc4qlCJLjpw6Du/8cXw18JsPEYyQwoy+xheLkiuNsCz1mPEYI/lRXLQHvfJD9TH6+2/WDTLZQ2UUJ5G4bw==} resolution: {integrity: sha512-NiD3VG49+cRCAAe8+uZLM4onOcX8y9+cwaml8JG1qlgc98rWoCRgsnOB4Ypx+ysays5jiwzfUgT0nWyXPB/9uQ==}
'@types/parse5@6.0.3': '@types/parse5@6.0.3':
resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==}
@ -8208,7 +8207,7 @@ packages:
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
concat-map@0.0.1: concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
confusing-browser-globals@1.0.11: confusing-browser-globals@1.0.11:
resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==}
@ -8843,7 +8842,7 @@ packages:
resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
ee-first@1.1.1: ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=}
electron-to-chromium@1.5.0: electron-to-chromium@1.5.0:
resolution: {integrity: sha512-Vb3xHHYnLseK8vlMJQKJYXJ++t4u1/qJ3vykuVrVjvdiOEhYyT1AuP4x03G8EnPmYvYOhe9T+dADTmthjRQMkA==} resolution: {integrity: sha512-Vb3xHHYnLseK8vlMJQKJYXJ++t4u1/qJ3vykuVrVjvdiOEhYyT1AuP4x03G8EnPmYvYOhe9T+dADTmthjRQMkA==}
@ -9231,8 +9230,8 @@ packages:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
eta@3.4.0: eta@3.5.0:
resolution: {integrity: sha512-tCsc7WXTjrTx4ZjYLplcqrI3o4mYJ+Z6YspeuGL8tbt/hHoMchwBwtKfwM09svEY86iRapY93vUqQttcNuIO5Q==} resolution: {integrity: sha512-e3x3FBvGzeCIHhF+zhK8FZA2vC5uFn6b4HJjegUbIWrDb4mJ7JjTGMJY9VGIbRVpmSwHopNiaJibhjIr+HfLug==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
etag@1.8.1: etag@1.8.1:
@ -9907,7 +9906,7 @@ packages:
engines: {node: '>=16.17.0'} engines: {node: '>=16.17.0'}
humanize-number@0.0.2: humanize-number@0.0.2:
resolution: {integrity: sha512-un3ZAcNQGI7RzaWGZzQDH47HETM4Wrj6z6E4TId8Yeq9w5ZKUVB1nrT2jwFheTUjEmqcgTjXDc959jum+ai1kQ==} resolution: {integrity: sha1-EcCvakcWQ2M1iFiASPF5lUFInBg=}
husky@9.0.7: husky@9.0.7:
resolution: {integrity: sha512-vWdusw+y12DUEeoZqW1kplOFqk3tedGV8qlga8/SF6a3lOiWLqGZZQvfWvY0fQYdfiRi/u1DFNpudTSV9l1aCg==} resolution: {integrity: sha512-vWdusw+y12DUEeoZqW1kplOFqk3tedGV8qlga8/SF6a3lOiWLqGZZQvfWvY0fQYdfiRi/u1DFNpudTSV9l1aCg==}
@ -10551,6 +10550,9 @@ packages:
jose@5.6.3: jose@5.6.3:
resolution: {integrity: sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g==} resolution: {integrity: sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g==}
jose@5.9.6:
resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==}
joycon@3.1.1: joycon@3.1.1:
resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -11159,7 +11161,7 @@ packages:
resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
media-typer@0.3.0: media-typer@0.3.0:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=}
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
meow@10.1.5: meow@10.1.5:
@ -11532,6 +11534,11 @@ packages:
engines: {node: ^18 || >=20} engines: {node: ^18 || >=20}
hasBin: true hasBin: true
nanoid@5.0.9:
resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==}
engines: {node: ^18 || >=20}
hasBin: true
natural-compare@1.4.0: natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
@ -11686,8 +11693,9 @@ packages:
obuf@1.1.2: obuf@1.1.2:
resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
oidc-provider@8.4.6: oidc-provider@https://codeload.github.com/logto-io/node-oidc-provider/tar.gz/de2d8fd68e91b76d71fb910d44142f9eccd844bc:
resolution: {integrity: sha512-liuHBXRaIjer6nPGWagrl5UjPhIZqahqLVPoYlc2WXsRR7XddwNCBUl1ks5r3Q3uCUfMdQTv1VsjmlaObdff8w==} resolution: {tarball: https://codeload.github.com/logto-io/node-oidc-provider/tar.gz/de2d8fd68e91b76d71fb910d44142f9eccd844bc}
version: 8.6.0
oidc-token-hash@5.0.3: oidc-token-hash@5.0.3:
resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==}
@ -11892,7 +11900,7 @@ packages:
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
passthrough-counter@1.0.0: passthrough-counter@1.0.0:
resolution: {integrity: sha512-Wy8PXTLqPAN0oEgBrlnsXPMww3SYJ44tQ8aVrGAI4h4JZYCS0oYqsPqtPR8OhJpv6qFbpbB7XAn0liKV7EXubA==} resolution: {integrity: sha1-GWfZ5m2lcrXAI8eH2xEqOHqxZvo=}
path-exists@4.0.0: path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
@ -11930,6 +11938,9 @@ packages:
path-to-regexp@6.2.1: path-to-regexp@6.2.1:
resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==}
path-to-regexp@6.3.0:
resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
path-to-regexp@8.2.0: path-to-regexp@8.2.0:
resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==}
engines: {node: '>=16'} engines: {node: '>=16'}
@ -12382,6 +12393,10 @@ packages:
resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
raw-body@3.0.0:
resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==}
engines: {node: '>= 0.8'}
react-animate-height@3.0.4: react-animate-height@3.0.4:
resolution: {integrity: sha512-k+mBS8yCzpFp+7BdrHsL5bXd6CO/2bYO2SvRGKfxK+Ss3nzplAJLlgnd6Zhcxe/avdpy/CgcziicFj7pIHgG5g==} resolution: {integrity: sha512-k+mBS8yCzpFp+7BdrHsL5bXd6CO/2bYO2SvRGKfxK+Ss3nzplAJLlgnd6Zhcxe/avdpy/CgcziicFj7pIHgG5g==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
@ -14916,7 +14931,7 @@ snapshots:
'@babel/traverse': 7.24.8 '@babel/traverse': 7.24.8
'@babel/types': 7.24.9 '@babel/types': 7.24.9
convert-source-map: 2.0.0 convert-source-map: 2.0.0
debug: 4.3.5 debug: 4.3.7(supports-color@5.5.0)
gensync: 1.0.0-beta.2 gensync: 1.0.0-beta.2
json5: 2.2.3 json5: 2.2.3
semver: 6.3.1 semver: 6.3.1
@ -15877,7 +15892,7 @@ snapshots:
jest-util: 29.7.0 jest-util: 29.7.0
slash: 3.0.0 slash: 3.0.0
'@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.5.3))': '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3))':
dependencies: dependencies:
'@jest/console': 29.7.0 '@jest/console': 29.7.0
'@jest/reporters': 29.7.0 '@jest/reporters': 29.7.0
@ -15891,7 +15906,7 @@ snapshots:
exit: 0.1.2 exit: 0.1.2
graceful-fs: 4.2.11 graceful-fs: 4.2.11
jest-changed-files: 29.7.0 jest-changed-files: 29.7.0
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.5.3)) 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.10.4)(typescript@5.5.3))
jest-haste-map: 29.7.0 jest-haste-map: 29.7.0
jest-message-util: 29.7.0 jest-message-util: 29.7.0
jest-regex-util: 29.6.3 jest-regex-util: 29.6.3
@ -15912,7 +15927,7 @@ snapshots:
- supports-color - supports-color
- ts-node - ts-node
'@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3))': '@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.5.3))':
dependencies: dependencies:
'@jest/console': 29.7.0 '@jest/console': 29.7.0
'@jest/reporters': 29.7.0 '@jest/reporters': 29.7.0
@ -15926,7 +15941,7 @@ snapshots:
exit: 0.1.2 exit: 0.1.2
graceful-fs: 4.2.11 graceful-fs: 4.2.11
jest-changed-files: 29.7.0 jest-changed-files: 29.7.0
jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3)) 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.5.3))
jest-haste-map: 29.7.0 jest-haste-map: 29.7.0
jest-message-util: 29.7.0 jest-message-util: 29.7.0
jest-regex-util: 29.6.3 jest-regex-util: 29.6.3
@ -16152,15 +16167,11 @@ snapshots:
dependencies: dependencies:
vary: 1.1.2 vary: 1.1.2
'@koa/router@12.0.1': '@koa/router@13.1.0':
dependencies: dependencies:
debug: 4.3.5
http-errors: 2.0.0 http-errors: 2.0.0
koa-compose: 4.1.0 koa-compose: 4.1.0
methods: 1.1.2 path-to-regexp: 6.3.0
path-to-regexp: 6.2.1
transitivePeerDependencies:
- supports-color
'@levischuck/tiny-cbor@0.2.2': {} '@levischuck/tiny-cbor@0.2.2': {}
@ -16212,7 +16223,7 @@ snapshots:
'@logto/js': 4.1.4 '@logto/js': 4.1.4
'@silverhand/essentials': 2.9.2 '@silverhand/essentials': 2.9.2
camelcase-keys: 7.0.2 camelcase-keys: 7.0.2
jose: 5.6.3 jose: 5.9.6
'@logto/cloud@0.2.5-5e334eb(zod@3.23.8)': '@logto/cloud@0.2.5-5e334eb(zod@3.23.8)':
dependencies: dependencies:
@ -17674,7 +17685,7 @@ snapshots:
'@types/normalize-package-data@2.4.1': {} '@types/normalize-package-data@2.4.1': {}
'@types/oidc-provider@8.4.4': '@types/oidc-provider@8.5.2':
dependencies: dependencies:
'@types/koa': 2.15.0 '@types/koa': 2.15.0
'@types/node': 20.12.7 '@types/node': 20.12.7
@ -17880,7 +17891,7 @@ snapshots:
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 7.7.0(typescript@5.5.3) '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.5.3)
'@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.5.3) '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.5.3)
debug: 4.3.5 debug: 4.3.7(supports-color@5.5.0)
eslint: 8.57.0 eslint: 8.57.0
ts-api-utils: 1.3.0(typescript@5.5.3) ts-api-utils: 1.3.0(typescript@5.5.3)
optionalDependencies: optionalDependencies:
@ -17894,7 +17905,7 @@ snapshots:
dependencies: dependencies:
'@typescript-eslint/types': 7.7.0 '@typescript-eslint/types': 7.7.0
'@typescript-eslint/visitor-keys': 7.7.0 '@typescript-eslint/visitor-keys': 7.7.0
debug: 4.3.5 debug: 4.3.7(supports-color@5.5.0)
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.4 minimatch: 9.0.4
@ -19318,13 +19329,13 @@ snapshots:
dependencies: dependencies:
lodash.get: 4.4.2 lodash.get: 4.4.2
create-jest@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3)): create-jest@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3)):
dependencies: dependencies:
'@jest/types': 29.6.3 '@jest/types': 29.6.3
chalk: 4.1.2 chalk: 4.1.2
exit: 0.1.2 exit: 0.1.2
graceful-fs: 4.2.11 graceful-fs: 4.2.11
jest-config: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3)) jest-config: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3))
jest-util: 29.7.0 jest-util: 29.7.0
prompts: 2.4.2 prompts: 2.4.2
transitivePeerDependencies: transitivePeerDependencies:
@ -20472,7 +20483,7 @@ snapshots:
esutils@2.0.3: {} esutils@2.0.3: {}
eta@3.4.0: {} eta@3.5.0: {}
etag@1.8.1: {} etag@1.8.1: {}
@ -21738,16 +21749,16 @@ snapshots:
- babel-plugin-macros - babel-plugin-macros
- supports-color - supports-color
jest-cli@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3)): jest-cli@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3)):
dependencies: dependencies:
'@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3)) '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3))
'@jest/test-result': 29.7.0 '@jest/test-result': 29.7.0
'@jest/types': 29.6.3 '@jest/types': 29.6.3
chalk: 4.1.2 chalk: 4.1.2
create-jest: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3)) create-jest: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3))
exit: 0.1.2 exit: 0.1.2
import-local: 3.1.0 import-local: 3.1.0
jest-config: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3)) jest-config: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3))
jest-util: 29.7.0 jest-util: 29.7.0
jest-validate: 29.7.0 jest-validate: 29.7.0
yargs: 17.7.2 yargs: 17.7.2
@ -21776,7 +21787,7 @@ snapshots:
- supports-color - supports-color
- ts-node - ts-node
jest-config@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3)): jest-config@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3)):
dependencies: dependencies:
'@babel/core': 7.24.4 '@babel/core': 7.24.4
'@jest/test-sequencer': 29.7.0 '@jest/test-sequencer': 29.7.0
@ -21802,7 +21813,38 @@ snapshots:
strip-json-comments: 3.1.1 strip-json-comments: 3.1.1
optionalDependencies: optionalDependencies:
'@types/node': 20.10.4 '@types/node': 20.10.4
ts-node: 10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3) ts-node: 10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3)
transitivePeerDependencies:
- babel-plugin-macros
- supports-color
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.10.4)(typescript@5.5.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(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3)
transitivePeerDependencies: transitivePeerDependencies:
- babel-plugin-macros - babel-plugin-macros
- supports-color - supports-color
@ -21838,37 +21880,6 @@ snapshots:
- babel-plugin-macros - babel-plugin-macros
- supports-color - supports-color
jest-config@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.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(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3)
transitivePeerDependencies:
- babel-plugin-macros
- supports-color
jest-dev-server@10.1.1: jest-dev-server@10.1.1:
dependencies: dependencies:
chalk: 4.1.2 chalk: 4.1.2
@ -22177,12 +22188,12 @@ snapshots:
merge-stream: 2.0.0 merge-stream: 2.0.0
supports-color: 8.1.1 supports-color: 8.1.1
jest@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3)): jest@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3)):
dependencies: dependencies:
'@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3)) '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3))
'@jest/types': 29.6.3 '@jest/types': 29.6.3
import-local: 3.1.0 import-local: 3.1.0
jest-cli: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3)) jest-cli: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3))
transitivePeerDependencies: transitivePeerDependencies:
- '@types/node' - '@types/node'
- babel-plugin-macros - babel-plugin-macros
@ -22213,6 +22224,8 @@ snapshots:
jose@5.6.3: {} jose@5.6.3: {}
jose@5.9.6: {}
joycon@3.1.1: {} joycon@3.1.1: {}
js-base64@3.7.5: {} js-base64@3.7.5: {}
@ -23615,6 +23628,8 @@ snapshots:
nanoid@5.0.7: {} nanoid@5.0.7: {}
nanoid@5.0.9: {}
natural-compare@1.4.0: {} natural-compare@1.4.0: {}
negotiator@0.6.2: {} negotiator@0.6.2: {}
@ -23789,21 +23804,21 @@ snapshots:
obuf@1.1.2: {} obuf@1.1.2: {}
oidc-provider@8.4.6: oidc-provider@https://codeload.github.com/logto-io/node-oidc-provider/tar.gz/de2d8fd68e91b76d71fb910d44142f9eccd844bc:
dependencies: dependencies:
'@koa/cors': 5.0.0 '@koa/cors': 5.0.0
'@koa/router': 12.0.1 '@koa/router': 13.1.0
debug: 4.3.4 debug: 4.3.7(supports-color@5.5.0)
eta: 3.4.0 eta: 3.5.0
got: 13.0.0 got: 13.0.0
jose: 5.6.3 jose: 5.9.6
jsesc: 3.0.2 jsesc: 3.0.2
koa: 2.15.3 koa: 2.15.3
nanoid: 5.0.7 nanoid: 5.0.9
object-hash: 3.0.0 object-hash: 3.0.0
oidc-token-hash: 5.0.3 oidc-token-hash: 5.0.3
quick-lru: 7.0.0 quick-lru: 7.0.0
raw-body: 2.5.2 raw-body: 3.0.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -24064,6 +24079,8 @@ snapshots:
path-to-regexp@6.2.1: {} path-to-regexp@6.2.1: {}
path-to-regexp@6.3.0: {}
path-to-regexp@8.2.0: {} path-to-regexp@8.2.0: {}
path-type@4.0.0: {} path-type@4.0.0: {}
@ -24523,6 +24540,13 @@ snapshots:
iconv-lite: 0.4.24 iconv-lite: 0.4.24
unpipe: 1.0.0 unpipe: 1.0.0
raw-body@3.0.0:
dependencies:
bytes: 3.1.2
http-errors: 2.0.0
iconv-lite: 0.6.3
unpipe: 1.0.0
react-animate-height@3.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): react-animate-height@3.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies: dependencies:
classnames: 2.3.1 classnames: 2.3.1
@ -25832,14 +25856,14 @@ snapshots:
ts-interface-checker@0.1.13: {} ts-interface-checker@0.1.13: {}
ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.5.3): ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.10.4)(typescript@5.5.3):
dependencies: dependencies:
'@cspotcode/source-map-support': 0.8.1 '@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.11 '@tsconfig/node10': 1.0.11
'@tsconfig/node12': 1.0.11 '@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3 '@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4 '@tsconfig/node16': 1.0.4
'@types/node': 20.12.7 '@types/node': 20.10.4
acorn: 8.13.0 acorn: 8.13.0
acorn-walk: 8.3.4 acorn-walk: 8.3.4
arg: 4.1.3 arg: 4.1.3
@ -25853,14 +25877,14 @@ snapshots:
'@swc/core': 1.3.52(@swc/helpers@0.5.1) '@swc/core': 1.3.52(@swc/helpers@0.5.1)
optional: true optional: true
ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.10.4)(typescript@5.5.3): ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.5.3):
dependencies: dependencies:
'@cspotcode/source-map-support': 0.8.1 '@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.11 '@tsconfig/node10': 1.0.11
'@tsconfig/node12': 1.0.11 '@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3 '@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4 '@tsconfig/node16': 1.0.4
'@types/node': 20.10.4 '@types/node': 20.12.7
acorn: 8.13.0 acorn: 8.13.0
acorn-walk: 8.3.4 acorn-walk: 8.3.4
arg: 4.1.3 arg: 4.1.3
@ -25897,7 +25921,7 @@ snapshots:
tsscmp@1.0.6: {} tsscmp@1.0.6: {}
tsup@8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.0.2)(yaml@2.4.5): tsup@8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.0.2)(yaml@2.4.5):
dependencies: dependencies:
bundle-require: 5.0.0(esbuild@0.23.1) bundle-require: 5.0.0(esbuild@0.23.1)
cac: 6.7.14 cac: 6.7.14
@ -25925,7 +25949,7 @@ snapshots:
- tsx - tsx
- yaml - yaml
tsup@8.3.0(@swc/core@1.3.52)(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5): tsup@8.3.0(@swc/core@1.3.52(@swc/helpers@0.5.1))(jiti@1.21.0)(postcss@8.4.39)(typescript@5.5.3)(yaml@2.4.5):
dependencies: dependencies:
bundle-require: 5.0.0(esbuild@0.23.1) bundle-require: 5.0.0(esbuild@0.23.1)
cac: 6.7.14 cac: 6.7.14