From 8a7a9e418e3a09b3a702401917504936164b8346 Mon Sep 17 00:00:00 2001 From: Darcy Ye Date: Fri, 18 Nov 2022 12:06:53 +0800 Subject: [PATCH] feat: update connectors table and load connector logic (#2468) Co-authored-by: wangsijie --- packages/console/package.json | 4 +- packages/core/package.json | 4 +- .../core/src/__mocks__/connector-base-data.ts | 21 +++++ packages/core/src/__mocks__/connector.ts | 12 +++ packages/core/src/connectors/index.ts | 17 ++-- .../src/connectors/utilities/index.test.ts | 3 + packages/core/src/queries/connector.test.ts | 14 ++- packages/demo-app/package.json | 4 +- packages/phrases-ui/package.json | 4 +- packages/phrases/package.json | 4 +- ...90-support-multiple-connector-instances.ts | 25 ++++++ packages/schemas/package.json | 6 +- .../schemas/src/foundations/jsonb-types.ts | 5 ++ packages/schemas/src/types/connector.ts | 2 +- packages/schemas/tables/connectors.sql | 3 + packages/ui/package.json | 4 +- pnpm-lock.yaml | 86 +++++++++++-------- 17 files changed, 153 insertions(+), 65 deletions(-) create mode 100644 packages/schemas/alterations/next-1668666590-support-multiple-connector-instances.ts diff --git a/packages/console/package.json b/packages/console/package.json index f66886410..40e5cabbe 100644 --- a/packages/console/package.json +++ b/packages/console/package.json @@ -18,8 +18,8 @@ }, "devDependencies": { "@fontsource/roboto-mono": "^4.5.7", - "@logto/core-kit": "1.0.0-beta.20", - "@logto/language-kit": "1.0.0-beta.20", + "@logto/core-kit": "1.0.0-beta.21", + "@logto/language-kit": "1.0.0-beta.21", "@logto/phrases": "workspace:^", "@logto/phrases-ui": "workspace:^", "@logto/react": "1.0.0-beta.13", diff --git a/packages/core/package.json b/packages/core/package.json index a821a8d6b..9a788f7ff 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -20,9 +20,9 @@ }, "dependencies": { "@logto/cli": "workspace:^", - "@logto/connector-kit": "1.0.0-beta.20", + "@logto/connector-kit": "1.0.0-beta.22", "@logto/core-kit": "^1.0.0-beta.18", - "@logto/language-kit": "1.0.0-beta.20", + "@logto/language-kit": "1.0.0-beta.21", "@logto/phrases": "workspace:^", "@logto/phrases-ui": "workspace:^", "@logto/schemas": "workspace:^", diff --git a/packages/core/src/__mocks__/connector-base-data.ts b/packages/core/src/__mocks__/connector-base-data.ts index 71e294abd..d475a8376 100644 --- a/packages/core/src/__mocks__/connector-base-data.ts +++ b/packages/core/src/__mocks__/connector-base-data.ts @@ -80,6 +80,9 @@ export const mockConnector0: Connector = { enabled: true, config: {}, createdAt: 1_234_567_890_123, + syncProfile: false, + metadata: {}, + connectorId: 'id0', }; export const mockConnector1: Connector = { @@ -87,6 +90,9 @@ export const mockConnector1: Connector = { enabled: true, config: {}, createdAt: 1_234_567_890_234, + syncProfile: false, + metadata: {}, + connectorId: 'id1', }; export const mockConnector2: Connector = { @@ -94,6 +100,9 @@ export const mockConnector2: Connector = { enabled: true, config: {}, createdAt: 1_234_567_890_345, + syncProfile: false, + metadata: {}, + connectorId: 'id2', }; export const mockConnector3: Connector = { @@ -101,6 +110,9 @@ export const mockConnector3: Connector = { enabled: true, config: {}, createdAt: 1_234_567_890_456, + syncProfile: false, + metadata: {}, + connectorId: 'id3', }; export const mockConnector4: Connector = { @@ -108,6 +120,9 @@ export const mockConnector4: Connector = { enabled: true, config: {}, createdAt: 1_234_567_890_567, + syncProfile: false, + metadata: {}, + connectorId: 'id4', }; export const mockConnector5: Connector = { @@ -115,6 +130,9 @@ export const mockConnector5: Connector = { enabled: true, config: {}, createdAt: 1_234_567_890_567, + syncProfile: false, + metadata: {}, + connectorId: 'id5', }; export const mockConnector6: Connector = { @@ -122,4 +140,7 @@ export const mockConnector6: Connector = { enabled: true, config: {}, createdAt: 1_234_567_890_567, + syncProfile: false, + metadata: {}, + connectorId: 'id6', }; diff --git a/packages/core/src/__mocks__/connector.ts b/packages/core/src/__mocks__/connector.ts index 84181b3f9..91634053d 100644 --- a/packages/core/src/__mocks__/connector.ts +++ b/packages/core/src/__mocks__/connector.ts @@ -30,6 +30,9 @@ export const mockConnector: Connector = { enabled: true, config: {}, createdAt: 1_234_567_890_123, + syncProfile: false, + metadata: {}, + connectorId: 'id', }; export const mockLogtoConnector = { @@ -222,6 +225,9 @@ export const mockSocialConnectors: LogtoConnector[] = [ enabled: false, config: {}, createdAt: 1_234_567_890_123, + syncProfile: false, + metadata: {}, + connectorId: 'id0', }, metadata: { ...mockMetadata, @@ -236,6 +242,9 @@ export const mockSocialConnectors: LogtoConnector[] = [ enabled: true, config: {}, createdAt: 1_234_567_890_123, + syncProfile: false, + metadata: {}, + connectorId: 'id1', }, metadata: { ...mockMetadata, @@ -250,6 +259,9 @@ export const mockSocialConnectors: LogtoConnector[] = [ enabled: false, config: {}, createdAt: 1_234_567_890_123, + syncProfile: false, + metadata: {}, + connectorId: 'id2', }, metadata: { ...mockMetadata, diff --git a/packages/core/src/connectors/index.ts b/packages/core/src/connectors/index.ts index 8ae81e02f..04646beb6 100644 --- a/packages/core/src/connectors/index.ts +++ b/packages/core/src/connectors/index.ts @@ -92,20 +92,20 @@ const loadConnectors = async () => { export const getLogtoConnectors = async (): Promise => { const connectors = await findAllConnectors(); - const connectorMap = new Map(connectors.map((connector) => [connector.id, connector])); - const logtoConnectors = await loadConnectors(); + const virtualConnectors = await loadConnectors(); - return logtoConnectors.map((element) => { - const { id } = element.metadata; - const connector = connectorMap.get(id); + return connectors.map((connector) => { + const { metadata, connectorId } = connector; + const virtualConnector = virtualConnectors.find(({ metadata: { id } }) => id === connectorId); - if (!connector) { - throw new RequestError({ code: 'entity.not_found', id, status: 404 }); + if (!virtualConnector) { + throw new RequestError({ code: 'entity.not_found', connectorId, status: 404 }); } return { - ...element, + ...virtualConnector, + metadata: { ...virtualConnector.metadata, ...metadata }, dbEntry: connector, }; }); @@ -144,6 +144,7 @@ export const initConnectors = async () => { newConnectors.map(async ({ metadata: { id } }) => { await insertConnector({ id, + connectorId: id, }); }) ); diff --git a/packages/core/src/connectors/utilities/index.test.ts b/packages/core/src/connectors/utilities/index.test.ts index aaad17d9e..c016ebe74 100644 --- a/packages/core/src/connectors/utilities/index.test.ts +++ b/packages/core/src/connectors/utilities/index.test.ts @@ -10,6 +10,9 @@ const connectors: Connector[] = [ enabled: true, config: { foo: 'bar' }, createdAt: 0, + syncProfile: false, + connectorId: 'id', + metadata: {}, }, ]; diff --git a/packages/core/src/queries/connector.test.ts b/packages/core/src/queries/connector.test.ts index bee581128..edb5cd169 100644 --- a/packages/core/src/queries/connector.test.ts +++ b/packages/core/src/queries/connector.test.ts @@ -44,18 +44,26 @@ describe('connector queries', () => { const connector = { ...mockConnector, config: JSON.stringify(mockConnector.config), + metadata: JSON.stringify(mockConnector.metadata), }; const expectSql = ` - insert into "connectors" ("id", "enabled", "config") - values ($1, $2, $3) + insert into "connectors" ("id", "enabled", "sync_profile", "connector_id", "config", "metadata") + values ($1, $2, $3, $4, $5, $6) returning * `; mockQuery.mockImplementationOnce(async (sql, values) => { expectSqlAssert(sql, expectSql); - expect(values).toEqual([connector.id, connector.enabled, connector.config]); + expect(values).toEqual([ + connector.id, + connector.enabled, + connector.syncProfile, + connector.connectorId, + connector.config, + connector.metadata, + ]); return createMockQueryResult([connector]); }); diff --git a/packages/demo-app/package.json b/packages/demo-app/package.json index 924bb9c50..055684270 100644 --- a/packages/demo-app/package.json +++ b/packages/demo-app/package.json @@ -17,8 +17,8 @@ "stylelint": "stylelint \"src/**/*.scss\"" }, "devDependencies": { - "@logto/core-kit": "1.0.0-beta.20", - "@logto/language-kit": "1.0.0-beta.20", + "@logto/core-kit": "1.0.0-beta.21", + "@logto/language-kit": "1.0.0-beta.21", "@logto/phrases": "workspace:^", "@logto/react": "1.0.0-beta.13", "@logto/schemas": "workspace:^", diff --git a/packages/phrases-ui/package.json b/packages/phrases-ui/package.json index 779eb1ccb..66df4680d 100644 --- a/packages/phrases-ui/package.json +++ b/packages/phrases-ui/package.json @@ -31,8 +31,8 @@ "url": "https://github.com/logto-io/logto/issues" }, "dependencies": { - "@logto/core-kit": "1.0.0-beta.20", - "@logto/language-kit": "1.0.0-beta.20", + "@logto/core-kit": "1.0.0-beta.21", + "@logto/language-kit": "1.0.0-beta.21", "@silverhand/essentials": "^1.3.0", "zod": "^3.19.1" }, diff --git a/packages/phrases/package.json b/packages/phrases/package.json index 013067cc4..8dd9234fe 100644 --- a/packages/phrases/package.json +++ b/packages/phrases/package.json @@ -31,8 +31,8 @@ "url": "https://github.com/logto-io/logto/issues" }, "dependencies": { - "@logto/core-kit": "1.0.0-beta.20", - "@logto/language-kit": "1.0.0-beta.20", + "@logto/core-kit": "1.0.0-beta.21", + "@logto/language-kit": "1.0.0-beta.21", "@silverhand/essentials": "^1.3.0", "zod": "^3.19.1" }, diff --git a/packages/schemas/alterations/next-1668666590-support-multiple-connector-instances.ts b/packages/schemas/alterations/next-1668666590-support-multiple-connector-instances.ts new file mode 100644 index 000000000..4e682b6e5 --- /dev/null +++ b/packages/schemas/alterations/next-1668666590-support-multiple-connector-instances.ts @@ -0,0 +1,25 @@ +import { sql } from 'slonik'; + +import type { AlterationScript } from '../lib/types/alteration'; + +const alteration: AlterationScript = { + up: async (pool) => { + await pool.query(sql` + ALTER TABLE connectors ADD COLUMN sync_profile boolean NOT NULL DEFAULT false; + ALTER TABLE connectors ADD COLUMN connector_id varchar(128); + UPDATE connectors SET connector_id = id; + ALTER TABLE connectors ALTER COLUMN connector_id SET NOT NULL; + ALTER TABLE connectors ADD COLUMN metadata jsonb NOT NULL DEFAULT '{}'::jsonb; + `); + }, + down: async (pool) => { + await pool.query(sql` + DELETE FROM connectors WHERE id <> connector_id; + ALTER TABLE connectors DROP COLUMN metadata; + ALTER TABLE connectors DROP COLUMN connector_id; + ALTER TABLE connectors DROP COLUMN sync_profile; + `); + }, +}; + +export default alteration; diff --git a/packages/schemas/package.json b/packages/schemas/package.json index 60679e7e2..b6fe1ad65 100644 --- a/packages/schemas/package.json +++ b/packages/schemas/package.json @@ -67,9 +67,9 @@ }, "prettier": "@silverhand/eslint-config/.prettierrc", "dependencies": { - "@logto/connector-kit": "1.0.0-beta.20", - "@logto/core-kit": "1.0.0-beta.20", - "@logto/language-kit": "1.0.0-beta.20", + "@logto/connector-kit": "1.0.0-beta.22", + "@logto/core-kit": "1.0.0-beta.21", + "@logto/language-kit": "1.0.0-beta.21", "@logto/phrases": "workspace:^", "@logto/phrases-ui": "workspace:^", "zod": "^3.19.1" diff --git a/packages/schemas/src/foundations/jsonb-types.ts b/packages/schemas/src/foundations/jsonb-types.ts index 9cfb41065..6763c4a6c 100644 --- a/packages/schemas/src/foundations/jsonb-types.ts +++ b/packages/schemas/src/foundations/jsonb-types.ts @@ -2,6 +2,11 @@ import { hexColorRegEx } from '@logto/core-kit'; import { languageTagGuard } from '@logto/language-kit'; import { z } from 'zod'; +export { + configurableConnectorMetadataGuard, + type ConfigurableConnectorMetadata, +} from '@logto/connector-kit'; + /** * Commonly Used */ diff --git a/packages/schemas/src/types/connector.ts b/packages/schemas/src/types/connector.ts index 83e75cdab..a83b8e99a 100644 --- a/packages/schemas/src/types/connector.ts +++ b/packages/schemas/src/types/connector.ts @@ -5,6 +5,6 @@ import type { Connector } from '../db-entries'; export type { ConnectorMetadata } from '@logto/connector-kit'; export { ConnectorType, ConnectorPlatform } from '@logto/connector-kit'; -export type ConnectorResponse = Connector & +export type ConnectorResponse = Omit & Omit, 'configGuard' | 'metadata'> & ConnectorMetadata; diff --git a/packages/schemas/tables/connectors.sql b/packages/schemas/tables/connectors.sql index 7ddda1884..6b72e2dfe 100644 --- a/packages/schemas/tables/connectors.sql +++ b/packages/schemas/tables/connectors.sql @@ -1,7 +1,10 @@ create table connectors ( id varchar(128) not null, enabled boolean not null default FALSE, + sync_profile boolean not null default FALSE, + connector_id varchar(128) not null, config jsonb /* @use ArbitraryObject */ not null default '{}'::jsonb, + metadata jsonb /* @use ConfigurableConnectorMetadata */ not null default '{}'::jsonb, created_at timestamptz not null default(now()), primary key (id) ); diff --git a/packages/ui/package.json b/packages/ui/package.json index ef2d7e0a5..c1f930d4d 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -16,8 +16,8 @@ "test": "jest" }, "devDependencies": { - "@logto/core-kit": "1.0.0-beta.20", - "@logto/language-kit": "1.0.0-beta.20", + "@logto/core-kit": "1.0.0-beta.21", + "@logto/language-kit": "1.0.0-beta.21", "@logto/phrases": "workspace:^", "@logto/phrases-ui": "workspace:^", "@logto/schemas": "workspace:^", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ed4c48b8..7c3d35b6d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -105,8 +105,8 @@ importers: packages/console: specifiers: '@fontsource/roboto-mono': ^4.5.7 - '@logto/core-kit': 1.0.0-beta.20 - '@logto/language-kit': 1.0.0-beta.20 + '@logto/core-kit': 1.0.0-beta.21 + '@logto/language-kit': 1.0.0-beta.21 '@logto/phrases': workspace:^ '@logto/phrases-ui': workspace:^ '@logto/react': 1.0.0-beta.13 @@ -177,8 +177,8 @@ importers: zod: ^3.19.1 devDependencies: '@fontsource/roboto-mono': 4.5.7 - '@logto/core-kit': 1.0.0-beta.20 - '@logto/language-kit': 1.0.0-beta.20 + '@logto/core-kit': 1.0.0-beta.21 + '@logto/language-kit': 1.0.0-beta.21 '@logto/phrases': link:../phrases '@logto/phrases-ui': link:../phrases-ui '@logto/react': 1.0.0-beta.13_react@18.2.0 @@ -251,9 +251,9 @@ importers: packages/core: specifiers: '@logto/cli': workspace:^ - '@logto/connector-kit': 1.0.0-beta.20 + '@logto/connector-kit': 1.0.0-beta.22 '@logto/core-kit': ^1.0.0-beta.18 - '@logto/language-kit': 1.0.0-beta.20 + '@logto/language-kit': 1.0.0-beta.21 '@logto/phrases': workspace:^ '@logto/phrases-ui': workspace:^ '@logto/schemas': workspace:^ @@ -329,9 +329,9 @@ importers: zod: ^3.19.1 dependencies: '@logto/cli': link:../cli - '@logto/connector-kit': 1.0.0-beta.20 + '@logto/connector-kit': 1.0.0-beta.22 '@logto/core-kit': 1.0.0-beta.18 - '@logto/language-kit': 1.0.0-beta.20 + '@logto/language-kit': 1.0.0-beta.21 '@logto/phrases': link:../phrases '@logto/phrases-ui': link:../phrases-ui '@logto/schemas': link:../schemas @@ -415,8 +415,8 @@ importers: packages/demo-app: specifiers: - '@logto/core-kit': 1.0.0-beta.20 - '@logto/language-kit': 1.0.0-beta.20 + '@logto/core-kit': 1.0.0-beta.21 + '@logto/language-kit': 1.0.0-beta.21 '@logto/phrases': workspace:^ '@logto/react': 1.0.0-beta.13 '@logto/schemas': workspace:^ @@ -442,8 +442,8 @@ importers: stylelint: ^14.9.1 typescript: ^4.7.4 devDependencies: - '@logto/core-kit': 1.0.0-beta.20 - '@logto/language-kit': 1.0.0-beta.20 + '@logto/core-kit': 1.0.0-beta.21 + '@logto/language-kit': 1.0.0-beta.21 '@logto/phrases': link:../phrases '@logto/react': 1.0.0-beta.13_react@18.2.0 '@logto/schemas': link:../schemas @@ -525,8 +525,8 @@ importers: packages/phrases: specifiers: - '@logto/core-kit': 1.0.0-beta.20 - '@logto/language-kit': 1.0.0-beta.20 + '@logto/core-kit': 1.0.0-beta.21 + '@logto/language-kit': 1.0.0-beta.21 '@silverhand/eslint-config': 1.3.0 '@silverhand/essentials': ^1.3.0 '@silverhand/ts-config': 1.2.1 @@ -536,8 +536,8 @@ importers: typescript: ^4.7.4 zod: ^3.19.1 dependencies: - '@logto/core-kit': 1.0.0-beta.20 - '@logto/language-kit': 1.0.0-beta.20 + '@logto/core-kit': 1.0.0-beta.21 + '@logto/language-kit': 1.0.0-beta.21 '@silverhand/essentials': 1.3.0 zod: 3.19.1 devDependencies: @@ -550,8 +550,8 @@ importers: packages/phrases-ui: specifiers: - '@logto/core-kit': 1.0.0-beta.20 - '@logto/language-kit': 1.0.0-beta.20 + '@logto/core-kit': 1.0.0-beta.21 + '@logto/language-kit': 1.0.0-beta.21 '@silverhand/eslint-config': 1.3.0 '@silverhand/essentials': ^1.3.0 '@silverhand/ts-config': 1.2.1 @@ -561,8 +561,8 @@ importers: typescript: ^4.7.4 zod: ^3.19.1 dependencies: - '@logto/core-kit': 1.0.0-beta.20 - '@logto/language-kit': 1.0.0-beta.20 + '@logto/core-kit': 1.0.0-beta.21 + '@logto/language-kit': 1.0.0-beta.21 '@silverhand/essentials': 1.3.0 zod: 3.19.1 devDependencies: @@ -575,9 +575,9 @@ importers: packages/schemas: specifiers: - '@logto/connector-kit': 1.0.0-beta.20 - '@logto/core-kit': 1.0.0-beta.20 - '@logto/language-kit': 1.0.0-beta.20 + '@logto/connector-kit': 1.0.0-beta.22 + '@logto/core-kit': 1.0.0-beta.21 + '@logto/language-kit': 1.0.0-beta.21 '@logto/phrases': workspace:^ '@logto/phrases-ui': workspace:^ '@silverhand/eslint-config': 1.3.0 @@ -600,9 +600,9 @@ importers: typescript: ^4.7.4 zod: ^3.19.1 dependencies: - '@logto/connector-kit': 1.0.0-beta.20 - '@logto/core-kit': 1.0.0-beta.20 - '@logto/language-kit': 1.0.0-beta.20 + '@logto/connector-kit': 1.0.0-beta.22 + '@logto/core-kit': 1.0.0-beta.21 + '@logto/language-kit': 1.0.0-beta.21 '@logto/phrases': link:../phrases '@logto/phrases-ui': link:../phrases-ui zod: 3.19.1 @@ -663,8 +663,8 @@ importers: packages/ui: specifiers: - '@logto/core-kit': 1.0.0-beta.20 - '@logto/language-kit': 1.0.0-beta.20 + '@logto/core-kit': 1.0.0-beta.21 + '@logto/language-kit': 1.0.0-beta.21 '@logto/phrases': workspace:^ '@logto/phrases-ui': workspace:^ '@logto/schemas': workspace:^ @@ -716,8 +716,8 @@ importers: typescript: ^4.7.4 use-debounced-loader: ^0.1.1 devDependencies: - '@logto/core-kit': 1.0.0-beta.20 - '@logto/language-kit': 1.0.0-beta.20 + '@logto/core-kit': 1.0.0-beta.21 + '@logto/language-kit': 1.0.0-beta.21 '@logto/phrases': link:../phrases '@logto/phrases-ui': link:../phrases-ui '@logto/schemas': link:../schemas @@ -2293,12 +2293,12 @@ packages: lodash.once: 4.1.1 dev: true - /@logto/connector-kit/1.0.0-beta.20: - resolution: {integrity: sha512-Z9rrrjpUJFKdxfs7CKrabiTmrHFyTFnUuPFfl6HG38I6EUOaURITJ3c6FJjCdu60nIRuwaM29+i/h4AChzLwew==} + /@logto/connector-kit/1.0.0-beta.22: + resolution: {integrity: sha512-ZlZup6yPaaWerpH53din/FcTfEK6M1M0TMh0W9CIYQtazGNilPWiJh1wo1iVZlFzC9KS+m/x2HDj41NVwKlHwQ==} engines: {node: ^16.0.0} dependencies: - '@logto/core-kit': 1.0.0-beta.20 - '@logto/language-kit': 1.0.0-beta.20 + '@logto/core-kit': 1.0.0-beta.21 + '@logto/language-kit': 1.0.0-beta.21 '@silverhand/essentials': 1.3.0 zod: 3.19.1 dev: false @@ -2307,7 +2307,7 @@ packages: resolution: {integrity: sha512-VgSBWbPeFHgSOiOoYiE+TQF8byImxfd2xGTjA37RtFHMeUfT8CNTQWESUYuP7JWrKNm1N2ua7DTZZAJAKH9qMg==} engines: {node: ^16.0.0} dependencies: - '@logto/language-kit': 1.0.0-beta.20 + '@logto/language-kit': 1.0.0-beta.21 color: 4.2.3 nanoid: 3.3.4 zod: 3.19.1 @@ -2317,7 +2317,17 @@ packages: resolution: {integrity: sha512-seYvL/aGYRfO4d0FYfKIW/Cu9PnFMRpRM5/oRXwXbcbv+LY1a3TcAX0itrVXeBygIrxiAmWd9DL7CGIWzb48Qg==} engines: {node: ^16.0.0} dependencies: - '@logto/language-kit': 1.0.0-beta.20 + '@logto/language-kit': 1.0.0-beta.21 + color: 4.2.3 + nanoid: 3.3.4 + zod: 3.19.1 + dev: true + + /@logto/core-kit/1.0.0-beta.21: + resolution: {integrity: sha512-kCFjRMTNgTYyEN3KRqC2K3A9zoaPncgOZQ3/SjWiStHPDnMj1zqgaphULlyphWJYLIQASoC319vLJIgQdM/EnA==} + engines: {node: ^16.0.0} + dependencies: + '@logto/language-kit': 1.0.0-beta.21 color: 4.2.3 nanoid: 3.3.4 zod: 3.19.1 @@ -2332,8 +2342,8 @@ packages: lodash.get: 4.4.2 dev: true - /@logto/language-kit/1.0.0-beta.20: - resolution: {integrity: sha512-nBqWQo2xGAlVcD9O/txpCzRyy7eKXNXBAHm8J1y/u5Fp3BMObMmJv+v4Zk+UhckdFpsnFJF0wYIX45ta2+IipA==} + /@logto/language-kit/1.0.0-beta.21: + resolution: {integrity: sha512-ZjjRfY5MzzKSJii1+ox31KIxckv3sakM0kGRnShCUDRa7oyLUiJo7O1BxAWAEzpRKLGrtXrUFM7s8XYw/a897w==} engines: {node: ^16.0.0} dependencies: zod: 3.19.1