diff --git a/apps/api/graphql/package.json b/apps/api/graphql/package.json index e7cee50cee4..2e0fc4bb09a 100644 --- a/apps/api/graphql/package.json +++ b/apps/api/graphql/package.json @@ -36,6 +36,7 @@ "@webiny/api-security-cognito": "0.0.0", "@webiny/api-security-so-ddb": "0.0.0", "@webiny/api-serverless-cms": "0.0.0", + "@webiny/api-sync-system": "0.0.0", "@webiny/api-tenancy": "0.0.0", "@webiny/api-tenancy-so-ddb": "0.0.0", "@webiny/api-tenant-manager": "0.0.0", diff --git a/apps/api/graphql/src/index.ts b/apps/api/graphql/src/index.ts index bf8db7d48bc..47fc0ff2d08 100644 --- a/apps/api/graphql/src/index.ts +++ b/apps/api/graphql/src/index.ts @@ -46,12 +46,30 @@ import { createLogger } from "@webiny/api-log"; import scaffoldsPlugins from "./plugins/scaffolds"; import { extensions } from "./extensions"; +/** + * #### TESTING sync system + */ +import { createSyncSystem } from "@webiny/api-sync-system"; const debug = process.env.DEBUG === "true"; const documentClient = getDocumentClient(); +const syncSystem = createSyncSystem({ + documentClient, + system: { + env: process.env.WEBINY_ENV, + variant: process.env.WEBINY_ENV_VARIANT, + region: process.env.AWS_REGION, + version: process.env.WEBINY_VERSION + } +}); +/** + * #### + */ + export const handler = createHandler({ plugins: [ + syncSystem.plugins(), createBenchmarkEnablePlugin(), createWcpContext(), createWcpGraphQL(), diff --git a/apps/api/graphql/tsconfig.json b/apps/api/graphql/tsconfig.json index d1befe71e7c..e42fe7003b5 100644 --- a/apps/api/graphql/tsconfig.json +++ b/apps/api/graphql/tsconfig.json @@ -223,7 +223,9 @@ "@webiny/api-websockets/*": ["../../../packages/api-websockets/src/*"], "@webiny/api-websockets": ["../../../packages/api-websockets/src"], "@webiny/api-log/*": ["../../../packages/api-log/src/*"], - "@webiny/api-log": ["../../../packages/api-log/src"] + "@webiny/api-log": ["../../../packages/api-log/src"], + "@webiny/api-sync-system/*": ["../../../packages/api-sync-system/src/*"], + "@webiny/api-sync-system": ["../../../packages/api-sync-system/src"] }, "baseUrl": "." } diff --git a/apps/sync/resolver/.babelrc.js b/apps/sync/resolver/.babelrc.js new file mode 100644 index 00000000000..9da7674cb52 --- /dev/null +++ b/apps/sync/resolver/.babelrc.js @@ -0,0 +1 @@ +module.exports = require("@webiny/project-utils").createBabelConfigForNode({ path: __dirname }); diff --git a/apps/sync/resolver/jest.config.js b/apps/sync/resolver/jest.config.js new file mode 100644 index 00000000000..c024f43f918 --- /dev/null +++ b/apps/sync/resolver/jest.config.js @@ -0,0 +1,27 @@ +const base = require("../../../jest.config.base"); +const { log } = require("@webiny/cli/utils"); +const { getStackOutput } = require("@webiny/cli-plugin-deploy-pulumi/utils"); + +const TEST_TYPE = process.env.TEST_TYPE; +const DEPLOY_ENVIRONMENT = "dev"; + +if (TEST_TYPE !== "unit") { + log.info(`${log.info.hl("apps/sync/input")}: Assigning environment variables...`); + const stackOutput = getStackOutput({ folder: "apps/sync", env: DEPLOY_ENVIRONMENT }); + + if (stackOutput) { + Object.assign(process.env, { + AWS_REGION: stackOutput.region, + DB_TABLE: stackOutput.dynamoDbTable, + API_URL: stackOutput.apiUrl, + TEST_RUN_ID: new Date().getTime() + }); + log.success("Environment variables successfully assigned."); + } else { + log.warning(`Could not assign environment variables.`); + } + console.log(); +} + +// Finally, export Jest config to be used while tests are being run. +module.exports = { ...base({ path: __dirname }) }; diff --git a/apps/sync/resolver/package.json b/apps/sync/resolver/package.json new file mode 100644 index 00000000000..ed734720416 --- /dev/null +++ b/apps/sync/resolver/package.json @@ -0,0 +1,16 @@ +{ + "name": "sync-system-resolver", + "version": "0.1.0", + "scripts": { + "build": "yarn webiny run build", + "watch": "yarn webiny run watch" + }, + "dependencies": { + "@webiny/cli": "0.0.0", + "@webiny/api-sync-system": "0.0.0", + "@webiny/project-utils": "0.0.0" + }, + "devDependencies": { + "@webiny/cli-plugin-deploy-pulumi": "0.0.0" + } +} diff --git a/apps/sync/resolver/src/index.ts b/apps/sync/resolver/src/index.ts new file mode 100644 index 00000000000..6a7a0674670 --- /dev/null +++ b/apps/sync/resolver/src/index.ts @@ -0,0 +1,12 @@ +import { createResolverHandler } from "@webiny/api-sync-system"; +import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb/index.js"; + +const debug = process.env.DEBUG === "true"; + +export const handler = createResolverHandler({ + plugins: [], + debug, + createDocumentClient: params => { + return getDocumentClient(params); + } +}); diff --git a/apps/sync/resolver/tsconfig.json b/apps/sync/resolver/tsconfig.json new file mode 100644 index 00000000000..e656e0d18d1 --- /dev/null +++ b/apps/sync/resolver/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../../tsconfig.json", + "include": ["src"], + "references": [ + { + "path": "../../../packages/api-sync-system/tsconfig.build.json" + } + ], + "compilerOptions": { + "paths": { + "~/*": ["./src/*"], + "@webiny/api-sync-system/*": ["../../../packages/api-sync-system/src/*"], + "@webiny/api-sync-system": ["../../../packages/api-sync-system/src"] + }, + "baseUrl": "." + } +} diff --git a/apps/sync/resolver/webiny.config.ts b/apps/sync/resolver/webiny.config.ts new file mode 100644 index 00000000000..af49be8a390 --- /dev/null +++ b/apps/sync/resolver/webiny.config.ts @@ -0,0 +1,8 @@ +import { createBuildFunction, createWatchFunction } from "@webiny/project-utils"; + +export default { + commands: { + build: createBuildFunction({ cwd: __dirname }), + watch: createWatchFunction({ cwd: __dirname }) + } +}; diff --git a/apps/sync/webiny.application.ts b/apps/sync/webiny.application.ts new file mode 100644 index 00000000000..e5f73fbddd0 --- /dev/null +++ b/apps/sync/webiny.application.ts @@ -0,0 +1,5 @@ +import { createSyncSystemApp } from "@webiny/serverless-cms-aws"; + +export default createSyncSystemApp({ + pulumiResourceNamePrefix: "wby-" +}); diff --git a/jest.config.base.js b/jest.config.base.js index c46a0ab9fef..255105476fa 100644 --- a/jest.config.base.js +++ b/jest.config.base.js @@ -21,6 +21,7 @@ module.exports = function ({ path }, presets = []) { tsPreset, { displayName: name, + resolver: "ts-jest-resolver", modulePaths: [`${path}/src`], testMatch: [`${path}/**/*${type}.test.[jt]s?(x)`], transform: { diff --git a/package.json b/package.json index 9b8b50a58be..f8fa22b85e4 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "@lexical/utils": "0.23.1", "@octokit/rest": "^20.0.2", "@types/fs-extra": "^11.0.4", + "@types/hoist-non-react-statics": "^3.3.5", "@types/jest": "^29.5.14", "@types/node": "^20.17.10", "@types/prettier": "^2.7.3", @@ -130,6 +131,7 @@ "semver": "^7.6.3", "ts-expect": "^1.3.0", "ts-jest": "29.1.5", + "ts-jest-resolver": "^2.0.1", "ts-node": "^10.9.2", "type-fest": "4.14.0", "typescript": "5.3.3", @@ -266,9 +268,6 @@ "@material/base@^14.0.0": "patch:@material/base@npm%3A14.0.0#./.yarn/patches/@material-base-npm-14.0.0-36e0a55c42.patch" }, "packageManager": "yarn@4.6.0", - "dependencies": { - "@types/hoist-non-react-statics": "^3.3.5" - }, "engines": { "node": ">=20.0.0" } diff --git a/packages/api-sync-system/.babelrc.js b/packages/api-sync-system/.babelrc.js new file mode 100644 index 00000000000..9da7674cb52 --- /dev/null +++ b/packages/api-sync-system/.babelrc.js @@ -0,0 +1 @@ +module.exports = require("@webiny/project-utils").createBabelConfigForNode({ path: __dirname }); diff --git a/packages/api-sync-system/LICENSE b/packages/api-sync-system/LICENSE new file mode 100644 index 00000000000..f772d04d4db --- /dev/null +++ b/packages/api-sync-system/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Webiny + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/api-sync-system/README.md b/packages/api-sync-system/README.md new file mode 100644 index 00000000000..cef5276cc8b --- /dev/null +++ b/packages/api-sync-system/README.md @@ -0,0 +1,10 @@ +# @webiny/api-sync-system +[![](https://img.shields.io/npm/dw/@webiny/api-sync-system.svg)](https://www.npmjs.com/package/@webiny/api-sync-system) +[![](https://img.shields.io/npm/v/@webiny/api-sync-system.svg)](https://www.npmjs.com/package/@webiny/api-sync-system) +[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +## Install +``` +yarn add @webiny/api-sync-system +``` diff --git a/packages/api-sync-system/__tests__/mocks/bundle.ts b/packages/api-sync-system/__tests__/mocks/bundle.ts new file mode 100644 index 00000000000..916dba6cb77 --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/bundle.ts @@ -0,0 +1,26 @@ +import { CommandBundle } from "~/resolver/app/bundler/CommandBundle"; +import { createMockDeployment } from "~tests/mocks/deployments.js"; +import { createRegularMockTable } from "~tests/mocks/table.js"; +import type { IBaseBundleParams } from "~/resolver/app/bundler/BaseBundle.js"; +import { IIngestorResultItem } from "~/resolver/app/ingestor/types.js"; + +export interface ICreateMockBundleParams + extends Partial> { + items: IIngestorResultItem[]; +} + +export const createMockCommandPutBundle = (params: ICreateMockBundleParams) => { + return new CommandBundle({ + command: "put", + source: params?.source || createMockDeployment(), + table: params?.table || createRegularMockTable() + }); +}; + +export const createMockCommandDeleteBundle = (params: ICreateMockBundleParams) => { + return new CommandBundle({ + command: "delete", + source: params?.source || createMockDeployment(), + table: params?.table || createRegularMockTable() + }); +}; diff --git a/packages/api-sync-system/__tests__/mocks/bundler.ts b/packages/api-sync-system/__tests__/mocks/bundler.ts new file mode 100644 index 00000000000..94f7e42188f --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/bundler.ts @@ -0,0 +1,24 @@ +import { createBundler } from "~/resolver/app/bundler/Bundler.js"; +import { createBundles } from "~/resolver/app/bundler/Bundles.js"; +import { createCommandBundle } from "~/resolver/app/bundler/CommandBundle.js"; +import { createTableBundle } from "~/resolver/app/bundler/TableBundle.js"; + +export const createMockCommandBundler = () => { + return createBundler({ + createBundles: () => { + return createBundles({ + createBundle: createCommandBundle + }); + } + }); +}; + +export const createMockTableBundler = () => { + return createBundler({ + createBundles: () => { + return createBundles({ + createBundle: createTableBundle + }); + } + }); +}; diff --git a/packages/api-sync-system/__tests__/mocks/constants.ts b/packages/api-sync-system/__tests__/mocks/constants.ts new file mode 100644 index 00000000000..14da9b5a57b --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/constants.ts @@ -0,0 +1,3 @@ +export const DYNAMODB_REGULAR = "regular"; +export const DYNAMODB_ELASTICSEARCH = "elasticsearch"; +export const DYNAMODB_LOG = "log"; diff --git a/packages/api-sync-system/__tests__/mocks/context.ts b/packages/api-sync-system/__tests__/mocks/context.ts new file mode 100644 index 00000000000..4e4988b507f --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/context.ts @@ -0,0 +1,32 @@ +import { Context } from "@webiny/api/Context"; +import type { Context as ContextType } from "~/types"; +import type { Reply as FastifyReply, Request as FastifyRequest } from "@webiny/handler/types.js"; + +export const createMockContext = () => { + const request = {} as FastifyRequest; + const sent: unknown[] = []; + const send = jest.fn(); + + const reply = { + send: (data: unknown) => { + sent.push(data); + return send(data); + } + } as unknown as FastifyReply; + const context = new Context({ + plugins: [], + WEBINY_VERSION: process.env.WEBINY_VERSION as string + }) as unknown as ContextType; + + return { + context, + request, + reply, + getSent: () => { + return sent; + }, + getSend: () => { + return send; + } + }; +}; diff --git a/packages/api-sync-system/__tests__/mocks/deployments.ts b/packages/api-sync-system/__tests__/mocks/deployments.ts new file mode 100644 index 00000000000..d780eba3735 --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/deployments.ts @@ -0,0 +1,113 @@ +import type { DynamoDBDocument } from "@webiny/aws-sdk/client-dynamodb"; +import { PutCommand } from "@webiny/aws-sdk/client-dynamodb"; +import type { IDeployment } from "~/resolver/deployment/types.js"; +import { Deployment } from "~/resolver/deployment/Deployment.js"; +import { SemVer } from "semver"; +import { version } from "@webiny/cli/package.json"; + +const currentVersion = new SemVer(version); + +export interface ICreateDeploymentParams { + client: DynamoDBDocument; + tableName: string; + item: ICreateMockDeploymentItem; +} + +export const storeDeployment = async (params: ICreateDeploymentParams) => { + const { client, item, tableName } = params; + + await client.send( + new PutCommand({ + TableName: tableName, + Item: { + PK: `DEPLOYMENT#${item.env}#${item.variant || "unknown"}`, + SK: `default`, + GSI1_PK: "DEPLOYMENTS", + GSI1_SK: `${item.env}#${item.variant || "unknown"}`, + item: { + ...item, + version: item.version ? item.version.format() : undefined + } + } + }) + ); +}; + +export interface ICreateMockDeploymentItem { + name: string; + env: string; + variant?: string; + region: string; + version: SemVer; + s3Id: string; + s3Arn: string; + primaryDynamoDbArn: string; + primaryDynamoDbName: string; + primaryDynamoDbHashKey: string; + primaryDynamoDbRangeKey: string; + elasticsearchDynamodbTableArn?: string; + elasticsearchDynamodbTableName?: string; + logDynamodbTableArn: string; + logDynamodbTableName: string; +} + +export const createMockDeploymentData = (item: Partial = {}) => { + return { + name: "test", + env: "test", + variant: "test", + region: "us-east-1", + version: currentVersion, + s3Id: "s3Id", + s3Arn: "s3Arn", + primaryDynamoDbArn: "primaryDynamoDbArn", + primaryDynamoDbName: "primaryDynamoDbName", + primaryDynamoDbHashKey: "primaryDynamoDbHashKey", + primaryDynamoDbRangeKey: "primaryDynamoDbRangeKey", + elasticsearchDynamodbTableArn: "elasticsearchDynamodbTableArn", + elasticsearchDynamodbTableName: "elasticsearchDynamodbTableName", + logDynamodbTableArn: "logDynamodbTableArn", + logDynamodbTableName: "logDynamodbTableName", + ...item + }; +}; + +export const createMockDeployment = ( + input: Partial = {} +): IDeployment => { + const item = createMockDeploymentData(input); + + return new Deployment({ + ...item, + services: { + s3Id: item.s3Id, + s3Arn: item.s3Arn, + primaryDynamoDbArn: item.primaryDynamoDbArn, + primaryDynamoDbName: item.primaryDynamoDbName, + primaryDynamoDbHashKey: item.primaryDynamoDbHashKey, + primaryDynamoDbRangeKey: item.primaryDynamoDbRangeKey, + elasticsearchDynamodbTableArn: item.elasticsearchDynamodbTableArn, + elasticsearchDynamodbTableName: item.elasticsearchDynamodbTableName, + logDynamodbTableArn: item.logDynamodbTableArn, + logDynamodbTableName: item.logDynamodbTableName + } + }); +}; + +export const createMockSourceDeployment = (params: Partial = {}) => { + return createMockDeployment({ + env: "dev", + variant: "source", + name: "dev#source", + ...params + }); +}; + +export const createMockTargetDeployment = (params: Partial = {}) => { + return createMockDeployment({ + env: "dev", + variant: "target", + name: "dev#target", + ...params + }); +}; diff --git a/packages/api-sync-system/__tests__/mocks/eventBridgeClient.ts b/packages/api-sync-system/__tests__/mocks/eventBridgeClient.ts new file mode 100644 index 00000000000..e6e92d69b9f --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/eventBridgeClient.ts @@ -0,0 +1,13 @@ +import type { EventBridgeClient } from "@webiny/aws-sdk/client-eventbridge/index.js"; + +export interface ICreateMockEventBridgeClientParams { + send?: typeof EventBridgeClient.prototype.send; +} + +export const createMockEventBridgeClient = ( + params?: ICreateMockEventBridgeClientParams +): Pick => { + return { + send: params?.send || jest.fn() + }; +}; diff --git a/packages/api-sync-system/__tests__/mocks/eventBus.ts b/packages/api-sync-system/__tests__/mocks/eventBus.ts new file mode 100644 index 00000000000..34a3c1436e2 --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/eventBus.ts @@ -0,0 +1,8 @@ +import type { IHandlerEventBus } from "~/sync/handler/Handler.js"; + +export const createMockEventBus = (): IHandlerEventBus => { + return { + arn: "arn:aws:events:eu-central-1:123456789012:event-bus/sync", + name: "sync" + }; +}; diff --git a/packages/api-sync-system/__tests__/mocks/fetcher.ts b/packages/api-sync-system/__tests__/mocks/fetcher.ts new file mode 100644 index 00000000000..1f8ee29997b --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/fetcher.ts @@ -0,0 +1,8 @@ +import { type IFetcherParams, Fetcher } from "~/resolver/app/fetcher/Fetcher.js"; + +export const createMockFetcher = ( + params: Pick & + Partial> +) => { + return new Fetcher(params); +}; diff --git a/packages/api-sync-system/__tests__/mocks/handlerConverter.ts b/packages/api-sync-system/__tests__/mocks/handlerConverter.ts new file mode 100644 index 00000000000..e9cefeef00a --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/handlerConverter.ts @@ -0,0 +1,39 @@ +import { createHandlerConverter } from "~/sync/handler/HandlerConverter.js"; +import { NullCommandValue } from "~/sync/handler/converter/commands/NullCommandValue.js"; +import type { ICommandConverter } from "~/sync/types.js"; +import type { NonEmptyArray } from "@webiny/api/types.js"; +import { createBatchGetCommandConverter } from "~/sync/handler/converter/BatchGetCommandConverter.js"; +import { createGetCommandConverter } from "~/sync/handler/converter/GetCommandConverter.js"; +import { createBatchWriteCommandConverter } from "~/sync/handler/converter/BatchWriteCommandConverter.js"; +import { createPutCommandConverter } from "~/sync/handler/converter/PutCommandConverter.js"; +import { createDeleteCommandConverter } from "~/sync/handler/converter/DeleteCommandConverter.js"; +import { createUpdateCommandConverter } from "~/sync/handler/converter/UpdateCommandConverter.js"; + +export interface ICreateMockHandlerConverterCommandParams { + commandConverters: NonEmptyArray | "all"; +} + +export const createMockHandlerConverter = (params?: ICreateMockHandlerConverterCommandParams) => { + const converter = createHandlerConverter({ + default: new NullCommandValue() + }); + if (!params?.commandConverters) { + return converter; + } + + const commandConverters = + params.commandConverters === "all" + ? [ + createBatchGetCommandConverter(), + createGetCommandConverter(), + createBatchWriteCommandConverter(), + createPutCommandConverter(), + createDeleteCommandConverter(), + createUpdateCommandConverter() + ] + : params.commandConverters; + + converter.register(commandConverters); + + return converter; +}; diff --git a/packages/api-sync-system/__tests__/mocks/lambdaContext.ts b/packages/api-sync-system/__tests__/mocks/lambdaContext.ts new file mode 100644 index 00000000000..b57b0ef2a16 --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/lambdaContext.ts @@ -0,0 +1,27 @@ +import type { LambdaContext } from "@webiny/handler-aws/types"; + +export const createLambdaContext = (input?: Partial): LambdaContext => { + return { + awsRequestId: "abc", + callbackWaitsForEmptyEventLoop: false, + functionName: "handler", + functionVersion: "1", + invokedFunctionArn: "xyz", + memoryLimitInMB: "512", + logGroupName: "custom", + logStreamName: "custom", + getRemainingTimeInMillis: () => { + return 15 * 60 * 60; + }, + done: () => { + return null; + }, + fail: () => { + return null; + }, + succeed: () => { + return null; + }, + ...input + }; +}; diff --git a/packages/api-sync-system/__tests__/mocks/manifest.ts b/packages/api-sync-system/__tests__/mocks/manifest.ts new file mode 100644 index 00000000000..e01eaded8a2 --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/manifest.ts @@ -0,0 +1,46 @@ +import type { DynamoDBDocument } from "@webiny/aws-sdk/client-dynamodb"; +import type { IManifest, IManifestData } from "~/sync/types.js"; + +export interface ICreateMockManifestParams { + region?: string; + eventBusName?: string; + eventBusArn?: string; +} + +export const createMockManifest = (params?: ICreateMockManifestParams): IManifest => { + const { + region = "eu-central-1", + eventBusName = "event-bus-name", + eventBusArn = "arn:aws:events:eu-central-1:123456789012:event-bus/event-bus-name" + } = params || {}; + return { + sync: { + region, + eventBusName, + eventBusArn + } + }; +}; + +export interface ICreateMockManifestInDynamoDbParams { + client: DynamoDBDocument; + tableName?: string; + manifest?: IManifestData; +} + +export const createMockManifestInDynamoDb = async (params: ICreateMockManifestInDynamoDbParams) => { + const { client } = params; + await client.put({ + TableName: params.tableName || process.env.DB_TABLE, + Item: { + PK: `SERVICE_MANIFEST#api#sync`, + SK: "default", + GSI1_PK: "SERVICE_MANIFESTS", + GSI1_SK: `api#sync`, + data: { + name: "sync", + manifest: params.manifest || {} + } + } + }); +}; diff --git a/packages/api-sync-system/__tests__/mocks/putCommand.ts b/packages/api-sync-system/__tests__/mocks/putCommand.ts new file mode 100644 index 00000000000..a2dd0c38bd4 --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/putCommand.ts @@ -0,0 +1,16 @@ +import { PutCommand } from "@webiny/aws-sdk/client-dynamodb/index.js"; + +export interface ICreateMockPutCommandParams { + TableName?: string; + Item?: Record; +} + +export const createMockPutCommand = (params: ICreateMockPutCommandParams = {}) => { + return new PutCommand({ + TableName: params.TableName || process.env.DB_TABLE, + Item: params.Item || { + PK: "pk1", + SK: "sk1" + } + }); +}; diff --git a/packages/api-sync-system/__tests__/mocks/sqsEvent.ts b/packages/api-sync-system/__tests__/mocks/sqsEvent.ts new file mode 100644 index 00000000000..2371e58f892 --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/sqsEvent.ts @@ -0,0 +1,69 @@ +import type { SQSMessageAttributes, SQSRecord, SQSRecordAttributes } from "@webiny/aws-sdk/types"; +import { SQSEvent } from "@webiny/aws-sdk/types/index.js"; +import { createMockSystem } from "~tests/mocks/system.js"; + +export const createMockSQSEventRecord = (input: Partial = {}): SQSRecord => { + const attributes: SQSRecordAttributes = { + AWSTraceHeader: "tracerHeader", + ApproximateReceiveCount: "0", + SentTimestamp: "1234", + SenderId: "1234", + ApproximateFirstReceiveTimestamp: "1234", + SequenceNumber: "1234", + MessageGroupId: "1234", + MessageDeduplicationId: "1234", + DeadLetterQueueSourceArn: "1234", + ...input.attributes + }; + const messageAttributes: SQSMessageAttributes = { + ...input.messageAttributes + }; + return { + messageId: "messageid1234", + receiptHandle: "receiptHandle1234", + body: "a body", + md5OfBody: "1234", + md5OfMessageAttributes: "1234", + eventSource: "1234", + eventSourceARN: "1234", + awsRegion: "eu-central-1", + ...input, + attributes, + messageAttributes + }; +}; + +export const createMockSQSEvent = (): SQSEvent => { + return { + Records: [ + createMockSQSEventRecord({ + body: JSON.stringify({ + version: "1", + id: "something", + "detail-type": "synchronization-input", + source: "webiny:testing", + account: "1234", + time: "something", + region: "eu-central-1", + resources: [], + detail: JSON.stringify({ + items: [ + { + tableName: process.env.DB_TABLE, + tableType: "regular", + PK: "pk1", + SK: "sk1", + command: "put" + } + ], + source: createMockSystem({ + env: "test", + variant: "blue" + }) + }), + eventBusName: "something" + }) + }) + ] + }; +}; diff --git a/packages/api-sync-system/__tests__/mocks/storer.ts b/packages/api-sync-system/__tests__/mocks/storer.ts new file mode 100644 index 00000000000..05ac748b0fd --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/storer.ts @@ -0,0 +1,8 @@ +import { type IStorerParams, Storer } from "~/resolver/app/storer/Storer.js"; + +export const createMockStorer = ( + params: Pick & + Partial> +) => { + return new Storer(params); +}; diff --git a/packages/api-sync-system/__tests__/mocks/syncHandler.ts b/packages/api-sync-system/__tests__/mocks/syncHandler.ts new file mode 100644 index 00000000000..4d4881e3c68 --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/syncHandler.ts @@ -0,0 +1,24 @@ +import { createSyncHandler, type IHandlerParams } from "~/sync/handler/Handler.js"; +import { createMockEventBridgeClient } from "~tests/mocks/eventBridgeClient.js"; +import { createMockSystem } from "~tests/mocks/system.js"; +import { createMockHandlerConverter } from "~tests/mocks/handlerConverter.js"; +import { createMockEventBus } from "~tests/mocks/eventBus.js"; + +export interface ICreateMockSyncHandlerParams extends Omit { + converter: "all" | IHandlerParams["converter"]; +} + +export const createMockSyncHandler = (params: Partial = {}) => { + const converter = + params.converter === "all" + ? createMockHandlerConverter({ + commandConverters: "all" + }) + : params.converter || createMockHandlerConverter(); + return createSyncHandler({ + client: params.client || createMockEventBridgeClient(), + system: params.system || createMockSystem(), + converter, + eventBus: params.eventBus || createMockEventBus() + }); +}; diff --git a/packages/api-sync-system/__tests__/mocks/system.ts b/packages/api-sync-system/__tests__/mocks/system.ts new file mode 100644 index 00000000000..34329eb5967 --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/system.ts @@ -0,0 +1,23 @@ +import { createSystemName } from "~/utils/createSystemName.js"; +import type { ISystem } from "~/sync/types.js"; + +export interface ICreateMockSystemParams { + env?: string; + variant?: string; + region?: string; + version?: string; +} + +export const createMockSystem = (params?: ICreateMockSystemParams): ISystem => { + const { env = "local", variant, region = "eu-central-1", version } = params || {}; + return { + name: createSystemName({ + env, + variant + }), + env, + variant, + region, + version: version || (process.env.WEBINY_VERSION as string) + }; +}; diff --git a/packages/api-sync-system/__tests__/mocks/table.ts b/packages/api-sync-system/__tests__/mocks/table.ts new file mode 100644 index 00000000000..68523e70dcf --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/table.ts @@ -0,0 +1,28 @@ +import { ITable } from "~/sync/types"; + +export const createRegularMockTable = (params?: ITable): ITable => { + return { + name: process.env.DB_TABLE as string, + type: "regular", + arn: "arnRegular", + ...params + }; +}; + +export const createElasticsearchMockTable = (params?: ITable): ITable => { + return { + name: process.env.DB_TABLE_ELASTICSEARCH as string, + type: "elasticsearch", + arn: "arnElasticsearch", + ...params + }; +}; + +export const createLogMockTable = (params?: ITable): ITable => { + return { + name: process.env.DB_TABLE_LOG as string, + type: "log", + arn: "arnLog", + ...params + }; +}; diff --git a/packages/api-sync-system/__tests__/mocks/tableItem.ts b/packages/api-sync-system/__tests__/mocks/tableItem.ts new file mode 100644 index 00000000000..9f49c2e630b --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/tableItem.ts @@ -0,0 +1,67 @@ +import type { ITable } from "~/sync/types.js"; +import type { IStoreItem } from "~/resolver/app/storer/types.js"; +import type { DynamoDBDocument } from "@webiny/aws-sdk/client-dynamodb"; +import { PutCommand } from "@webiny/aws-sdk/client-dynamodb"; +import { faker } from "@faker-js/faker"; + +export interface IStoreMockTableItem { + client: DynamoDBDocument; + table: Pick; + item: IStoreItem; +} + +export const storeMockTableItem = async (params: IStoreMockTableItem) => { + const { client, table, item } = params; + const cmd = new PutCommand({ + TableName: table.name, + Item: { + ...item + } + }); + + await client.send(cmd); +}; + +export interface IStoreMockTableItems { + client: DynamoDBDocument; + table: Pick; + items: IStoreItem[]; +} + +export const storeMockTableItems = (params: IStoreMockTableItems) => { + const { client, table, items } = params; + return Promise.all( + items.map(item => { + return storeMockTableItem({ + client, + table, + item + }); + }) + ); +}; + +export interface ICreateMockTableItemDataParams { + order: number; + size?: "extreme"; +} + +export const createMockTableItemData = (params: ICreateMockTableItemDataParams) => { + const { order, size } = params; + return Object.freeze({ + PK: `T#${order}`, + SK: `T#${order}`, + GSI1PK: `GSI#${order}`, + GSI1SK: `GSI#${order}`, + values: { + name: `Item ${order}`, + description: + size === "extreme" + ? faker.string.sample({ + min: 307200, + max: 358400 + }) + : null + } + }); +}; diff --git a/packages/api-sync-system/__tests__/mocks/transformHandler.ts b/packages/api-sync-system/__tests__/mocks/transformHandler.ts new file mode 100644 index 00000000000..0247a0a82a5 --- /dev/null +++ b/packages/api-sync-system/__tests__/mocks/transformHandler.ts @@ -0,0 +1,11 @@ +import { PluginsContainer } from "@webiny/plugins"; +import { + type ITransformHandlerParams, + TransformHandler +} from "~/resolver/app/transform/TransformHandler"; + +export const createMockTransformHandler = (params: Partial = {}) => { + return new TransformHandler({ + plugins: params.plugins || new PluginsContainer() + }); +}; diff --git a/packages/api-sync-system/__tests__/resolver/app/RecordHandler.test.ts b/packages/api-sync-system/__tests__/resolver/app/RecordHandler.test.ts new file mode 100644 index 00000000000..7e723b66a45 --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/app/RecordHandler.test.ts @@ -0,0 +1,68 @@ +import { createRecordHandler, RecordHandler } from "~/resolver/app/RecordHandler.js"; +import { createMockTransformHandler } from "~tests/mocks/transformHandler.js"; +import { PluginsContainer } from "@webiny/plugins"; +import { createMockCommandBundler, createMockTableBundler } from "~tests/mocks/bundler.js"; +import { + createMockSourceDeployment, + createMockTargetDeployment +} from "~tests/mocks/deployments.js"; +import { createMockStorer } from "~tests/mocks/storer.js"; +import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; +import { createMockFetcher } from "~tests/mocks/fetcher.js"; +import { createDeployments } from "~/resolver/deployment/Deployments.js"; +import { createIngestorResult } from "~/resolver/app/ingestor/IngestorResult.js"; + +describe("RecordHandler", () => { + const createDocumentClient = () => { + return getDocumentClient(); + }; + const plugins = new PluginsContainer(); + const transformHandler = createMockTransformHandler({ + plugins + }); + const commandBundler = createMockCommandBundler(); + const tableBundler = createMockTableBundler(); + const sourceDeployment = createMockSourceDeployment(); + const targetDeployment = createMockTargetDeployment(); + + const deployments = createDeployments({ + deployments: [sourceDeployment, targetDeployment] + }); + const storer = createMockStorer({ + createDocumentClient + }); + const fetcher = createMockFetcher({ + createDocumentClient + }); + + it("should create a RecordHandler instance", () => { + const handler = createRecordHandler({ + plugins, + transformHandler, + commandBundler, + tableBundler, + deployments, + fetcher, + storer + }); + expect(handler).toBeInstanceOf(RecordHandler); + }); + + it("should handle empty data", async () => { + const handler = createRecordHandler({ + plugins, + transformHandler, + commandBundler, + tableBundler, + deployments, + fetcher, + storer + }); + const ingestorResult = createIngestorResult(); + const result = await handler.handle({ + data: ingestorResult + }); + + expect(result).toEqual(undefined); + }); +}); diff --git a/packages/api-sync-system/__tests__/resolver/app/bundler/Bundler.test.ts b/packages/api-sync-system/__tests__/resolver/app/bundler/Bundler.test.ts new file mode 100644 index 00000000000..a3cede551aa --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/app/bundler/Bundler.test.ts @@ -0,0 +1,265 @@ +import { Bundler, createBundler } from "~/resolver/app/bundler/Bundler.js"; +import { createBundles } from "~/resolver/app/bundler/Bundles"; +import { BaseBundle } from "~/resolver/app/bundler/BaseBundle.js"; +import { createMockDeployment } from "~tests/mocks/deployments.js"; +import { createRegularMockTable } from "~tests/mocks/table.js"; +import type { IIngestorResultItem } from "~/resolver/app/ingestor/types.js"; +import { CommandBundle, createCommandBundle } from "~/resolver/app/bundler/CommandBundle.js"; +import { createTableBundle, TableBundle } from "~/resolver/app/bundler/TableBundle.js"; + +class MockBundle extends BaseBundle { + public override canAdd(item: IIngestorResultItem): boolean { + return ( + item.command === this.command && + item.source.name === this.source.name && + this.table.name === item.table.name + ); + } +} + +describe("Bundler", () => { + it("should create bundler", () => { + const bundler = createBundler({ + createBundles: () => { + return createBundles({ + createBundle: item => { + return new MockBundle({ + command: item.command, + table: item.table, + source: item.source + }); + } + }); + } + }); + + expect(bundler).toBeInstanceOf(Bundler); + }); + + it("should bundle items", () => { + const bundler = createBundler({ + createBundles: () => { + return createBundles({ + createBundle: item => { + return new MockBundle({ + command: item.command, + table: item.table, + source: item.source + }); + } + }); + } + }); + + const table = createRegularMockTable(); + const source = createMockDeployment(); + + const item: IIngestorResultItem = { + command: "put", + PK: "pk1", + SK: "sk1", + table, + source + }; + + const bundles = bundler.bundle({ + items: [item] + }); + + expect(bundles.getBundles()).toHaveLength(1); + + const bundle = bundles.getBundles()[0]; + + expect(bundle.table).toEqual(table); + expect(bundle.source).toEqual(source); + + expect(bundle.items).toHaveLength(1); + + expect(bundle.items[0]).toEqual({ + PK: item.PK, + SK: item.SK + }); + + const item2: IIngestorResultItem = { + command: "put", + PK: "pk2", + SK: "sk2", + table, + source + }; + + const item3: IIngestorResultItem = { + command: "delete", + PK: "pk3", + SK: "sk3", + table, + source + }; + + const item4: IIngestorResultItem = { + command: "put", + PK: "pk4", + SK: "sk4", + table, + source + }; + + const item5: IIngestorResultItem = { + command: "put", + PK: "pk5", + SK: "sk5", + table, + source + }; + + const secondBundle = bundler.bundle({ + items: [item2, item3, item4, item5] + }); + + expect(secondBundle.getBundles()).toHaveLength(3); + }); + + it("should bundle items by command", () => { + const bundler = createBundler({ + createBundles: () => { + return createBundles({ + createBundle: item => { + return createCommandBundle({ + command: item.command, + table: item.table, + source: item.source + }); + } + }); + } + }); + + const table = createRegularMockTable(); + const source = createMockDeployment(); + + const item1: IIngestorResultItem = { + command: "put", + PK: "pk1", + SK: "sk1", + table, + source + }; + + const item2: IIngestorResultItem = { + command: "put", + PK: "pk2", + SK: "sk2", + table, + source + }; + + const item3: IIngestorResultItem = { + command: "delete", + PK: "pk3", + SK: "sk3", + table, + source + }; + + const item4: IIngestorResultItem = { + command: "put", + PK: "pk4", + SK: "sk4", + table, + source + }; + + const item5: IIngestorResultItem = { + command: "put", + PK: "pk5", + SK: "sk5", + table, + source + }; + + const bundeled = bundler.bundle({ + items: [item1, item2, item3, item4, item5] + }); + + const bundles = bundeled.getBundles(); + + expect(bundles).toHaveLength(3); + expect(bundles[0]).toBeInstanceOf(CommandBundle); + expect(bundles[1]).toBeInstanceOf(CommandBundle); + expect(bundles[2]).toBeInstanceOf(CommandBundle); + + expect(bundles[0].items).toHaveLength(2); + expect(bundles[1].items).toHaveLength(1); + expect(bundles[2].items).toHaveLength(2); + }); + + it("should bundle items by table", () => { + const bundler = createBundler({ + createBundles: () => { + return createBundles({ + createBundle: item => { + return createTableBundle({ + command: item.command, + table: item.table, + source: item.source + }); + } + }); + } + }); + + const table = createRegularMockTable(); + const source = createMockDeployment(); + + const item1: IIngestorResultItem = { + command: "put", + PK: "pk1", + SK: "sk1", + table, + source + }; + + const item2: IIngestorResultItem = { + command: "put", + PK: "pk2", + SK: "sk2", + table, + source + }; + + const item3: IIngestorResultItem = { + command: "delete", + PK: "pk3", + SK: "sk3", + table, + source + }; + + const item4: IIngestorResultItem = { + command: "put", + PK: "pk4", + SK: "sk4", + table, + source + }; + + const item5: IIngestorResultItem = { + command: "put", + PK: "pk5", + SK: "sk5", + table, + source + }; + + const bundeled = bundler.bundle({ + items: [item1, item2, item3, item4, item5] + }); + + const bundles = bundeled.getBundles(); + + expect(bundles).toHaveLength(1); + expect(bundles[0]).toBeInstanceOf(TableBundle); + + expect(bundles[0].items).toHaveLength(5); + }); +}); diff --git a/packages/api-sync-system/__tests__/resolver/app/commandHandler/DeleteCommandHandler.test.ts b/packages/api-sync-system/__tests__/resolver/app/commandHandler/DeleteCommandHandler.test.ts new file mode 100644 index 00000000000..3b6beaf5aeb --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/app/commandHandler/DeleteCommandHandler.test.ts @@ -0,0 +1,55 @@ +import { DeleteCommandHandler } from "~/resolver/app/commandHandler/DeleteCommandHandler.js"; +import { createMockStorer } from "~tests/mocks/storer.js"; +import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb/index.js"; +import { createRegularMockTable } from "~tests/mocks/table.js"; +import { createMockTargetDeployment } from "~tests/mocks/deployments.js"; +import { createDeleteCommandHandlerPlugin } from "~/resolver/app/commandHandler/delete.js"; + +describe("DeleteCommandHandler", () => { + const table = createRegularMockTable(); + const targetDeployment = createMockTargetDeployment(); + const storer = createMockStorer({ + createDocumentClient: params => { + return getDocumentClient({ + region: params.region + }); + } + }); + + it("should create a delete command handler plugin", async () => { + const plugin = createDeleteCommandHandlerPlugin(); + + expect(plugin.canHandle("delete")).toBeTrue(); + expect(plugin.canHandle("put")).toBeFalse(); + + const result = await plugin.handle({ + storer, + targetTable: table, + items: [], + targetDeployment + }); + + expect(result).toBeUndefined(); + }); + + it("should create a delete command handler", async () => { + const handler = new DeleteCommandHandler({ + storer + }); + + await handler.handle({ + targetTable: table, + items: [ + { + PK: "T#1", + SK: "T#1" + }, + { + PK: "T#2", + SK: "" + } + ], + targetDeployment + }); + }); +}); diff --git a/packages/api-sync-system/__tests__/resolver/app/commandHandler/PutCommandHandler.test.ts b/packages/api-sync-system/__tests__/resolver/app/commandHandler/PutCommandHandler.test.ts new file mode 100644 index 00000000000..d023945ccd1 --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/app/commandHandler/PutCommandHandler.test.ts @@ -0,0 +1,59 @@ +import { PutCommandHandler } from "~/resolver/app/commandHandler/PutCommandHandler.js"; +import { createMockStorer } from "~tests/mocks/storer.js"; +import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb/index.js"; +import { createRegularMockTable } from "~tests/mocks/table.js"; +import { createMockTargetDeployment } from "~tests/mocks/deployments.js"; +import { createPutCommandHandlerPlugin } from "~/resolver/app/commandHandler/put.js"; + +describe("PutCommandHandler", () => { + const table = createRegularMockTable(); + const targetDeployment = createMockTargetDeployment(); + const storer = createMockStorer({ + createDocumentClient: params => { + return getDocumentClient({ + region: params.region + }); + } + }); + + it("should create a put command handler plugin", async () => { + const plugin = createPutCommandHandlerPlugin(); + + expect(plugin.canHandle("put")).toBeTrue(); + expect(plugin.canHandle("delete")).toBeFalse(); + + const result = await plugin.handle({ + storer, + targetTable: table, + items: [], + targetDeployment + }); + + expect(result).toBeUndefined(); + }); + + it("should create a put command handler", async () => { + const handler = new PutCommandHandler({ + storer + }); + + await handler.handle({ + targetTable: table, + items: [ + { + PK: "T#1", + SK: "T#1", + values: { + someStringValue: "1", + someNumberValue: 2 + } + }, + { + PK: "T#2", + SK: "" + } + ], + targetDeployment + }); + }); +}); diff --git a/packages/api-sync-system/__tests__/resolver/app/data/SourceDataContainer.test.ts b/packages/api-sync-system/__tests__/resolver/app/data/SourceDataContainer.test.ts new file mode 100644 index 00000000000..192bc21f54f --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/app/data/SourceDataContainer.test.ts @@ -0,0 +1,119 @@ +import { SourceDataContainer } from "~/resolver/app/data/SourceDataContainer.js"; +import type { IInputItem } from "~/resolver/app/data/types.js"; +import { createMockSourceDeployment } from "~tests/mocks/deployments.js"; +import { createRegularMockTable } from "~tests/mocks/table.js"; + +describe("SourceDataContainer", () => { + const table = createRegularMockTable(); + const source = createMockSourceDeployment(); + + const item1: IInputItem = Object.freeze({ + source, + table, + PK: "pk1", + SK: "sk1" + }); + const item2: IInputItem = Object.freeze({ + source, + table, + PK: "pk2", + SK: "sk2" + }); + + it("should create a source data container", () => { + const container = SourceDataContainer.create(); + + expect(container).toBeInstanceOf(SourceDataContainer); + }); + + it("should have no items in the container", () => { + const container = SourceDataContainer.create(); + + expect(Object.keys(container.items)).toHaveLength(0); + expect(container.items).toEqual({}); + + expect( + container.get({ + PK: "PK", + SK: "SK", + table, + source + }) + ).toBeNull(); + }); + + it("should add items to the container", () => { + const container = SourceDataContainer.create(); + + container.add(item1, { + PK: item1.PK, + SK: item1.SK, + nothing: true + }); + /** + * Should not add a second item with the same PK and SK. + */ + container.add(item1, { + PK: item1.PK, + SK: item1.SK, + nothing: true + }); + + container.add(item2, { + PK: item2.PK, + SK: item2.SK, + nothing: false + }); + + expect(Object.keys(container.items)).toHaveLength(2); + + expect(container.get(item1)).toEqual({ + PK: item1.PK, + SK: item1.SK, + nothing: true + }); + expect(container.get(item2)).toEqual({ + PK: item2.PK, + SK: item2.SK, + nothing: false + }); + }); + + it("should merge two containers into one", () => { + const container1 = SourceDataContainer.create(); + const container2 = SourceDataContainer.create(); + + container1.add(item1, { + PK: item1.PK, + SK: item1.SK, + nothing: true + }); + container2.add(item2, { + PK: item2.PK, + SK: item2.SK, + nothing: false + }); + + container1.merge(container2); + expect(Object.keys(container1.items)).toHaveLength(2); + expect(container1.get(item1)).toEqual({ + PK: item1.PK, + SK: item1.SK, + nothing: true + }); + expect(container1.get(item2)).toEqual({ + PK: item2.PK, + SK: item2.SK, + nothing: false + }); + + expect(Object.keys(container2.items)).toHaveLength(1); + + expect(container2.get(item1)).toEqual(null); + expect(container2.get(item2)).toEqual({ + PK: item2.PK, + SK: item2.SK, + nothing: false + }); + }); +}); diff --git a/packages/api-sync-system/__tests__/resolver/app/fetcher/Fetcher.test.ts b/packages/api-sync-system/__tests__/resolver/app/fetcher/Fetcher.test.ts new file mode 100644 index 00000000000..90f2be85da7 --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/app/fetcher/Fetcher.test.ts @@ -0,0 +1,115 @@ +import { createFetcher } from "~/resolver/app/fetcher/Fetcher.js"; +import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb/index.js"; +import { createMockSourceDeployment } from "~tests/mocks/deployments.js"; +import { createRegularMockTable } from "~tests/mocks/table.js"; +import { SourceDataContainer } from "~/resolver/app/data/SourceDataContainer.js"; +import { createMockTableItemData, storeMockTableItems } from "~tests/mocks/tableItem.js"; + +const item1 = createMockTableItemData({ + order: 1 +}); +const item2 = createMockTableItemData({ + order: 2 +}); +const item3 = createMockTableItemData({ + order: 3 +}); +const item4 = createMockTableItemData({ + order: 4 +}); +const item5 = createMockTableItemData({ + order: 5 +}); +const item6 = createMockTableItemData({ + order: 6 +}); +const item7 = createMockTableItemData({ + order: 7 +}); + +describe("Fetcher", () => { + const table = createRegularMockTable(); + const client = getDocumentClient(); + + it("should initialize the fetcher and execute with empty input and result", async () => { + const fetcher = createFetcher({ + maxRetries: 1, + retryDelay: 100, + createDocumentClient() { + return client; + } + }); + + const result = await fetcher.exec({ + maxBatchSize: 1, + deployment: createMockSourceDeployment(), + table: createRegularMockTable(), + items: [] + }); + + expect(result).toEqual({ + items: SourceDataContainer.create() + }); + }); + + it("should fetch some items", async () => { + const fetcher = createFetcher({ + createDocumentClient() { + return client; + } + }); + + await storeMockTableItems({ + client, + table, + items: [item1, item2, item3, item4] + }); + + const result = await fetcher.exec({ + maxBatchSize: 1, + deployment: createMockSourceDeployment(), + table: createRegularMockTable(), + items: [item1, item2, item3, item4, item5, item6, item7] + }); + const items = Object.values(result.items?.items || {}); + + expect(items).toHaveLength(7); + + expect(items[0].data).toEqual(item1); + expect(items[1].data).toEqual(item2); + expect(items[2].data).toEqual(item3); + expect(items[3].data).toEqual(item4); + expect(items[4].data).toEqual(null); + expect(items[5].data).toEqual(null); + expect(items[6].data).toEqual(null); + }); + + it("should fail on retries", async () => { + const message = `Test failure.`; + const fetcher = createFetcher({ + maxRetries: 1, + retryDelay: 100, + createDocumentClient() { + return { + send: async () => { + throw new Error(message); + } + }; + } + }); + + await storeMockTableItems({ + client, + table, + items: [item1] + }); + + await expect(async () => { + return await fetcher.exec({ + deployment: createMockSourceDeployment(), + table: createRegularMockTable(), + items: [item1, item2, item3, item4] + }); + }).rejects.toThrow(message); + }); +}); diff --git a/packages/api-sync-system/__tests__/resolver/app/ingestor/Ingestor.test.ts b/packages/api-sync-system/__tests__/resolver/app/ingestor/Ingestor.test.ts new file mode 100644 index 00000000000..602afff06c3 --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/app/ingestor/Ingestor.test.ts @@ -0,0 +1,57 @@ +import { createIngestor, Ingestor } from "~/resolver/app/ingestor/Ingestor.js"; +import { createIngestorResult, IngestorResult } from "~/resolver/app/ingestor/IngestorResult.js"; +import { createMockSourceDeployment } from "~tests/mocks/deployments.js"; +import { createMockSQSEvent } from "~tests/mocks/sqsEvent.js"; +import { createRecordsValidation } from "~/resolver/app/RecordsValidation.js"; + +describe("Ingestor", () => { + const source = createMockSourceDeployment(); + + it("should ingest empty array", async () => { + const ingestor = createIngestor({ + createIngestorResult, + getSource() { + return source; + } + }); + + expect(ingestor).toBeInstanceOf(Ingestor); + + const result = await ingestor.ingest({ + records: [] + }); + + expect(result).toBeInstanceOf(IngestorResult); + expect(result.getItems()).toEqual([]); + }); + + it("should ingest items", async () => { + const ingestor = createIngestor({ + createIngestorResult, + getSource() { + return source; + } + }); + + const event = createMockSQSEvent(); + + const validation = await createRecordsValidation().validate(event.Records); + + expect(validation.error).toBeUndefined(); + const records = validation.records || []; + + const result = await ingestor.ingest({ + records + }); + + expect(result).toBeInstanceOf(IngestorResult); + const items = result.getItems(); + expect(items).toHaveLength(1); + expect(items).toMatchObject([ + { + PK: "pk1", + SK: "sk1" + } + ]); + }); +}); diff --git a/packages/api-sync-system/__tests__/resolver/app/ingestor/IngestorResult.test.ts b/packages/api-sync-system/__tests__/resolver/app/ingestor/IngestorResult.test.ts new file mode 100644 index 00000000000..f0eaece9777 --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/app/ingestor/IngestorResult.test.ts @@ -0,0 +1,32 @@ +import { createIngestorResult, IngestorResult } from "~/resolver/app/ingestor/IngestorResult.js"; + +describe("IngestorResult", () => { + it("should create result and have no items", async () => { + const result = createIngestorResult(); + + expect(result).toBeInstanceOf(IngestorResult); + expect(result.getItems()).toHaveLength(0); + }); + + it("should fail on adding item without source table", async () => { + const result = createIngestorResult(); + + console.error = jest.fn(); + + result.add({ + item: { + command: "put", + tableName: "", + // @ts-expect-error + tableType: "unknownTableType", + PK: "pk1", + SK: "sk1" + } + }); + + expect(console.error).toHaveBeenCalledTimes(1); + expect(console.error).toHaveBeenCalledWith( + "Could not find table for SQS Record source: / unknownTableType. More info in next log line." + ); + }); +}); diff --git a/packages/api-sync-system/__tests__/resolver/app/storer/Storer.test.ts b/packages/api-sync-system/__tests__/resolver/app/storer/Storer.test.ts new file mode 100644 index 00000000000..22af4b1f305 --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/app/storer/Storer.test.ts @@ -0,0 +1,90 @@ +import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb/index.js"; +import { createStorer, Storer } from "~/resolver/app/storer/Storer.js"; +import { createRegularMockTable } from "~tests/mocks/table.js"; +import { createMockTargetDeployment } from "~tests/mocks/deployments.js"; +import { createMockTableItemData } from "~tests/mocks/tableItem.js"; +import { ScanCommand } from "@webiny/aws-sdk/client-dynamodb/index.js"; + +const item1 = createMockTableItemData({ + order: 1, + size: "extreme" +}); +const item2 = createMockTableItemData({ + order: 2, + size: "extreme" +}); +const item3 = createMockTableItemData({ + order: 3, + size: "extreme" +}); + +describe("Storer", () => { + const client = getDocumentClient(); + + const table = createRegularMockTable(); + const deployment = createMockTargetDeployment(); + + it("should create a new Storer instance", () => { + const storer = createStorer({ + createDocumentClient: () => { + return client; + } + }); + + expect(storer).toBeInstanceOf(Storer); + }); + + it("should store items in batches", async () => { + const storer = createStorer({ + maxBatchSize: 5, + createDocumentClient: () => { + return client; + } + }); + + await storer.store({ + command: "put", + items: [item1, item2, item3], + table, + deployment + }); + + const scanned = await client.send( + new ScanCommand({ + TableName: table.name, + Limit: 1000 + }) + ); + + expect(scanned.Items).toHaveLength(3); + expect(scanned.Items).toEqual( + expect.arrayContaining([ + expect.objectContaining(item1), + expect.objectContaining(item2), + expect.objectContaining(item3) + ]) + ); + }); + + it("should throw an error if the command is not supported", async () => { + const storer = createStorer({ + createDocumentClient: () => { + return client; + } + }); + + console.error = jest.fn(); + + const command = "unsupported"; + + await storer.store({ + // @ts-expect-error + command, + items: [item1], + table, + deployment + }); + + expect(console.error).toHaveBeenCalledWith(`Error getting request type: ${command}.`); + }); +}); diff --git a/packages/api-sync-system/__tests__/resolver/app/transform/TransformHandler.test.ts b/packages/api-sync-system/__tests__/resolver/app/transform/TransformHandler.test.ts new file mode 100644 index 00000000000..0fc2f73ac21 --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/app/transform/TransformHandler.test.ts @@ -0,0 +1,171 @@ +import { PluginsContainer } from "@webiny/plugins"; +import { TransformHandler } from "~/resolver/app/transform/TransformHandler.js"; +import { TransformRecordPlugin } from "~/resolver/plugins/TransformRecordPlugin.js"; +import { createRegularMockTable } from "~tests/mocks/table.js"; +import { + createMockSourceDeployment, + createMockTargetDeployment +} from "~tests/mocks/deployments.js"; +import { createMockTableItemData } from "~tests/mocks/tableItem.js"; +import { SemVer } from "semver"; + +const item1 = createMockTableItemData({ + order: 1 +}); +const item2 = createMockTableItemData({ + order: 2 +}); +const item3 = createMockTableItemData({ + order: 3 +}); +const item4 = createMockTableItemData({ + order: 4 +}); +const sourceTable = createRegularMockTable(); +const sourceDeployment = createMockSourceDeployment({ + version: new SemVer("5.42.0") +}); +const targetTable = createRegularMockTable(); +const targetDeployment = createMockTargetDeployment({ + version: new SemVer("5.43.0") +}); + +const plugins = new PluginsContainer([ + new TransformRecordPlugin({ + canTransform: ({ from }) => { + return from.version.minor === 40; + }, + async transform() { + throw new Error("Should never be called."); + } + }), + new TransformRecordPlugin({ + canTransform: ({ from, to }) => { + if (from.version.minor !== 42) { + return false; + } else if (to.version.minor !== 43) { + return false; + } + return true; + }, + async transform(_, next) { + const result = await next(); + console.log({ + result + }); + return { + ...result, + transformed: true + }; + } + }) +]); + +describe("TransformHandler", () => { + it("should transform the data in correct order", async () => { + console.info = jest.fn(); + const canTransform = () => { + return true; + }; + const handler = new TransformHandler({ + plugins: new PluginsContainer([ + new TransformRecordPlugin({ + canTransform, + transform: async (_, next) => { + return { + ...(await next()), + first: true, + order: 1 + }; + } + }), + new TransformRecordPlugin({ + canTransform, + transform: async (_, next) => { + return { + ...(await next()), + second: true, + order: 2 + }; + } + }), + new TransformRecordPlugin({ + canTransform, + transform: async (_, next) => { + return { + ...(await next()), + third: true, + order: 3 + }; + } + }), + new TransformRecordPlugin({ + canTransform, + transform: async (_, next) => { + return { + ...(await next()), + fourth: true, + order: 4 + }; + } + }) + ]) + }); + + const result = await handler.transform({ + sourceTable, + sourceDeployment, + targetDeployment, + targetTable, + items: [item1] + }); + + expect(result).toEqual({ + items: [ + { + ...item1, + order: 1, + first: true, + second: true, + third: true, + fourth: true + } + ] + }); + }); + + it("should transform the data", async () => { + const handler = new TransformHandler({ + plugins + }); + + const result = await handler.transform({ + sourceTable, + sourceDeployment, + targetDeployment, + targetTable, + items: [item1, item2, item3, item4] + }); + + expect(result).toEqual({ + items: [ + { + ...item1, + transformed: true + }, + { + ...item2, + transformed: true + }, + { + ...item3, + transformed: true + }, + { + ...item4, + transformed: true + } + ] + }); + }); +}); diff --git a/packages/api-sync-system/__tests__/resolver/app/transform/middleware.test.ts b/packages/api-sync-system/__tests__/resolver/app/transform/middleware.test.ts new file mode 100644 index 00000000000..acfe4baafb2 --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/app/transform/middleware.test.ts @@ -0,0 +1,70 @@ +import { middleware } from "~/resolver/app/transform/middleware.js"; + +describe("middleware", () => { + it("should not have any middlewares to call - return default value", async () => { + const runner = middleware([]); + + const result = await runner( + {}, + { + default: true + } + ); + + expect(result).toEqual({ + default: true + }); + }); + + it("should call a middleware", async () => { + console.log = jest.fn(); + + const runner = middleware([ + async (input, next) => { + const result = await next(); + console.log({ + result + }); + return { + first: true + }; + } + ]); + + const result = await runner( + {}, + { + default: true + } + ); + + expect(console.log).toHaveBeenCalledWith({ + result: { + default: true + } + }); + + expect(result).toEqual({ + first: true + }); + }); + + it("should it should not be possible to call next() multiple times", async () => { + const runner = middleware([ + async (_, next) => { + await next(); + await next(); + return {}; + } + ]); + + await expect( + runner( + {}, + { + default: true + } + ) + ).rejects.toThrow("next() called multiple times"); + }); +}); diff --git a/packages/api-sync-system/__tests__/resolver/createEventHandlerPlugin.test.ts b/packages/api-sync-system/__tests__/resolver/createEventHandlerPlugin.test.ts new file mode 100644 index 00000000000..297f27bc019 --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/createEventHandlerPlugin.test.ts @@ -0,0 +1,140 @@ +import { createEventHandlerPlugin } from "~/resolver/createEventHandlerPlugin.js"; +import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb/index.js"; +import { SQSEventHandler } from "@webiny/handler-aws/sqs"; +import { createMockSQSEventRecord } from "~tests/mocks/sqsEvent.js"; +import { createMockContext } from "~tests/mocks/context.js"; +import { createLambdaContext } from "~tests/mocks/lambdaContext.js"; +import type { SQSEvent } from "@webiny/aws-sdk/types/index.js"; +import { createMockDeploymentData, storeDeployment } from "~tests/mocks/deployments.js"; +import type { + DynamoDBClientConfig, + DynamoDBDocument +} from "@webiny/aws-sdk/client-dynamodb/index.js"; +import { createMockSystem } from "~tests/mocks/system.js"; +import { DYNAMODB_REGULAR } from "~tests/mocks/constants.js"; + +describe("createEventHandlerPlugin", () => { + const tableName = process.env.DB_TABLE as string; + const createDocumentClient = (params?: DynamoDBClientConfig) => { + return getDocumentClient(params); + }; + + let client: DynamoDBDocument; + beforeEach(() => { + client = createDocumentClient(); + }); + + it("should create handler and fail with error because of missing tableName", async () => { + const handler = createEventHandlerPlugin({ + tableName: undefined, + createDocumentClient + }); + expect(handler).toBeInstanceOf(SQSEventHandler); + + const { context, request, reply } = createMockContext(); + const lambdaContext = createLambdaContext(); + + try { + const result = await handler.cb({ + context, + reply, + request, + lambdaContext, + next: () => { + return new Promise(resolve => { + setTimeout(() => { + return resolve({} as any); + }, 100); + }); + }, + event: {} as any + }); + expect(result).toEqual("SHOULD NOT REACH!"); + } catch (ex) { + expect(ex.message).toEqual("Table name variable is not set."); + } + }); + + it("should create handler and resolve successfully", async () => { + const handler = createEventHandlerPlugin({ + tableName, + createDocumentClient + }); + + await storeDeployment({ + client, + tableName, + item: createMockDeploymentData({ + env: "test", + variant: "green" + }) + }); + await storeDeployment({ + client, + tableName, + item: createMockDeploymentData({ + env: "test", + variant: "blue" + }) + }); + + const lambdaContext = createLambdaContext(); + const { context, request, reply, getSent } = createMockContext(); + + const event: SQSEvent = { + Records: [ + createMockSQSEventRecord({ + body: JSON.stringify({ + version: "1", + id: "something", + "detail-type": "synchronization-input", + source: "webiny:testing", + account: "1234", + time: "something", + region: "eu-central-1", + resources: [], + detail: JSON.stringify({ + items: [ + { + tableName, + tableType: DYNAMODB_REGULAR, + PK: "pk1", + SK: "sk1", + command: "put" + } + ], + source: createMockSystem({ + env: "test", + variant: "blue" + }) + }), + eventBusName: "something" + }) + }) + ] + }; + + await handler.cb({ + context, + reply, + request, + lambdaContext, + next: () => { + return new Promise(resolve => { + setTimeout(() => { + return resolve({} as any); + }, 100); + }); + }, + event + }); + + const sent = getSent(); + + expect(sent).toEqual([ + { + ok: true + } + ]); + }); +}); diff --git a/packages/api-sync-system/__tests__/resolver/createResolverHandler.test.ts b/packages/api-sync-system/__tests__/resolver/createResolverHandler.test.ts new file mode 100644 index 00000000000..1eab6b9a026 --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/createResolverHandler.test.ts @@ -0,0 +1,46 @@ +import { SQSEvent } from "@webiny/aws-sdk/types"; +import { createResolverHandler } from "~/resolver/createResolverHandler.js"; +import { createMockSQSEventRecord } from "~tests/mocks/sqsEvent.js"; +import { createLambdaContext } from "~tests/mocks/lambdaContext.js"; +import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb/index.js"; + +describe("createResolverHandler", () => { + it("should create a resolver handler and get an error on input because of no deployments", async () => { + const handler = createResolverHandler({ + plugins: [], + createDocumentClient: params => { + return getDocumentClient(params); + } + }); + + const event: SQSEvent = { + Records: [createMockSQSEventRecord()] + }; + + const result = await handler(event, createLambdaContext()); + + expect(result).toEqual({ + body: expect.any(String), + headers: { + "access-control-allow-headers": "*", + "access-control-allow-methods": "POST", + "access-control-allow-origin": "*", + "cache-control": "no-store", + connection: "keep-alive", + "content-length": "111", + "content-type": "text/plain; charset=utf-8", + date: expect.toBeDateString() + }, + isBase64Encoded: false, + statusCode: 500 + }); + + expect(JSON.parse(result.body)).toEqual({ + message: "No deployments found which need to be synced.", + code: "NO_DEPLOYMENTS", + data: { + table: process.env.DB_TABLE + } + }); + }); +}); diff --git a/packages/api-sync-system/__tests__/resolver/deployment/Deployment.test.ts b/packages/api-sync-system/__tests__/resolver/deployment/Deployment.test.ts new file mode 100644 index 00000000000..daab66ae26d --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/deployment/Deployment.test.ts @@ -0,0 +1,36 @@ +import { createMockDeployment } from "~tests/mocks/deployments.js"; + +describe("Deployment", () => { + it("should get table information", () => { + const deployment = createMockDeployment(); + + expect(deployment.getTable("regular")).toEqual({ + name: deployment.services.primaryDynamoDbName, + arn: deployment.services.primaryDynamoDbArn, + type: "regular" + }); + expect(deployment.getTable("elasticsearch")).toEqual({ + name: deployment.services.elasticsearchDynamodbTableName, + arn: deployment.services.elasticsearchDynamodbTableArn, + type: "elasticsearch" + }); + expect(deployment.getTable("log")).toEqual({ + name: deployment.services.logDynamodbTableName, + arn: deployment.services.logDynamodbTableArn, + type: "log" + }); + + expect(() => { + deployment.getTable("unknown" as any); + }).toThrow(`Unknown table type "unknown".`); + + const deploymentWithoutElasticsearch = createMockDeployment({ + elasticsearchDynamodbTableName: undefined, + elasticsearchDynamodbTableArn: undefined + }); + + expect(() => { + deploymentWithoutElasticsearch.getTable("elasticsearch"); + }).toThrow(`Unknown table type "elasticsearch" - no data.`); + }); +}); diff --git a/packages/api-sync-system/__tests__/resolver/deployment/Deployments.test.ts b/packages/api-sync-system/__tests__/resolver/deployment/Deployments.test.ts new file mode 100644 index 00000000000..76daf3ce1b0 --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/deployment/Deployments.test.ts @@ -0,0 +1,32 @@ +import { createDeployments, Deployments } from "~/resolver/deployment/Deployments.js"; +import { createMockDeployment } from "~tests/mocks/deployments.js"; + +describe("Deployments", () => { + it("should create deployments object", () => { + const mockDeploymentTestBlue = createMockDeployment({ + name: "test#blue", + env: "test", + variant: "blue" + }); + const mockDeploymentTestGreen = createMockDeployment({ + name: "test#green", + env: "test", + variant: "green" + }); + const deployments = createDeployments({ + deployments: [mockDeploymentTestBlue, mockDeploymentTestGreen] + }); + + expect(deployments).toBeInstanceOf(Deployments); + expect(deployments.hasAny()).toBe(true); + expect(deployments.get("test#blue")).toBe(mockDeploymentTestBlue); + expect(deployments.get("test#green")).toBe(mockDeploymentTestGreen); + + const withoutBlue = deployments.without({ + name: "test#blue" + }); + expect(withoutBlue.hasAny()).toBe(true); + expect(withoutBlue.get("test#blue")).toBe(null); + expect(withoutBlue.get("test#green")).toBe(mockDeploymentTestGreen); + }); +}); diff --git a/packages/api-sync-system/__tests__/resolver/deployment/DeploymentsFetcher.test.ts b/packages/api-sync-system/__tests__/resolver/deployment/DeploymentsFetcher.test.ts new file mode 100644 index 00000000000..f32cca68644 --- /dev/null +++ b/packages/api-sync-system/__tests__/resolver/deployment/DeploymentsFetcher.test.ts @@ -0,0 +1,134 @@ +import { createDeploymentsFetcher } from "~/resolver/deployment/DeploymentsFetcher.js"; +import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb/index.js"; +import { createMockDeploymentData, storeDeployment } from "~tests/mocks/deployments.js"; + +describe("DeploymentsFetcher", () => { + const table = process.env.DB_TABLE as string; + const client = getDocumentClient(); + + it("should throw error on no deployments", async () => { + const fetcher = createDeploymentsFetcher({ + client, + table + }); + + try { + const result = await fetcher.fetch(); + expect(result).toEqual("SHOULD NOT REACH!"); + } catch (ex) { + expect(ex.message).toEqual("No deployments found which need to be synced."); + } + }); + + it("should fetch deployments", async () => { + await storeDeployment({ + client, + tableName: table, + item: createMockDeploymentData({ + env: "test", + variant: "green" + }) + }); + await storeDeployment({ + client, + tableName: table, + item: createMockDeploymentData({ + env: "test", + variant: "blue" + }) + }); + + const fetcher = createDeploymentsFetcher({ + client, + table + }); + + try { + const result = await fetcher.fetch(); + + expect(result.all()).toHaveLength(2); + } catch (ex) { + expect(ex.message).toEqual("SHOULD NOT REACH!"); + } + }); + + it("should fail to validate on invalid deployment information", async () => { + await storeDeployment({ + client, + tableName: table, + item: createMockDeploymentData({ + env: undefined, + variant: undefined, + region: undefined, + version: undefined + }) + }); + await storeDeployment({ + client, + tableName: table, + item: createMockDeploymentData({ + env: "test", + variant: "blue" + }) + }); + + const fetcher = createDeploymentsFetcher({ + client, + table + }); + + try { + const result = await fetcher.fetch(); + + expect(result).toEqual("SHOULD NOT REACH!"); + } catch (ex) { + expect(ex.message).toEqual("Validation failed."); + expect(ex.data.invalidFields).toEqual({ + "1.env": { + code: "invalid_type", + data: { + fatal: undefined, + path: [1, "env"] + }, + message: "Required" + }, + "1.region": { + code: "invalid_type", + data: { + fatal: undefined, + path: [1, "region"] + }, + message: "Required" + }, + "1.version": { + code: "invalid_type", + data: { + fatal: undefined, + path: [1, "version"] + }, + message: "Required" + } + }); + } + }); + + it("should throw an error on client.send", async () => { + const client = { + send: jest.fn(() => { + throw new Error("Unspecified error."); + }) + }; + + const fetcher = createDeploymentsFetcher({ + client, + table + }); + + try { + const result = await fetcher.fetch(); + expect(result).toEqual("SHOULD NOT REACH!"); + } catch (ex) { + expect(ex.message).toEqual("Unspecified error."); + } + }); +}); diff --git a/packages/api-sync-system/__tests__/sync/attachToDynamoDbDocument.test.ts b/packages/api-sync-system/__tests__/sync/attachToDynamoDbDocument.test.ts new file mode 100644 index 00000000000..92f42b7608c --- /dev/null +++ b/packages/api-sync-system/__tests__/sync/attachToDynamoDbDocument.test.ts @@ -0,0 +1,59 @@ +import { attachToDynamoDbDocument } from "~/sync/attachToDynamoDbDocument.js"; +import { createHandler } from "~/sync/createHandler.js"; +import { createMockSystem } from "~tests/mocks/system.js"; +import { createMockManifest } from "~tests/mocks/manifest.js"; +import { getDocumentClient } from "@webiny/aws-sdk/client-dynamodb/getDocumentClient.js"; +import { createMockEventBridgeClient } from "~tests/mocks/eventBridgeClient.js"; + +describe("attachToDynamoDbDocument", () => { + it("should not have attached decorator", async () => { + const client = getDocumentClient(); + // @ts-expect-error + expect(client.__decoratedByWebiny).toBeUndefined(); + + const anotherClient = getDocumentClient(); + // @ts-expect-error + expect(anotherClient.__decoratedByWebiny).toBeUndefined(); + }); + + it("should attach a decorator to the DynamoDB DocumentClient", async () => { + const initialClient = getDocumentClient(); + // @ts-expect-error + expect(initialClient.__decoratedByWebiny).toBeUndefined(); + + const { handler } = createHandler({ + system: createMockSystem(), + manifest: createMockManifest(), + commandConverters: [], + client: createMockEventBridgeClient() + }); + + attachToDynamoDbDocument({ + handler + }); + + const client = getDocumentClient(); + // @ts-expect-error + expect(client.__decoratedByWebiny).toBe(true); + }); + + it("should not attach a decorator if already attached", async () => { + const { handler } = createHandler({ + system: createMockSystem(), + manifest: createMockManifest(), + commandConverters: [], + client: createMockEventBridgeClient() + }); + + try { + const result = attachToDynamoDbDocument({ + handler + }); + expect(result).toEqual("SHOULD NOT REACH!"); + } catch (ex) { + expect(ex.message).toEqual( + "Cannot add more than one decoration of the document client. This is internal Webiny method, please do not use it." + ); + } + }); +}); diff --git a/packages/api-sync-system/__tests__/sync/createHandler.test.ts b/packages/api-sync-system/__tests__/sync/createHandler.test.ts new file mode 100644 index 00000000000..d5f35bdd4ce --- /dev/null +++ b/packages/api-sync-system/__tests__/sync/createHandler.test.ts @@ -0,0 +1,311 @@ +import { createHandler } from "~/sync/createHandler"; +import { createMockSystem } from "~tests/mocks/system.js"; +import { createMockManifest } from "~tests/mocks/manifest.js"; +import { Handler } from "~/sync/handler/Handler.js"; +import { HandlerConverter } from "~/sync/handler/HandlerConverter.js"; +import { createMockEventBridgeClient } from "~tests/mocks/eventBridgeClient.js"; +import { + BatchGetCommand, + BatchWriteCommand, + DeleteCommand, + GetCommand, + PutCommand, + UpdateCommand +} from "@webiny/aws-sdk/client-dynamodb"; +import { PutCommandValue } from "~/sync/handler/converter/commands/PutCommandValue.js"; +import { UpdateCommandValue } from "~/sync/handler/converter/commands/UpdateCommandValue"; +import { NullCommandValue } from "~/sync/handler/converter/commands/NullCommandValue.js"; +import { DeleteCommandValue } from "~/sync/handler/converter/commands/DeleteCommandValue"; +import { BatchWriteCommandValue } from "~/sync/handler/converter/commands/BatchWriteCommandValue.js"; +import { getTableType } from "~/sync/utils/getTableType.js"; + +describe("createHandler", () => { + const tableName = process.env.DB_TABLE as string; + + it("should create a handler and a converter", async () => { + const { handler, converter } = createHandler({ + client: createMockEventBridgeClient(), + system: createMockSystem(), + manifest: createMockManifest() + }); + + expect(handler).toBeInstanceOf(Handler); + expect(converter).toBeInstanceOf(HandlerConverter); + }); + + it("should convert delete command", async () => { + const { converter } = createHandler({ + client: createMockEventBridgeClient(), + system: createMockSystem(), + manifest: createMockManifest() + }); + + const result = converter.convert( + new DeleteCommand({ + TableName: tableName, + Key: { + PK: "p1", + SK: "s1" + } + }) + ); + + expect(result).toBeInstanceOf(DeleteCommandValue); + const items = result.getItems(); + expect(items).toHaveLength(1); + expect(items?.[0]).toEqual({ + command: "delete", + PK: "p1", + SK: "s1", + tableName, + tableType: getTableType(tableName) + }); + }); + + it("should convert put command", async () => { + const { converter } = createHandler({ + client: createMockEventBridgeClient(), + system: createMockSystem(), + manifest: createMockManifest() + }); + + const result = converter.convert( + new PutCommand({ + TableName: tableName, + Item: { + PK: "p1", + SK: "s1" + } + }) + ); + + expect(result).toBeInstanceOf(PutCommandValue); + const items = result.getItems(); + expect(items).toHaveLength(1); + expect(items?.[0]).toEqual({ + command: "put", + PK: "p1", + SK: "s1", + tableName, + tableType: getTableType(tableName) + }); + }); + + it("should convert update command", async () => { + const { converter } = createHandler({ + client: createMockEventBridgeClient(), + system: createMockSystem(), + manifest: createMockManifest() + }); + + const result = converter.convert( + new UpdateCommand({ + TableName: tableName, + Key: { + PK: "p1", + SK: "s1" + } + }) + ); + + expect(result).toBeInstanceOf(UpdateCommandValue); + const items = result.getItems(); + expect(items).toHaveLength(1); + expect(items?.[0]).toEqual({ + command: "update", + PK: "p1", + SK: "s1", + tableName, + tableType: getTableType(tableName) + }); + }); + + it("should convert get command", async () => { + const { converter } = createHandler({ + client: createMockEventBridgeClient(), + system: createMockSystem(), + manifest: createMockManifest() + }); + + const result = converter.convert( + new GetCommand({ + TableName: tableName, + Key: { + PK: "p1", + SK: "s1" + } + }) + ); + + expect(result).toBeInstanceOf(NullCommandValue); + const items = result.getItems(); + expect(items).toBeNull(); + }); + + it("should convert batch get command", async () => { + const { converter } = createHandler({ + client: createMockEventBridgeClient(), + system: createMockSystem(), + manifest: createMockManifest() + }); + + const result = converter.convert( + new BatchGetCommand({ + RequestItems: { + [tableName]: { + Keys: [ + { + PK: "p1", + SK: "s1" + }, + { + PK: "p2", + SK: "s2" + } + ] + } + } + }) + ); + + expect(result).toBeInstanceOf(NullCommandValue); + const items = result.getItems(); + expect(items).toBeNull(); + }); + + it("should convert batch write command", async () => { + const { converter } = createHandler({ + client: createMockEventBridgeClient(), + system: createMockSystem(), + manifest: createMockManifest() + }); + + const result = converter.convert( + new BatchWriteCommand({ + RequestItems: { + [tableName]: [ + { + PutRequest: { + Item: { + PK: "p1", + SK: "s1" + } + } + }, + { + DeleteRequest: { + Key: { + PK: "p2", + SK: "s2" + } + } + }, + { + PutRequest: { + Item: { + PK: "p3", + SK: "s3" + } + } + }, + { + DeleteRequest: { + Key: { + PK: "p4", + SK: "s4" + } + } + }, + { + DeleteRequest: { + Key: { + PK: "p5", + SK: "s5" + } + } + } + ] + } + }) + ); + + expect(result).toBeInstanceOf(BatchWriteCommandValue); + const items = result.getItems(); + expect(items).toHaveLength(5); + expect(items).toEqual([ + { + command: "put", + PK: "p1", + SK: "s1", + tableName, + tableType: getTableType(tableName) + }, + { + command: "delete", + PK: "p2", + SK: "s2", + tableName, + tableType: getTableType(tableName) + }, + { + command: "put", + PK: "p3", + SK: "s3", + tableName, + tableType: getTableType(tableName) + }, + { + command: "delete", + PK: "p4", + SK: "s4", + tableName, + tableType: getTableType(tableName) + }, + { + command: "delete", + PK: "p5", + SK: "s5", + tableName, + tableType: getTableType(tableName) + } + ]); + }); + + it("should not convert batch write command if no table", async () => { + const { converter } = createHandler({ + client: createMockEventBridgeClient(), + system: createMockSystem(), + manifest: createMockManifest() + }); + + const result = converter.convert( + new BatchWriteCommand({ + RequestItems: {} + }) + ); + + expect(result).toBeInstanceOf(BatchWriteCommandValue); + const items = result.getItems(); + expect(items).toBeNull(); + }); + + it("should not convert batch write command if no items in table", async () => { + const { converter } = createHandler({ + client: createMockEventBridgeClient(), + system: createMockSystem(), + manifest: createMockManifest() + }); + + const result = converter.convert( + new BatchWriteCommand({ + RequestItems: { + [tableName]: [] + } + }) + ); + + expect(result).toBeInstanceOf(BatchWriteCommandValue); + const items = result.getItems(); + expect(items).toBeNull(); + }); +}); diff --git a/packages/api-sync-system/__tests__/sync/createSendDataToEventBridgeOnRequestEnd.test.ts b/packages/api-sync-system/__tests__/sync/createSendDataToEventBridgeOnRequestEnd.test.ts new file mode 100644 index 00000000000..0c910ce8a0a --- /dev/null +++ b/packages/api-sync-system/__tests__/sync/createSendDataToEventBridgeOnRequestEnd.test.ts @@ -0,0 +1,105 @@ +import { createSendDataToEventBridgeOnRequestEnd } from "~/sync/createSendDataToEventBridgeOnRequestEnd.js"; +import { createMockSyncHandler } from "~tests/mocks/syncHandler.js"; +import { OnRequestResponsePlugin } from "@webiny/handler/plugins/OnRequestResponsePlugin.js"; +import { OnRequestTimeoutPlugin } from "@webiny/handler/plugins/OnRequestTimeoutPlugin.js"; +import { createMockEventBridgeClient } from "~tests/mocks/eventBridgeClient.js"; +import { createMockPutCommand } from "~tests/mocks/putCommand.js"; + +describe("createSendDataToEventBridgeOnRequestEnd", () => { + it("should create plugins to attach handler to request end", () => { + const handler = createMockSyncHandler(); + + const result = createSendDataToEventBridgeOnRequestEnd(handler); + + expect(result).toHaveLength(2); + expect(result[0]).toBeInstanceOf(OnRequestResponsePlugin); + expect(result[1]).toBeInstanceOf(OnRequestTimeoutPlugin); + }); + + it("should trigger flush on request end", async () => { + const send = jest.fn(); + const client = createMockEventBridgeClient({ + send + }); + const handler = createMockSyncHandler({ + client, + converter: "all" + }); + + handler.add(createMockPutCommand()); + + const plugins = createSendDataToEventBridgeOnRequestEnd(handler); + + const target = plugins[0]; + expect(target).toBeInstanceOf(OnRequestResponsePlugin); + + expect(send).not.toHaveBeenCalled(); + + await target.exec(); + + await new Promise(resolve => setTimeout(resolve, 100)); + + expect(send).toHaveBeenCalledTimes(1); + }); + + it("should trigger flush on request timeout", async () => { + const send = jest.fn(); + const client = createMockEventBridgeClient({ + send + }); + const handler = createMockSyncHandler({ + client, + converter: "all" + }); + + handler.add(createMockPutCommand()); + + const plugins = createSendDataToEventBridgeOnRequestEnd(handler); + + const target = plugins[1]; + expect(target).toBeInstanceOf(OnRequestTimeoutPlugin); + + expect(send).not.toHaveBeenCalled(); + + await target.exec(); + + await new Promise(resolve => setTimeout(resolve, 100)); + + expect(send).toHaveBeenCalledTimes(1); + }); + + it("should trigger flush on request end and get an unspecified error", async () => { + const send = jest.fn(() => { + throw new Error("Unspecified error."); + }); + const client = createMockEventBridgeClient({ + send + }); + const handler = createMockSyncHandler({ + client, + converter: "all" + }); + + handler.add(createMockPutCommand()); + + const plugins = createSendDataToEventBridgeOnRequestEnd(handler); + + const target = plugins[0]; + expect(target).toBeInstanceOf(OnRequestResponsePlugin); + + const logError = jest.fn(); + console.error = logError; + + expect(send).not.toHaveBeenCalled(); + try { + await target.exec(); + await new Promise(resolve => setTimeout(resolve, 100)); + } catch (ex) { + expect(ex).toEqual("SHOULD NOT REACH!"); + } + + expect(send).toHaveBeenCalledTimes(1); + expect(logError).toHaveBeenCalledTimes(3); + expect(logError).toHaveBeenCalledWith("Unspecified error."); + }); +}); diff --git a/packages/api-sync-system/__tests__/sync/createSyncSystem.test.ts b/packages/api-sync-system/__tests__/sync/createSyncSystem.test.ts new file mode 100644 index 00000000000..ed8d6cb5f98 --- /dev/null +++ b/packages/api-sync-system/__tests__/sync/createSyncSystem.test.ts @@ -0,0 +1,46 @@ +import { createSyncSystem } from "~/sync/createSyncSystem.js"; +import type { DynamoDBDocument } from "@webiny/aws-sdk/client-dynamodb/index.js"; +import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb/index.js"; +import { ServiceDiscovery } from "@webiny/api"; +import { createMockSystem } from "~tests/mocks/system.js"; + +describe("createSyncSystem", () => { + let client: DynamoDBDocument; + beforeEach(() => { + client = getDocumentClient({}); + ServiceDiscovery.setDocumentClient(client); + ServiceDiscovery.clear(); + }); + + it("should create an empty sync system plugins array", () => { + const error = jest.fn(); + + console.error = error; + + const syncSystem = createSyncSystem({ + system: { + env: undefined, + version: undefined, + region: undefined, + variant: undefined + }, + documentClient: client + }); + + expect(syncSystem.plugins()).toHaveLength(0); + + expect(error).toHaveBeenCalledTimes(1); + expect(error).toHaveBeenCalledWith( + "Sync System: No environment variable provided. Sync System will not be attached." + ); + }); + + it("should create a sync system plugins", async () => { + const syncSystem = createSyncSystem({ + system: createMockSystem(), + documentClient: client + }); + + expect(syncSystem.plugins()).toHaveLength(1); + }); +}); diff --git a/packages/api-sync-system/__tests__/sync/handler/Handler.test.ts b/packages/api-sync-system/__tests__/sync/handler/Handler.test.ts new file mode 100644 index 00000000000..a22e6b0fe60 --- /dev/null +++ b/packages/api-sync-system/__tests__/sync/handler/Handler.test.ts @@ -0,0 +1,127 @@ +import { Handler } from "~/sync/handler/Handler.js"; +import { createMockEventBridgeClient } from "~tests/mocks/eventBridgeClient.js"; +import { createMockHandlerConverter } from "~tests/mocks/handlerConverter.js"; +import { + DeleteCommand, + GetCommand, + PutCommand, + UpdateCommand +} from "@webiny/aws-sdk/client-dynamodb"; +import { createMockSyncHandler } from "~tests/mocks/syncHandler.js"; + +describe("Handler", () => { + const tableName = process.env.DB_TABLE as string; + + it("should create a sync handler", async () => { + const handler = createMockSyncHandler(); + + expect(handler).toBeInstanceOf(Handler); + }); + + it("should add commands and flush them", async () => { + const send = jest.fn(); + + const client = createMockEventBridgeClient({ + send + }); + + const handler = createMockSyncHandler({ + client, + converter: createMockHandlerConverter({ + commandConverters: "all" + }) + }); + + expect(client.send).not.toHaveBeenCalled(); + + /** + * No commands so nothing to flush. + */ + await handler.flush(); + expect(send).not.toHaveBeenCalled(); + + handler.add( + new GetCommand({ + TableName: tableName, + Key: { + PK: "pk0", + SK: "sk0" + } + }) + ); + + handler.add( + new PutCommand({ + TableName: tableName, + Item: { + PK: "pk1", + SK: "sk1" + } + }) + ); + handler.add( + new DeleteCommand({ + TableName: tableName, + Key: { + PK: "pk2", + SK: "sk2" + } + }) + ); + + handler.add( + new UpdateCommand({ + TableName: tableName, + Key: { + PK: "pk3", + SK: "sk3" + } + }) + ); + + // @ts-expect-error + expect(handler.commands).toHaveLength(4); + + await handler.flush(); + // @ts-expect-error + expect(handler.commands).toHaveLength(0); + + expect(send).toHaveBeenCalledTimes(1); + }); + + it("should throw an error on flush due to unknown error", async () => { + const client = createMockEventBridgeClient({ + send: async () => { + throw new Error("Unspecified error."); + } + }); + + const handler = createMockSyncHandler({ + client, + converter: "all" + }); + + handler.add( + new PutCommand({ + TableName: tableName, + Item: { + PK: "pk1", + SK: "sk1" + } + }) + ); + + const errorFn = jest.fn(); + + console.error = errorFn; + + try { + const result = await handler.flush(); + expect(result).toEqual("SHOULD NOT REACH!"); + } catch (ex) { + expect(ex.message).toEqual("Unspecified error."); + } + + expect(errorFn).toHaveBeenCalledWith("Unspecified error."); + }); +}); diff --git a/packages/api-sync-system/__tests__/sync/handler/HandlerConverter.test.ts b/packages/api-sync-system/__tests__/sync/handler/HandlerConverter.test.ts new file mode 100644 index 00000000000..32c7099110d --- /dev/null +++ b/packages/api-sync-system/__tests__/sync/handler/HandlerConverter.test.ts @@ -0,0 +1,44 @@ +import { PutCommand } from "@webiny/aws-sdk/client-dynamodb"; +import { createHandlerConverter, HandlerConverter } from "~/sync/handler/HandlerConverter"; +import { NullCommandValue } from "~/sync/handler/converter/commands/NullCommandValue.js"; + +describe("HandlerConverter", () => { + it("should create an empty handler converter", () => { + const def = new NullCommandValue(); + // @ts-expect-error + def.__test = true; + const handlerConverter = createHandlerConverter({ + default: def + }); + + expect(handlerConverter).toBeInstanceOf(HandlerConverter); + // @ts-expect-error + expect(handlerConverter.converters).toHaveLength(0); + // @ts-expect-error + expect(handlerConverter._default).toBeInstanceOf(NullCommandValue); + // @ts-expect-error + expect(handlerConverter._default.__test).toBeTrue(); + }); + + it("should return null command value as no command converters are present in handler converter", async () => { + const def = new NullCommandValue(); + // @ts-expect-error + def.__test = true; + const handlerConverter = createHandlerConverter({ + default: def + }); + + const result = handlerConverter.convert( + new PutCommand({ + TableName: process.env.DB_TABLE, + Item: { + PK: "p1", + SK: "s1" + } + }) + ); + expect(result).toBeInstanceOf(NullCommandValue); + // @ts-expect-error + expect(result.__test).toBeTrue(); + }); +}); diff --git a/packages/api-sync-system/__tests__/sync/requestPlugin.test.ts b/packages/api-sync-system/__tests__/sync/requestPlugin.test.ts new file mode 100644 index 00000000000..eeaca5b2320 --- /dev/null +++ b/packages/api-sync-system/__tests__/sync/requestPlugin.test.ts @@ -0,0 +1,56 @@ +import { createSyncSystemHandlerOnRequestPlugin } from "~/sync/requestPlugin.js"; +import { createMockSystem } from "~tests/mocks/system.js"; +import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb/index.js"; +import { HandlerOnRequestPlugin } from "@webiny/handler/plugins/HandlerOnRequestPlugin.js"; +import { createMockContext } from "~tests/mocks/context"; +import { OnRequestResponsePlugin } from "@webiny/handler/plugins/OnRequestResponsePlugin.js"; +import { OnRequestTimeoutPlugin } from "@webiny/handler/plugins/OnRequestTimeoutPlugin.js"; +import { createMockManifest, createMockManifestInDynamoDb } from "~tests/mocks/manifest.js"; +import type { DynamoDBDocument } from "@webiny/aws-sdk/client-dynamodb/index.js"; +import { ServiceDiscovery } from "@webiny/api"; + +describe("requestPlugin", () => { + let client: DynamoDBDocument; + beforeEach(() => { + client = getDocumentClient({}); + ServiceDiscovery.setDocumentClient(client); + ServiceDiscovery.clear(); + }); + + it("should not have any plugins registered if no manifest is provided", async () => { + const result = createSyncSystemHandlerOnRequestPlugin({ + system: createMockSystem(), + documentClient: client + }); + + expect(result).toBeInstanceOf(HandlerOnRequestPlugin); + + const { context, reply, request } = createMockContext(); + + await result.exec(request, reply, context); + + expect(context.plugins.byType(OnRequestResponsePlugin.type)).toHaveLength(0); + expect(context.plugins.byType(OnRequestTimeoutPlugin.type)).toHaveLength(0); + }); + + it("should have registered plugins if manifest exists", async () => { + await createMockManifestInDynamoDb({ + client, + manifest: createMockManifest().sync + }); + + const result = createSyncSystemHandlerOnRequestPlugin({ + system: createMockSystem(), + documentClient: client + }); + + expect(result).toBeInstanceOf(HandlerOnRequestPlugin); + + const { context, reply, request } = createMockContext(); + + await result.exec(request, reply, context); + + expect(context.plugins.byType(OnRequestResponsePlugin.type)).toHaveLength(1); + expect(context.plugins.byType(OnRequestTimeoutPlugin.type)).toHaveLength(1); + }); +}); diff --git a/packages/api-sync-system/__tests__/sync/utils/getTableType.test.ts b/packages/api-sync-system/__tests__/sync/utils/getTableType.test.ts new file mode 100644 index 00000000000..14c6bae3938 --- /dev/null +++ b/packages/api-sync-system/__tests__/sync/utils/getTableType.test.ts @@ -0,0 +1,23 @@ +import { getTableType } from "~/sync/utils/getTableType.js"; + +describe("getTableType", () => { + it("should return regular table type", () => { + const result = getTableType(process.env.DB_TABLE as string); + expect(result).toEqual("regular"); + }); + + it("should return elasticsearch table type", () => { + const result = getTableType(process.env.DB_TABLE_ELASTICSEARCH as string); + expect(result).toEqual("elasticsearch"); + }); + + it("should return log table type", () => { + const result = getTableType(process.env.DB_TABLE_LOG as string); + expect(result).toEqual("log"); + }); + + it("should return null for unknown table type", () => { + const result = getTableType("unknown"); + expect(result).toBe("unknown"); + }); +}); diff --git a/packages/api-sync-system/__tests__/sync/utils/manifest.test.ts b/packages/api-sync-system/__tests__/sync/utils/manifest.test.ts new file mode 100644 index 00000000000..3afc530ca2a --- /dev/null +++ b/packages/api-sync-system/__tests__/sync/utils/manifest.test.ts @@ -0,0 +1,134 @@ +import { ServiceDiscovery } from "@webiny/api"; +import { getManifest } from "~/sync/utils/manifest.js"; +import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb/index.js"; +import type { DynamoDBDocument } from "@webiny/aws-sdk/client-dynamodb/index.js"; + +describe("manifest", () => { + let client: DynamoDBDocument; + beforeEach(() => { + client = getDocumentClient({}); + ServiceDiscovery.setDocumentClient(client); + ServiceDiscovery.clear(); + }); + + it("should return error because no manifest is provided", async () => { + const result = await getManifest({ + documentClient: client + }); + + expect(result.data).toBeUndefined(); + expect(result.error.message).toEqual("Validation failed."); + expect(result.error.data).toEqual({ + invalidFields: { + sync: { + code: "invalid_type", + data: { + fatal: undefined, + path: ["sync"] + }, + message: "Required" + } + } + }); + }); + + it("should return error because sync is missing in manifest", async () => { + await client.put({ + TableName: process.env.DB_TABLE, + Item: { + PK: `SERVICE_MANIFEST#api#sync`, + SK: "default", + GSI1_PK: "SERVICE_MANIFESTS", + GSI1_SK: `api#sync`, + data: { + name: "sync", + manifest: {} + } + } + }); + const result = await getManifest({ + documentClient: client + }); + expect(result.data).toBeUndefined(); + expect(result.error.message).toEqual("Validation failed."); + expect(result.error.data).toEqual({ + invalidFields: { + "sync.eventBusArn": { + code: "invalid_type", + data: { + fatal: undefined, + path: ["sync", "eventBusArn"] + }, + message: "Required" + }, + "sync.eventBusName": { + code: "invalid_type", + data: { + fatal: undefined, + path: ["sync", "eventBusName"] + }, + message: "Required" + }, + "sync.region": { + code: "invalid_type", + data: { + fatal: undefined, + path: ["sync", "region"] + }, + message: "Required" + } + } + }); + }); + + it("should return manifest", async () => { + const eventBusArn = "arn:aws:events:eu-central-1:123456789012:event-bus/sync"; + const eventBusName = "sync"; + const region = "eu-central-1"; + await client.put({ + TableName: process.env.DB_TABLE, + Item: { + PK: `SERVICE_MANIFEST#api#sync`, + SK: "default", + GSI1_PK: "SERVICE_MANIFESTS", + GSI1_SK: `api#sync`, + data: { + name: "sync", + manifest: { + eventBusArn, + eventBusName, + region + } + } + } + }); + const result = await getManifest({ + documentClient: client + }); + + expect(result.error).toBeUndefined(); + expect(result.data).toEqual({ + sync: { + eventBusArn, + eventBusName, + region + } + }); + }); + + it("should return error because some strange error happened on ServiceDiscovery", async () => { + const original = ServiceDiscovery.load; + + ServiceDiscovery.load = jest.fn(() => { + throw new Error("Some strange error."); + }); + + const result = await getManifest({ + documentClient: client + }); + + expect(result.data).toBeUndefined(); + expect(result.error.message).toEqual("Some strange error."); + ServiceDiscovery.load = original; + }); +}); diff --git a/packages/api-sync-system/__tests__/sync/utils/validateSystemInput.test.ts b/packages/api-sync-system/__tests__/sync/utils/validateSystemInput.test.ts new file mode 100644 index 00000000000..b7ee9b11bbc --- /dev/null +++ b/packages/api-sync-system/__tests__/sync/utils/validateSystemInput.test.ts @@ -0,0 +1,62 @@ +import { validateSystemInput } from "~/sync/utils/validateSystemInput.js"; + +describe("validateSystemInput", () => { + it("should return system info when input is valid", () => { + const result = validateSystemInput({ + name: "test#blue", + env: "test", + variant: "blue", + version: "0.0.1", + region: "eu-central-1" + }); + + expect(result).toEqual({ + system: { + name: "test#blue", + env: "test", + variant: "blue", + version: "0.0.1", + region: "eu-central-1" + } + }); + }); + + it("should return an error when missing env", () => { + const result = validateSystemInput({ + name: "test#blue", + variant: "blue", + version: "0.0.1", + region: "eu-central-1" + }); + + expect(result).toEqual({ + error: "Sync System: No environment variable provided. Sync System will not be attached." + }); + }); + + it("should return an error when missing region", () => { + const result = validateSystemInput({ + name: "test#blue", + env: "test", + variant: "blue", + version: "0.0.1" + }); + + expect(result).toEqual({ + error: "Sync System: No region variable provided. Sync System will not be attached." + }); + }); + + it("should return an error when missing version", () => { + const result = validateSystemInput({ + name: "test#blue", + env: "test", + variant: "blue", + region: "eu-central-1" + }); + + expect(result).toEqual({ + error: "Sync System: No version variable provided. Sync System will not be attached." + }); + }); +}); diff --git a/packages/api-sync-system/__tests__/utils/createSystemName.test.ts b/packages/api-sync-system/__tests__/utils/createSystemName.test.ts new file mode 100644 index 00000000000..48eb53715b9 --- /dev/null +++ b/packages/api-sync-system/__tests__/utils/createSystemName.test.ts @@ -0,0 +1,21 @@ +import { createSystemName } from "~/utils/createSystemName"; + +describe("createSystemName", () => { + it("should properly create a system name out of env", () => { + const result = createSystemName({ + env: "testing", + variant: undefined + }); + + expect(result).toEqual("testing"); + }); + + it("should properly create a system name out of env and variant", () => { + const result = createSystemName({ + env: "testing", + variant: "blue" + }); + + expect(result).toEqual("testing#blue"); + }); +}); diff --git a/packages/api-sync-system/jest-dynalite-config.js b/packages/api-sync-system/jest-dynalite-config.js new file mode 100644 index 00000000000..6d5840539c8 --- /dev/null +++ b/packages/api-sync-system/jest-dynalite-config.js @@ -0,0 +1,3 @@ +const { createDynaliteTables } = require("../../jest.config.base"); + +module.exports = createDynaliteTables(); diff --git a/packages/api-sync-system/jest.setup.js b/packages/api-sync-system/jest.setup.js new file mode 100644 index 00000000000..ae02284e61f --- /dev/null +++ b/packages/api-sync-system/jest.setup.js @@ -0,0 +1,6 @@ +const base = require("../../jest.config.base"); +const presets = require("@webiny/project-utils/testing/presets")(["storage-operations"]); + +module.exports = { + ...base({ path: __dirname }, presets) +}; diff --git a/packages/api-sync-system/package.json b/packages/api-sync-system/package.json new file mode 100644 index 00000000000..313c9ef4906 --- /dev/null +++ b/packages/api-sync-system/package.json @@ -0,0 +1,42 @@ +{ + "name": "@webiny/api-sync-system", + "version": "0.0.0", + "main": "index.js", + "repository": { + "type": "git", + "url": "https://github.com/webiny/webiny-js.git" + }, + "description": "Sync System.", + "author": "Webiny LTD", + "license": "MIT", + "dependencies": { + "@webiny/api": "0.0.0", + "@webiny/aws-sdk": "0.0.0", + "@webiny/error": "0.0.0", + "@webiny/handler": "0.0.0", + "@webiny/handler-aws": "0.0.0", + "@webiny/plugins": "0.0.0", + "@webiny/utils": "0.0.0", + "lodash": "^4.17.21", + "semver": "^7.6.3", + "zod": "^3.23.8" + }, + "devDependencies": { + "@faker-js/faker": "^9.3.0", + "@types/lodash": "^4.17.13", + "@webiny/cli": "0.0.0", + "@webiny/project-utils": "0.0.0", + "jest": "^29.7.0", + "jest-dynalite": "^3.6.1", + "rimraf": "^6.0.1", + "typescript": "5.3.3" + }, + "publishConfig": { + "access": "public", + "directory": "dist" + }, + "scripts": { + "build": "node ../cli/bin.js run build", + "watch": "node ../cli/bin.js run watch" + } +} diff --git a/packages/api-sync-system/src/constants.ts b/packages/api-sync-system/src/constants.ts new file mode 100644 index 00000000000..17a6d85d95c --- /dev/null +++ b/packages/api-sync-system/src/constants.ts @@ -0,0 +1 @@ +export const SQS_EVENT_NAME = "synchronization-input" as const; diff --git a/packages/api-sync-system/src/index.ts b/packages/api-sync-system/src/index.ts new file mode 100644 index 00000000000..c5e2069e0e7 --- /dev/null +++ b/packages/api-sync-system/src/index.ts @@ -0,0 +1,2 @@ +export * from "./sync/createSyncSystem.js"; +export * from "./resolver/createResolverHandler.js"; diff --git a/packages/api-sync-system/src/resolver/app/RecordHandler.ts b/packages/api-sync-system/src/resolver/app/RecordHandler.ts new file mode 100644 index 00000000000..072727b939a --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/RecordHandler.ts @@ -0,0 +1,165 @@ +import type { IRecordHandler, IRecordHandlerHandleParams } from "./abstractions/RecordHandler.js"; +import { CommandHandlerPlugin } from "../plugins/CommandHandlerPlugin.js"; +import { convertException } from "@webiny/utils"; +import type { CommandType } from "~/types.js"; +import type { PluginsContainer } from "@webiny/plugins"; +import type { IFetcher } from "~/resolver/app/fetcher/types.js"; +import type { IStoreItem, IStorer } from "~/resolver/app/storer/types.js"; +import type { IBundle, IBundler } from "~/resolver/app/bundler/types.js"; +import { SourceDataContainer } from "~/resolver/app/data/SourceDataContainer.js"; +import type { IDeployment, IDeployments } from "~/resolver/deployment/types.js"; +import type { ITransformHandler } from "~/resolver/app/transform/TransformHandler.js"; +import type { ITable } from "~/sync/types.js"; + +export interface IRecordHandlerParams { + fetcher: IFetcher; + storer: IStorer; + plugins: PluginsContainer; + commandBundler: IBundler; + tableBundler: IBundler; + deployments: IDeployments; + transformHandler: ITransformHandler; +} + +interface IFindTargetTableParams { + bundle: IBundle; + targetDeployment: IDeployment; +} + +export class RecordHandler implements IRecordHandler { + private readonly plugins: PluginsContainer; + private readonly commandHandlerPlugins: CommandHandlerPlugin[]; + private readonly fetcher: IFetcher; + private readonly storer: IStorer; + private readonly commandBundler: IBundler; + private readonly tableBundler: IBundler; + private readonly deployments: IDeployments; + private readonly transformHandler: ITransformHandler; + + public constructor(params: IRecordHandlerParams) { + this.plugins = params.plugins; + this.fetcher = params.fetcher; + this.storer = params.storer; + this.commandBundler = params.commandBundler; + this.tableBundler = params.tableBundler; + this.deployments = params.deployments; + this.transformHandler = params.transformHandler; + + this.commandHandlerPlugins = this.plugins.byType( + CommandHandlerPlugin.type + ); + } + + public async handle(params: IRecordHandlerHandleParams): Promise { + const { data } = params; + + const sources = this.tableBundler.bundle({ + items: data.getItems() + }); + + const container = SourceDataContainer.create(); + + for (const bundle of sources.getBundles()) { + /** + * Need to fetch all the records from the source deployment tables. + */ + const { items, error } = await this.fetcher.exec({ + deployment: bundle.source, + table: bundle.table, + items: bundle.items, + maxBatchSize: 25 + }); + if (error) { + console.error( + `Could not fetch records from the source table (${bundle.source.name} / ${bundle.table.name}). More info in next log line.` + ); + console.log(convertException(error)); + continue; + } + container.merge(items); + } + /** + * We can now handle the records by going through all the items bundled by command, in correct order. + */ + const bundlesByCommand = this.commandBundler.bundle({ + items: data.getItems() + }); + for (const bundle of bundlesByCommand.getBundles()) { + const deployments = this.deployments.without(bundle.source); + for (const targetDeployment of deployments.all()) { + /** + * We need to map keys to actual items from the source deployment. + */ + const items = bundle.items + .map(item => { + const result = container.get({ + PK: item.PK, + SK: item.SK, + table: bundle.table, + source: bundle.source + }); + + return result?.data; + }) + .filter((item): item is IStoreItem => !!item); + + const targetTable = this.findTargetTable({ + bundle, + targetDeployment + }); + if (!targetTable) { + console.error( + `Could not find target table for source table "${bundle.table.name}" in deployment "${bundle.source.name}".` + ); + continue; + } + + const result = await this.transformHandler.transform({ + items, + sourceDeployment: bundle.source, + sourceTable: bundle.table, + targetDeployment: targetDeployment, + targetTable: targetTable + }); + + let commandHandler: CommandHandlerPlugin; + try { + commandHandler = this.getCommandHandler(bundle.command); + } catch (ex) { + console.error(ex.message); + continue; + } + + await commandHandler.handle({ + storer: this.storer, + items: result.items, + targetDeployment: targetDeployment, + targetTable: targetTable + }); + } + } + } + + private findTargetTable(params: IFindTargetTableParams): ITable | null { + const { bundle, targetDeployment } = params; + + try { + return targetDeployment.getTable(bundle.table.type); + } catch (ex) { + return null; + } + } + + private getCommandHandler(command: CommandType): CommandHandlerPlugin { + const handler = this.commandHandlerPlugins.find(plugin => plugin.canHandle(command)); + if (!handler) { + throw new Error(`Could not find a command handler for command: ${command}`); + } + + return handler; + } +} + +export const createRecordHandler = (params: IRecordHandlerParams): IRecordHandler => { + return new RecordHandler(params); +}; diff --git a/packages/api-sync-system/src/resolver/app/RecordsValidation.ts b/packages/api-sync-system/src/resolver/app/RecordsValidation.ts new file mode 100644 index 00000000000..d6195790767 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/RecordsValidation.ts @@ -0,0 +1,27 @@ +import type { SQSRecord } from "@webiny/aws-sdk/types/index.js"; +import type { + IRecordsValidation, + IRecordsValidationResult +} from "./abstractions/RecordsValidation.js"; +import { createZodError } from "@webiny/utils"; +import { createEventValidation } from "~/resolver/app/validation/event.js"; + +const validation = createEventValidation(); + +export class RecordsValidation implements IRecordsValidation { + public async validate(records: SQSRecord[]): Promise { + const result = await validation.safeParseAsync(records); + if (result.error) { + return { + error: createZodError(result.error) + }; + } + return { + records: result.data + }; + } +} + +export const createRecordsValidation = (): IRecordsValidation => { + return new RecordsValidation(); +}; diff --git a/packages/api-sync-system/src/resolver/app/ResolverApplication.ts b/packages/api-sync-system/src/resolver/app/ResolverApplication.ts new file mode 100644 index 00000000000..4656a8cace7 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/ResolverApplication.ts @@ -0,0 +1,59 @@ +import type { + IResolverApplication, + IResolverApplicationResolveParams +} from "./abstractions/ResolverApplication.js"; +import { createRecordsValidation } from "./RecordsValidation.js"; +import { convertException } from "@webiny/utils"; +import type { IRecordHandler } from "./abstractions/RecordHandler.js"; +import type { IDeployments } from "~/resolver/deployment/types.js"; +import { createIngestor } from "./ingestor/Ingestor.js"; +import { createIngestorResult } from "~/resolver/app/ingestor/IngestorResult.js"; + +export interface IResolverApplicationParams { + recordHandler: IRecordHandler; + deployments: IDeployments; +} + +export class ResolverApplication implements IResolverApplication { + private readonly recordHandler: IRecordHandler; + private readonly deployments: IDeployments; + + public constructor(params: IResolverApplicationParams) { + this.recordHandler = params.recordHandler; + this.deployments = params.deployments; + } + + public async resolve(params: IResolverApplicationResolveParams): Promise { + const validation = createRecordsValidation(); + + const result = await validation.validate(params.records); + if (result.error) { + throw result.error; + } + + const ingestor = createIngestor({ + createIngestorResult: () => { + return createIngestorResult(); + }, + getSource: name => { + return this.deployments.get(name); + } + }); + + const data = await ingestor.ingest({ + records: result.records + }); + + try { + await this.recordHandler.handle({ + data + }); + } catch (ex) { + console.error(convertException(ex)); + } + } +} + +export const createResolverApp = (params: IResolverApplicationParams): IResolverApplication => { + return new ResolverApplication(params); +}; diff --git a/packages/api-sync-system/src/resolver/app/abstractions/RecordHandler.ts b/packages/api-sync-system/src/resolver/app/abstractions/RecordHandler.ts new file mode 100644 index 00000000000..a24d945eb34 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/abstractions/RecordHandler.ts @@ -0,0 +1,9 @@ +import type { IIngestorResult } from "~/resolver/app/ingestor/types.js"; + +export interface IRecordHandlerHandleParams { + data: IIngestorResult; +} + +export interface IRecordHandler { + handle(params: IRecordHandlerHandleParams): Promise; +} diff --git a/packages/api-sync-system/src/resolver/app/abstractions/RecordsValidation.ts b/packages/api-sync-system/src/resolver/app/abstractions/RecordsValidation.ts new file mode 100644 index 00000000000..5735a8d7cc2 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/abstractions/RecordsValidation.ts @@ -0,0 +1,18 @@ +import type { SQSRecord } from "@webiny/aws-sdk/types"; +import type { IResolverSQSRecord } from "~/resolver/app/abstractions/ResolverRecord.js"; + +export interface IRecordsValidationValid { + records: IResolverSQSRecord[]; + error?: never; +} + +export interface IRecordsValidationError { + records?: never; + error: Error; +} + +export type IRecordsValidationResult = IRecordsValidationValid | IRecordsValidationError; + +export interface IRecordsValidation { + validate(records: SQSRecord[]): Promise; +} diff --git a/packages/api-sync-system/src/resolver/app/abstractions/ResolverApplication.ts b/packages/api-sync-system/src/resolver/app/abstractions/ResolverApplication.ts new file mode 100644 index 00000000000..52f0f8ae1e5 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/abstractions/ResolverApplication.ts @@ -0,0 +1,9 @@ +import type { SQSRecord } from "@webiny/aws-sdk/types/index.js"; + +export interface IResolverApplicationResolveParams { + records: SQSRecord[]; +} + +export interface IResolverApplication { + resolve(params: IResolverApplicationResolveParams): Promise; +} diff --git a/packages/api-sync-system/src/resolver/app/abstractions/ResolverRecord.ts b/packages/api-sync-system/src/resolver/app/abstractions/ResolverRecord.ts new file mode 100644 index 00000000000..89ecf5fdfb8 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/abstractions/ResolverRecord.ts @@ -0,0 +1,47 @@ +import type { GenericRecord } from "@webiny/api/types.js"; +import type { IDetail } from "~/sync/handler/types.js"; +import type { DynamoDBTableType, ExtendedCommandType } from "~/types.js"; +import { SQS_EVENT_NAME } from "~/constants.js"; + +export interface IResolverRecordBodyItem { + PK: string; + SK: string; + command: ExtendedCommandType; + /** + * There will be multiple tables that will get populated through the system (regular table and elasticsearch for start). + */ + tableName: string; + tableType: DynamoDBTableType; +} + +export interface IResolverSQSRecordBody { + version: `${number}`; + id: string; + "detail-type": typeof SQS_EVENT_NAME; + source: `webiny:${string}`; + account: `${number}`; + time: Date; + region: string; + resources: unknown[]; + detail: IDetail; + eventBusName: string; +} + +export interface IResolverSQSRecordAttributes { + ApproximateReceiveCount: string; + SentTimestamp: string; + SenderId: string; + ApproximateFirstReceiveTimestamp: string; +} + +export interface IResolverSQSRecord { + messageId: string; + receiptHandle: string; + body: IResolverSQSRecordBody; + attributes: IResolverSQSRecordAttributes; + messageAttributes?: GenericRecord; + md5OfBody: string; + eventSource: string; + eventSourceARN: string; + awsRegion: string; +} diff --git a/packages/api-sync-system/src/resolver/app/bundler/BaseBundle.ts b/packages/api-sync-system/src/resolver/app/bundler/BaseBundle.ts new file mode 100644 index 00000000000..28900b07cf4 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/bundler/BaseBundle.ts @@ -0,0 +1,37 @@ +import type { IBundle, IBundleItem } from "~/resolver/app/bundler/types.js"; +import { IDeployment } from "~/resolver/deployment/types"; +import { ITable } from "~/sync/types"; +import { CommandType, type ExtendedCommandType } from "~/types"; +import { IIngestorResultItem } from "../ingestor/types"; + +export interface IBaseBundleParams { + command: ExtendedCommandType; + table: ITable; + source: IDeployment; +} + +export abstract class BaseBundle implements IBundle { + readonly items: IBundleItem[] = []; + readonly command: CommandType; + readonly table: ITable; + readonly source: IDeployment; + + public abstract canAdd(item: IIngestorResultItem): boolean; + + public constructor(params: IBaseBundleParams) { + this.command = this.getCommand(params.command); + this.table = params.table; + this.source = params.source; + } + + protected getCommand(command: ExtendedCommandType): CommandType { + return command === "delete" ? "delete" : "put"; + } + + public add(item: IIngestorResultItem): void { + this.items.push({ + PK: item.PK, + SK: item.SK + }); + } +} diff --git a/packages/api-sync-system/src/resolver/app/bundler/Bundler.ts b/packages/api-sync-system/src/resolver/app/bundler/Bundler.ts new file mode 100644 index 00000000000..b7bb8344fa1 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/bundler/Bundler.ts @@ -0,0 +1,31 @@ +import type { IBundler, IBundlerBundleParams, IBundles } from "~/resolver/app/bundler/types.js"; + +export interface IBundlerParams { + createBundles: () => IBundles; +} + +export class Bundler implements IBundler { + private readonly createBundles: () => IBundles; + + public constructor(params: IBundlerParams) { + this.createBundles = params.createBundles; + } + + public bundle(params: IBundlerBundleParams): IBundles { + const { items } = params; + + const bundles = this.createBundles(); + + for (const item of items) { + bundles.add({ + item + }); + } + + return bundles; + } +} + +export const createBundler = (params: IBundlerParams) => { + return new Bundler(params); +}; diff --git a/packages/api-sync-system/src/resolver/app/bundler/Bundles.ts b/packages/api-sync-system/src/resolver/app/bundler/Bundles.ts new file mode 100644 index 00000000000..221dfc2f110 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/bundler/Bundles.ts @@ -0,0 +1,41 @@ +import type { IBundle, IBundles, IBundlesAddParams } from "~/resolver/app/bundler/types.js"; +import type { IIngestorResultItem } from "~/resolver/app/ingestor/types.js"; + +export interface IBundlesParams { + createBundle: (item: IIngestorResultItem) => IBundle; +} + +export class Bundles implements IBundles { + private readonly bundles: IBundle[] = []; + private readonly createBundle: (item: IIngestorResultItem) => IBundle; + + public constructor(params: IBundlesParams) { + this.createBundle = params.createBundle; + } + + public add(params: IBundlesAddParams): void { + const { item } = params; + + const bundle = this.getBundle(item); + + bundle.add(item); + } + + public getBundles(): IBundle[] { + return this.bundles; + } + + private getBundle(item: IIngestorResultItem): IBundle { + const last = this.bundles[this.bundles.length - 1]; + if (last?.canAdd(item)) { + return last; + } + const bundle = this.createBundle(item); + this.bundles.push(bundle); + return bundle; + } +} + +export const createBundles = (params: IBundlesParams) => { + return new Bundles(params); +}; diff --git a/packages/api-sync-system/src/resolver/app/bundler/CommandBundle.ts b/packages/api-sync-system/src/resolver/app/bundler/CommandBundle.ts new file mode 100644 index 00000000000..6ad50e017c3 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/bundler/CommandBundle.ts @@ -0,0 +1,26 @@ +/** + * Used to bundle by source system, table and command. + * If we receive >1 commands in a single batch, for example, put -> delete -> put -> delete, we need to make sure + * that commands are executed in that order. + * + * This will be used for executing the commands in the target systems. + */ +import type { IBundle } from "./types.js"; +import type { IIngestorResultItem } from "../ingestor/types"; +import type { IBaseBundleParams } from "./BaseBundle.js"; +import { BaseBundle } from "./BaseBundle.js"; + +export class CommandBundle extends BaseBundle { + public canAdd(item: IIngestorResultItem): boolean { + const command = this.getCommand(item.command); + return ( + this.command === command && + this.table.name === item.table.name && + this.source.name === item.source.name + ); + } +} + +export const createCommandBundle = (params: IBaseBundleParams): IBundle => { + return new CommandBundle(params); +}; diff --git a/packages/api-sync-system/src/resolver/app/bundler/TableBundle.ts b/packages/api-sync-system/src/resolver/app/bundler/TableBundle.ts new file mode 100644 index 00000000000..fc39a3fd5b9 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/bundler/TableBundle.ts @@ -0,0 +1,19 @@ +/** + * This will bundle records by system and table. + * + * It will be used to fetch the data from the source system tables. + */ +import type { IBundle } from "./types.js"; +import type { IIngestorResultItem } from "../ingestor/types"; +import type { IBaseBundleParams } from "./BaseBundle.js"; +import { BaseBundle } from "./BaseBundle.js"; + +export class TableBundle extends BaseBundle { + public canAdd(item: IIngestorResultItem): boolean { + return this.source.name === item.source.name && this.table.name === item.table.name; + } +} + +export const createTableBundle = (params: IBaseBundleParams): IBundle => { + return new TableBundle(params); +}; diff --git a/packages/api-sync-system/src/resolver/app/bundler/types.ts b/packages/api-sync-system/src/resolver/app/bundler/types.ts new file mode 100644 index 00000000000..a720d6c77fa --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/bundler/types.ts @@ -0,0 +1,35 @@ +import type { IIngestorResultItem } from "~/resolver/app/ingestor/types.js"; +import type { CommandType } from "~/types.js"; +import type { ITable } from "~/sync/types.js"; +import type { IDeployment } from "~/resolver/deployment/types.js"; + +export interface IBundleItem { + PK: string; + SK: string; +} + +export interface IBundle { + readonly items: IBundleItem[]; + readonly command: CommandType; + readonly table: ITable; + readonly source: IDeployment; + canAdd(item: IIngestorResultItem): boolean; + add(item: IIngestorResultItem): void; +} + +export interface IBundlerBundleParams { + items: IIngestorResultItem[]; +} + +export interface IBundler { + bundle(params: IBundlerBundleParams): IBundles; +} + +export interface IBundlesAddParams { + item: IIngestorResultItem; +} + +export interface IBundles { + add(params: IBundlesAddParams): void; + getBundles(): IBundle[]; +} diff --git a/packages/api-sync-system/src/resolver/app/commandHandler/DeleteCommandHandler.ts b/packages/api-sync-system/src/resolver/app/commandHandler/DeleteCommandHandler.ts new file mode 100644 index 00000000000..b016b60867a --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/commandHandler/DeleteCommandHandler.ts @@ -0,0 +1,45 @@ +import type { IStoreItem, IStorer } from "../storer/types"; +import type { IDeployment } from "~/resolver/deployment/types.js"; +import type { ITable } from "~/sync/types.js"; + +export interface IDeleteCommandHandlerHandleParams { + targetDeployment: IDeployment; + targetTable: ITable; + items: IStoreItem[]; +} + +export interface IDeleteCommandHandlerParams { + storer: IStorer; +} + +export class DeleteCommandHandler { + private readonly storer: IStorer; + + public constructor(params: IDeleteCommandHandlerParams) { + this.storer = params.storer; + } + public async handle(params: IDeleteCommandHandlerHandleParams): Promise { + const { targetDeployment, targetTable, items } = params; + + const result = items + .map(item => { + if (!item.PK || !item.SK) { + return null; + } + return { + PK: item.PK, + SK: item.SK + }; + }) + .filter((item): item is IStoreItem => { + return !!item; + }); + + await this.storer.store({ + deployment: targetDeployment, + command: "delete", + table: targetTable, + items: result + }); + } +} diff --git a/packages/api-sync-system/src/resolver/app/commandHandler/PutCommandHandler.ts b/packages/api-sync-system/src/resolver/app/commandHandler/PutCommandHandler.ts new file mode 100644 index 00000000000..75aa44d2d9d --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/commandHandler/PutCommandHandler.ts @@ -0,0 +1,35 @@ +import type { IStoreItem, IStorer } from "../storer/types"; +import type { ITable } from "~/sync/types"; +import type { IDeployment } from "~/resolver/deployment/types.js"; + +export interface IPutCommandHandlerHandleParams { + items: IStoreItem[]; + targetDeployment: IDeployment; + targetTable: ITable; +} + +export interface IPutCommandHandlerParams { + storer: IStorer; +} + +export class PutCommandHandler { + private readonly storer: IStorer; + + public constructor(params: IPutCommandHandlerParams) { + this.storer = params.storer; + } + public async handle(params: IPutCommandHandlerHandleParams): Promise { + const { items, targetDeployment, targetTable } = params; + + const result = items.filter(item => { + return !!item.PK && !!item.SK; + }); + + await this.storer.store({ + deployment: targetDeployment, + table: targetTable, + items: result, + command: "put" + }); + } +} diff --git a/packages/api-sync-system/src/resolver/app/commandHandler/delete.ts b/packages/api-sync-system/src/resolver/app/commandHandler/delete.ts new file mode 100644 index 00000000000..4d040cf9aee --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/commandHandler/delete.ts @@ -0,0 +1,21 @@ +import { createCommandHandlerPlugin } from "~/resolver/plugins/CommandHandlerPlugin.js"; +import { DeleteCommandHandler } from "./DeleteCommandHandler"; + +export const createDeleteCommandHandlerPlugin = () => { + return createCommandHandlerPlugin({ + canHandle: command => { + return command === "delete"; + }, + handle: async params => { + const handler = new DeleteCommandHandler({ + storer: params.storer + }); + + return handler.handle({ + items: params.items, + targetTable: params.targetTable, + targetDeployment: params.targetDeployment + }); + } + }); +}; diff --git a/packages/api-sync-system/src/resolver/app/commandHandler/put.ts b/packages/api-sync-system/src/resolver/app/commandHandler/put.ts new file mode 100644 index 00000000000..79a09b4d014 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/commandHandler/put.ts @@ -0,0 +1,22 @@ +import { createCommandHandlerPlugin } from "~/resolver/plugins/CommandHandlerPlugin.js"; +import { PutCommandHandler } from "./PutCommandHandler"; + +export const createPutCommandHandlerPlugin = () => { + return createCommandHandlerPlugin({ + canHandle: command => { + return command === "put"; + }, + handle: async params => { + const { storer, targetTable, targetDeployment, items } = params; + const handler = new PutCommandHandler({ + storer: storer + }); + + return handler.handle({ + targetTable, + targetDeployment, + items + }); + } + }); +}; diff --git a/packages/api-sync-system/src/resolver/app/data/SourceDataContainer.ts b/packages/api-sync-system/src/resolver/app/data/SourceDataContainer.ts new file mode 100644 index 00000000000..6e02bd42278 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/data/SourceDataContainer.ts @@ -0,0 +1,44 @@ +import { GenericRecord } from "@webiny/api/types"; +import type { IInputItem, IItem, ISourceDataContainer } from "~/resolver/app/data/types.js"; +import type { IStoreItem } from "~/resolver/app/storer/types.js"; + +export class SourceDataContainer implements ISourceDataContainer { + public readonly items: GenericRecord = {}; + + private constructor() { + // block + } + + public static create(): ISourceDataContainer { + return new SourceDataContainer(); + } + + public get(input: IInputItem): IStoreItem | null { + const key = this.createKey(input); + const item = this.items[key]; + return item?.data || null; + } + + public add(item: IInputItem, data: IStoreItem | null): void { + const key = this.createKey(item); + if (this.items[key]) { + return; + } + + this.items[key] = { + ...item, + data + }; + } + + public merge(container: ISourceDataContainer): void { + for (const key in container.items) { + const item = container.items[key]; + this.add(item, item.data); + } + } + + private createKey(item: IInputItem): string { + return `${item.source.name}#${item.table.name}#${item.PK}#${item.SK}`; + } +} diff --git a/packages/api-sync-system/src/resolver/app/data/types.ts b/packages/api-sync-system/src/resolver/app/data/types.ts new file mode 100644 index 00000000000..c142c8cd3a1 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/data/types.ts @@ -0,0 +1,26 @@ +import type { ITable } from "~/sync/types.js"; +import type { IDeployment } from "~/resolver/deployment/types.js"; +import { GenericRecord } from "@webiny/api/types.js"; +import type { IStoreItem } from "~/resolver/app/storer/types.js"; + +export interface IInputItem { + PK: string; + SK: string; + table: Pick; + source: Pick; +} + +export interface IItem { + PK: string; + SK: string; + table: Pick; + source: Pick; + data: IStoreItem | null; +} + +export interface ISourceDataContainer { + items: GenericRecord; + get(item: IInputItem): IStoreItem | null; + add(item: IInputItem, data: IStoreItem | null): void; + merge(container: ISourceDataContainer): void; +} diff --git a/packages/api-sync-system/src/resolver/app/fetcher/Fetcher.ts b/packages/api-sync-system/src/resolver/app/fetcher/Fetcher.ts new file mode 100644 index 00000000000..1cad149aded --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/fetcher/Fetcher.ts @@ -0,0 +1,166 @@ +import type { IFetcher, IFetcherExecParams, IFetcherExecResult } from "./types"; +import { BatchGetCommand, type DynamoDBDocument } from "@webiny/aws-sdk/client-dynamodb"; +import lodashChunk from "lodash/chunk"; +import type { IDeployment } from "~/resolver/deployment/types.js"; +import { SourceDataContainer } from "~/resolver/app/data/SourceDataContainer.js"; +import type { GenericRecord } from "@webiny/api/types.js"; +import { convertException } from "@webiny/utils"; +import type { IStoreItem } from "~/resolver/app/storer/types.js"; +import type { ITable } from "~/sync/types.js"; +import { createRetry } from "~/resolver/app/utils/Retry.js"; + +export interface IFetcherParamsCreateDocumentClientCallable { + (deployment: Pick): Pick; +} + +export interface IFetcherParams { + maxRetries?: number; + retryDelay?: number; + createDocumentClient: IFetcherParamsCreateDocumentClientCallable; +} + +interface IKeys { + PK: string; + SK: string; +} + +interface IFetcherExecuteRunCommandParams { + command: BatchGetCommand; + table: string; + client: Pick; +} + +interface IFetcherExecuteRunCommandResult { + items: T[]; + unprocessedKeys: IKeys[]; +} + +interface IFetchExecuteExecuteParamsItem { + PK: string; + SK: string; +} + +interface IFetchExecuteExecuteParams { + maxBatchSize: number; + client: Pick; + table: ITable; + records: IFetchExecuteExecuteParamsItem[]; +} + +export class Fetcher implements IFetcher { + private readonly createDocumentClient: IFetcherParamsCreateDocumentClientCallable; + private readonly maxRetries: number; + private readonly retryDelay: number; + + public constructor(params: IFetcherParams) { + this.createDocumentClient = params.createDocumentClient; + this.maxRetries = params.maxRetries || 10; + this.retryDelay = params.retryDelay || 1000; + } + + public async exec(params: IFetcherExecParams): Promise { + const { deployment, items: input, table, maxBatchSize = 25 } = params; + if (input.length === 0) { + return { + items: SourceDataContainer.create() + }; + } + + const client = this.createDocumentClient(deployment); + + const results = await this.execute({ + client, + table, + maxBatchSize, + records: input + }); + + const items = SourceDataContainer.create(); + + for (const item of input) { + const data = results.find(result => { + return item.PK === result.PK && item.SK === result.SK; + }); + items.add( + { + PK: item.PK, + SK: item.SK, + table, + source: deployment + }, + data || null + ); + } + + return { + items + }; + } + + private async execute(params: IFetchExecuteExecuteParams) { + const { client, table, records: items, maxBatchSize } = params; + const batches = lodashChunk(items, maxBatchSize); + + const results: T[] = []; + for (const batch of batches) { + let keys = this.getKeys(batch); + + while (keys.length > 0) { + const command = new BatchGetCommand({ + RequestItems: { + [table.name]: { + Keys: keys + } + } + }); + const { items, unprocessedKeys } = await this.runCommand({ + command, + client, + table: table.name + }); + + results.push(...items); + + keys = unprocessedKeys; + } + } + return results; + } + + private async runCommand( + params: IFetcherExecuteRunCommandParams + ): Promise> { + const { command, table, client } = params; + + const retry = createRetry({ + maxRetries: this.maxRetries, + retryDelay: this.retryDelay, + onFail: ex => { + console.error(`Max retries reached. Could not fetch items from table: ${table}`); + console.log(convertException(ex)); + } + }); + + return await retry.retry(async () => { + const result = await client.send(command); + + return { + items: (result.Responses?.[table] || []) as T[], + unprocessedKeys: (result.UnprocessedKeys?.[table]?.Keys || []) as IKeys[] + }; + }); + } + + private getKeys(items: IFetchExecuteExecuteParamsItem[]): IKeys[] { + return items.map(item => { + return { + PK: item.PK, + SK: item.SK + }; + }); + } +} + +export const createFetcher = (params: IFetcherParams): IFetcher => { + return new Fetcher(params); +}; diff --git a/packages/api-sync-system/src/resolver/app/fetcher/types.ts b/packages/api-sync-system/src/resolver/app/fetcher/types.ts new file mode 100644 index 00000000000..3b2582703fe --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/fetcher/types.ts @@ -0,0 +1,31 @@ +import type { IDeployment } from "~/resolver/deployment/types.js"; +import type { ITable } from "~/sync/types.js"; +import type { ISourceDataContainer } from "~/resolver/app/data/types.js"; + +export interface IFetcherExecParamsItem { + PK: string; + SK: string; +} + +export interface IFetcherExecParams { + maxBatchSize?: number; + deployment: IDeployment; + table: ITable; + items: IFetcherExecParamsItem[]; +} + +export interface IFetcherExecValidResult { + error?: never; + items: ISourceDataContainer; +} + +export interface IFetcherExecErrorResult { + error: Error; + items?: never; +} + +export type IFetcherExecResult = IFetcherExecValidResult | IFetcherExecErrorResult; + +export interface IFetcher { + exec(params: IFetcherExecParams): Promise; +} diff --git a/packages/api-sync-system/src/resolver/app/ingestor/Ingestor.ts b/packages/api-sync-system/src/resolver/app/ingestor/Ingestor.ts new file mode 100644 index 00000000000..78aa6de45e0 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/ingestor/Ingestor.ts @@ -0,0 +1,53 @@ +import type { IIngestor, IIngestorIngestParams, IIngestorResult } from "./types.js"; +import type { IDeployment } from "~/resolver/deployment/types.js"; + +export interface IIngestorParams { + createIngestorResult: () => IIngestorResult; + getSource: (name: string) => IDeployment | null; +} + +export class Ingestor implements IIngestor { + private readonly createIngestorResult: () => IIngestorResult; + private readonly getSource: (name: string) => IDeployment | null; + + public constructor(params: IIngestorParams) { + this.createIngestorResult = params.createIngestorResult; + this.getSource = params.getSource; + } + + public async ingest(params: IIngestorIngestParams): Promise { + const { records } = params; + + const result = this.createIngestorResult(); + + for (const record of records) { + const detail = record.body.detail; + const source = this.getSource(detail.source.name); + if (!source) { + console.error( + `Could not find deployment for SQS Record source: ${detail.source.name}. More info in next log line.` + ); + console.log( + JSON.stringify({ + source: detail.source, + items: detail.items + }) + ); + continue; + } + + for (const item of detail.items) { + result.add({ + item, + source + }); + } + } + + return result; + } +} + +export const createIngestor = (params: IIngestorParams): IIngestor => { + return new Ingestor(params); +}; diff --git a/packages/api-sync-system/src/resolver/app/ingestor/IngestorResult.ts b/packages/api-sync-system/src/resolver/app/ingestor/IngestorResult.ts new file mode 100644 index 00000000000..f70870a2887 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/ingestor/IngestorResult.ts @@ -0,0 +1,36 @@ +import type { IIngestorResult, IIngestorResultAddParams, IIngestorResultItem } from "./types.js"; +import type { ITable } from "~/sync/types.js"; + +export class IngestorResult implements IIngestorResult { + private readonly items: IIngestorResultItem[] = []; + + public add(params: IIngestorResultAddParams): void { + const { item, source } = params; + let table: ITable; + try { + table = source.getTable(item.tableType); + } catch (ex) { + console.error( + `Could not find table for SQS Record source: ${item.tableName} / ${item.tableType}. More info in next log line.` + ); + console.log(JSON.stringify(item)); + return; + } + + this.items.push({ + PK: item.PK, + SK: item.SK, + source, + command: item.command, + table + }); + } + + public getItems(): IIngestorResultItem[] { + return this.items; + } +} + +export const createIngestorResult = (): IIngestorResult => { + return new IngestorResult(); +}; diff --git a/packages/api-sync-system/src/resolver/app/ingestor/types.ts b/packages/api-sync-system/src/resolver/app/ingestor/types.ts new file mode 100644 index 00000000000..fb021640096 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/ingestor/types.ts @@ -0,0 +1,31 @@ +import type { ExtendedCommandType } from "~/types.js"; +import type { IResolverSQSRecord } from "~/resolver/app/abstractions/ResolverRecord.js"; +import type { IDetailItem } from "~/sync/handler/types.js"; +import type { ITable } from "~/sync/types.js"; +import { IDeployment } from "~/resolver/deployment/types.js"; + +export interface IIngestorIngestParams { + records: IResolverSQSRecord[]; +} + +export interface IIngestorResultItem { + PK: string; + SK: string; + command: ExtendedCommandType; + table: ITable; + source: IDeployment; +} + +export interface IIngestorResultAddParams { + item: IDetailItem; + source: IDeployment; +} + +export interface IIngestorResult { + getItems(): IIngestorResultItem[]; + add(params: IIngestorResultAddParams): void; +} + +export interface IIngestor { + ingest(params: IIngestorIngestParams): Promise; +} diff --git a/packages/api-sync-system/src/resolver/app/storer/Storer.ts b/packages/api-sync-system/src/resolver/app/storer/Storer.ts new file mode 100644 index 00000000000..9e0e24fb8a9 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/storer/Storer.ts @@ -0,0 +1,126 @@ +import type { IStorer, IStorerExecParams } from "./types"; +import type { + BatchWriteCommandInput, + DynamoDBDocument +} from "@webiny/aws-sdk/client-dynamodb/index.js"; +import { BatchWriteCommand } from "@webiny/aws-sdk/client-dynamodb/index.js"; +import type { IDeployment } from "~/resolver/deployment/types.js"; +import { convertException } from "@webiny/utils/exception.js"; +import lodashChunk from "lodash/chunk"; +import type { CommandType } from "~/types.js"; +import { createRetry } from "../utils/Retry"; + +export interface IStorerParamsCreateDocumentClientCallable { + (deployment: Pick): Pick; +} + +export interface IStorerParams { + maxBatchSize?: number; + maxRetries?: number; + retryDelay?: number; + createDocumentClient: IStorerParamsCreateDocumentClientCallable; +} + +interface IRequestType { + name: "PutRequest" | "DeleteRequest"; + key: "Item" | "Key"; +} + +export class Storer implements IStorer { + private readonly maxBatchSize: number; + private readonly maxRetries: number; + private readonly retryDelay: number; + private readonly createDocumentClient: IStorerParamsCreateDocumentClientCallable; + + public constructor(params: IStorerParams) { + this.maxBatchSize = params.maxBatchSize || 25; + this.maxRetries = params.maxRetries || 10; + this.retryDelay = params.retryDelay || 1000; + this.createDocumentClient = params.createDocumentClient; + } + + public async store(params: IStorerExecParams): Promise { + const { deployment, table, command, items } = params; + if (items.length === 0) { + return; + } + const client = this.createDocumentClient({ + region: deployment.region + }); + + let requestType: IRequestType; + try { + requestType = this.getRequestType(command); + } catch (ex) { + console.error(`Error getting request type: ${command}.`); + console.log(convertException(ex)); + return; + } + + const batches = lodashChunk(items, this.maxBatchSize); + + for (const batch of batches) { + let cmd: BatchWriteCommand | undefined = undefined; + do { + const input: BatchWriteCommandInput = { + RequestItems: { + [table.name]: batch.map(item => { + return { + [requestType.name]: { + [requestType.key]: item + } + }; + }) + } + }; + cmd = new BatchWriteCommand(input); + + const retry = createRetry({ + maxRetries: this.maxRetries, + retryDelay: this.retryDelay, + onFail: async ex => { + console.error("Error executing batch write command."); + console.log(convertException(ex)); + } + }); + + await retry.retry(async () => { + if (!cmd) { + return; + } + const result = await client.send(cmd); + + if (!result.UnprocessedItems?.[table.name]) { + cmd = undefined; + return; + } + cmd = new BatchWriteCommand({ + RequestItems: result.UnprocessedItems + }); + }); + } while (cmd); + } + } + + private getRequestType(command: CommandType): IRequestType { + switch (command) { + case "put": + return { + name: "PutRequest", + key: "Item" + }; + + case "delete": + return { + name: "DeleteRequest", + key: "Key" + }; + default: + throw new Error(`Invalid command type: ${command}`); + } + } +} + +export const createStorer = (params: IStorerParams): IStorer => { + return new Storer(params); +}; diff --git a/packages/api-sync-system/src/resolver/app/storer/types.ts b/packages/api-sync-system/src/resolver/app/storer/types.ts new file mode 100644 index 00000000000..c980cec27af --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/storer/types.ts @@ -0,0 +1,20 @@ +import type { IDeployment } from "~/resolver/deployment/types.js"; +import type { ITable } from "~/sync/types.js"; +import type { CommandType } from "~/types.js"; + +export interface IStoreItem { + PK: string; + SK: string; + [key: string]: unknown; +} + +export interface IStorerExecParams { + deployment: IDeployment; + command: CommandType; + table: ITable; + items: IStoreItem[]; +} + +export interface IStorer { + store(params: IStorerExecParams): Promise; +} diff --git a/packages/api-sync-system/src/resolver/app/transform/TransformHandler.ts b/packages/api-sync-system/src/resolver/app/transform/TransformHandler.ts new file mode 100644 index 00000000000..5abfad1785b --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/transform/TransformHandler.ts @@ -0,0 +1,82 @@ +import type { ITable } from "~/sync/types"; +import type { IDeployment } from "~/resolver/deployment/types.js"; +import type { PluginsContainer } from "@webiny/plugins/types"; +import { TransformRecordPlugin } from "~/resolver/plugins/TransformRecordPlugin.js"; +import { middleware } from "./middleware.js"; +import { IStoreItem } from "../storer/types"; + +export interface IMiddlewareParams { + readonly record: IStoreItem; + sourceDeployment: IDeployment; + targetDeployment: IDeployment; + sourceTable: ITable; + targetTable: ITable; +} + +export interface ITransformHandlerTransformParams { + sourceTable: ITable; + sourceDeployment: IDeployment; + targetTable: ITable; + targetDeployment: IDeployment; + items: IStoreItem[]; +} + +export interface ITransformHandlerTransformResult { + items: IStoreItem[]; +} + +export interface ITransformHandler { + transform(params: ITransformHandlerTransformParams): Promise; +} + +export interface ITransformHandlerParams { + plugins: PluginsContainer; +} + +export class TransformHandler implements ITransformHandler { + private readonly plugins: TransformRecordPlugin[]; + + public constructor(params: ITransformHandlerParams) { + this.plugins = params.plugins.byType(TransformRecordPlugin.type); + } + + public async transform( + params: ITransformHandlerTransformParams + ): Promise { + const { sourceTable, sourceDeployment, targetDeployment, targetTable, items } = params; + + const plugins = this.plugins.filter(plugin => { + return plugin.canTransform({ + from: sourceDeployment, + to: targetDeployment + }); + }); + + const runner = middleware( + plugins.map(plugin => { + return async (params, next) => { + return await plugin.transform(params, next); + }; + }) + ); + + const results = await Promise.all( + items.map(async input => { + const record = Object.freeze(input); + return await runner( + { + sourceTable, + sourceDeployment, + targetDeployment, + targetTable, + record + }, + record + ); + }) + ); + return { + items: results.filter((item): item is IStoreItem => !!item) + }; + } +} diff --git a/packages/api-sync-system/src/resolver/app/transform/middleware.ts b/packages/api-sync-system/src/resolver/app/transform/middleware.ts new file mode 100644 index 00000000000..1adc6576ae3 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/transform/middleware.ts @@ -0,0 +1,34 @@ +import type { GenericRecord } from "@webiny/api/types"; + +export type Middleware = ( + input: Input, + next: () => Promise +) => Promise; + +export function middleware( + middlewares: Middleware[] +) { + return async function runner(input: Input, defaultValue: Output): Promise { + let current = -1; + + async function dispatch(index: number): Promise { + /** + * Should not be possible to run next multiple times. + * Or do we want to allow it? What are possible downsides except something being done multiple times? + */ + if (index <= current) { + throw new Error("next() called multiple times"); + } + current = index; + + const fn = middlewares[index]; + if (!fn) { + return defaultValue; + } + + return fn(input, () => dispatch(index + 1)); + } + + return dispatch(0); + }; +} diff --git a/packages/api-sync-system/src/resolver/app/utils/Retry.ts b/packages/api-sync-system/src/resolver/app/utils/Retry.ts new file mode 100644 index 00000000000..a0538b8d9dd --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/utils/Retry.ts @@ -0,0 +1,46 @@ +import { sleep } from "./sleep"; + +export interface IRetryable { + retry(fn: () => Promise): Promise; +} + +export interface IRetryParams { + maxRetries: number; + retryDelay: number; + onFail?: (error: Error) => Promise | void; +} + +export class Retry implements IRetryable { + private readonly maxRetries: number; + private readonly retryDelay: number; + private retryCount: number = 0; + private readonly onFail?: IRetryParams["onFail"]; + + public constructor(params: IRetryParams) { + this.maxRetries = params.maxRetries; + this.retryDelay = params.retryDelay; + this.onFail = params.onFail; + } + + public async retry(fn: () => Promise): Promise { + try { + return await fn(); + } catch (ex) { + if (this.retryCount >= this.maxRetries) { + if (this.onFail) { + await this.onFail(ex as Error); + } + throw ex; + } + } + this.retryCount++; + await sleep(this.retryDelay); + const result = await this.retry(fn); + this.retryCount = 0; + return result; + } +} + +export const createRetry = (params: IRetryParams): IRetryable => { + return new Retry(params); +}; diff --git a/packages/api-sync-system/src/resolver/app/utils/sleep.ts b/packages/api-sync-system/src/resolver/app/utils/sleep.ts new file mode 100644 index 00000000000..9796680cec1 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/utils/sleep.ts @@ -0,0 +1,5 @@ +export const sleep = (ms: number) => { + return new Promise(resolve => { + setTimeout(resolve, ms); + }); +}; diff --git a/packages/api-sync-system/src/resolver/app/validation/body.ts b/packages/api-sync-system/src/resolver/app/validation/body.ts new file mode 100644 index 00000000000..b4c5f8c268a --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/validation/body.ts @@ -0,0 +1,42 @@ +import zod from "zod"; +import { createJsonTransform } from "./createJsonTransform.js"; +import { createDetailValidation } from "./detail.js"; +import { SQS_EVENT_NAME } from "~/constants.js"; +import { createNumericStringValidation } from "~/resolver/app/validation/numericString.js"; + +const detailTransform = createJsonTransform("Detail"); + +const detailValidation = createDetailValidation(); + +export const createBodyValidation = () => { + return zod.object({ + version: createNumericStringValidation("version"), + id: zod.string(), + "detail-type": zod.string().transform((value, ctx) => { + if (value === SQS_EVENT_NAME) { + return SQS_EVENT_NAME; + } + ctx.addIssue({ + code: zod.ZodIssueCode.custom, + message: `"detail-type" must be "${SQS_EVENT_NAME}".` + }); + return zod.NEVER; + }), + source: zod.string().transform((value, ctx) => { + if (value.startsWith("webiny:")) { + return value as `webiny:${string}`; + } + ctx.addIssue({ + code: zod.ZodIssueCode.custom, + message: `"source" must start with "webiny:".` + }); + return zod.NEVER; + }), + account: createNumericStringValidation("account"), + time: zod.string().transform(value => new Date(value)), + region: zod.string(), + resources: zod.array(zod.string()), + detail: detailTransform.pipe(detailValidation), + eventBusName: zod.string() + }); +}; diff --git a/packages/api-sync-system/src/resolver/app/validation/createJsonTransform.ts b/packages/api-sync-system/src/resolver/app/validation/createJsonTransform.ts new file mode 100644 index 00000000000..1b4cb02af08 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/validation/createJsonTransform.ts @@ -0,0 +1,15 @@ +import zod from "zod"; + +export const createJsonTransform = (name: string) => { + return zod.string().transform((value, ctx) => { + try { + return JSON.parse(value); + } catch (e) { + ctx.addIssue({ + code: zod.ZodIssueCode.custom, + message: `${name} must be a valid JSON string.` + }); + return zod.NEVER; + } + }); +}; diff --git a/packages/api-sync-system/src/resolver/app/validation/detail.ts b/packages/api-sync-system/src/resolver/app/validation/detail.ts new file mode 100644 index 00000000000..ab88bfbfcc7 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/validation/detail.ts @@ -0,0 +1,38 @@ +import zod from "zod"; +import type { NonEmptyArray } from "@webiny/api/types.js"; +import type { IResolverRecordBodyItem } from "~/resolver/app/abstractions/ResolverRecord.js"; +import { createSystemValidation } from "./system.js"; + +const convert = (input: IResolverRecordBodyItem[]) => { + /** + * We can safely cast as NonEmptyArray here because we already validated that the array is not empty. + */ + return input as NonEmptyArray; +}; + +export const createDetailValidation = () => { + return zod.object({ + items: zod + .array( + zod.object({ + PK: zod.string(), + SK: zod.string(), + tableName: zod.string(), + tableType: zod.enum(["regular", "elasticsearch", "log"]), + command: zod.enum(["update", "put", "delete"]) + }) + ) + .refine( + values => { + return values.length > 0; + }, + { + message: `"items" array must not be empty.` + } + ) + .transform(values => { + return convert(values); + }), + source: createSystemValidation() + }); +}; diff --git a/packages/api-sync-system/src/resolver/app/validation/event.ts b/packages/api-sync-system/src/resolver/app/validation/event.ts new file mode 100644 index 00000000000..3bc221cc58e --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/validation/event.ts @@ -0,0 +1,26 @@ +import zod from "zod"; +import { createJsonTransform } from "~/resolver/app/validation/createJsonTransform.js"; +import { createBodyValidation } from "~/resolver/app/validation/body.js"; + +const bodyTransform = createJsonTransform("Body"); + +export const createEventValidation = () => { + return zod.array( + zod.object({ + messageId: zod.string(), + receiptHandle: zod.string(), + body: bodyTransform.pipe(createBodyValidation()), + attributes: zod.object({ + ApproximateReceiveCount: zod.string(), + SentTimestamp: zod.string(), + SenderId: zod.string(), + ApproximateFirstReceiveTimestamp: zod.string() + }), + messageAttributes: zod.object({}).passthrough().optional(), + md5OfBody: zod.string(), + eventSource: zod.string(), + eventSourceARN: zod.string(), + awsRegion: zod.string() + }) + ); +}; diff --git a/packages/api-sync-system/src/resolver/app/validation/numericString.ts b/packages/api-sync-system/src/resolver/app/validation/numericString.ts new file mode 100644 index 00000000000..e63e8a95d95 --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/validation/numericString.ts @@ -0,0 +1,14 @@ +import zod from "zod"; + +export const createNumericStringValidation = (name: string) => { + return zod.string().transform((value, ctx) => { + if (/^\d+$/.test(value)) { + return value as `${number}`; + } + ctx.addIssue({ + code: zod.ZodIssueCode.custom, + message: `"${name}" must be a numeric string.` + }); + return zod.NEVER; + }); +}; diff --git a/packages/api-sync-system/src/resolver/app/validation/system.ts b/packages/api-sync-system/src/resolver/app/validation/system.ts new file mode 100644 index 00000000000..5524d402f8b --- /dev/null +++ b/packages/api-sync-system/src/resolver/app/validation/system.ts @@ -0,0 +1,15 @@ +import zod from "zod"; + +export const createSystemValidation = () => { + return zod.object({ + name: zod.string(), + env: zod.string(), + variant: zod + .string() + .optional() + .nullish() + .transform(value => value || undefined), + region: zod.string(), + version: zod.string() + }); +}; diff --git a/packages/api-sync-system/src/resolver/createEventHandlerPlugin.ts b/packages/api-sync-system/src/resolver/createEventHandlerPlugin.ts new file mode 100644 index 00000000000..310318fe196 --- /dev/null +++ b/packages/api-sync-system/src/resolver/createEventHandlerPlugin.ts @@ -0,0 +1,117 @@ +import { createEventHandler as createSQSEventHandler } from "@webiny/handler-aws/sqs"; +import { createResolverApp } from "./app/ResolverApplication.js"; +import { convertException } from "@webiny/utils"; +import { createRecordHandler } from "./app/RecordHandler.js"; +import { createFetcher } from "~/resolver/app/fetcher/Fetcher.js"; +import { createStorer } from "~/resolver/app/storer/Storer.js"; +import { createDeploymentsFetcher } from "~/resolver/deployment/DeploymentsFetcher.js"; +import { WebinyError } from "@webiny/error/index.js"; +import type { + DynamoDBClientConfig, + DynamoDBDocument +} from "@webiny/aws-sdk/client-dynamodb/index.js"; +import { createBundler } from "~/resolver/app/bundler/Bundler.js"; +import { createBundles } from "~/resolver/app/bundler/Bundles.js"; +import { createCommandBundle } from "~/resolver/app/bundler/CommandBundle.js"; +import { createTableBundle } from "~/resolver/app/bundler/TableBundle.js"; +import { TransformHandler } from "~/resolver/app/transform/TransformHandler.js"; + +export interface ICreateEventHandlerPluginParams { + tableName: string | undefined; + createDocumentClient: (params: DynamoDBClientConfig) => DynamoDBDocument; +} +/** + * TODO maybe add logger? + */ +export const createEventHandlerPlugin = (params: ICreateEventHandlerPluginParams) => { + const { createDocumentClient, tableName } = params; + + return createSQSEventHandler(async ({ event, context, reply }) => { + if (!tableName) { + throw new WebinyError({ + message: "Table name variable is not set." + }); + } + console.log("Resolver handler started."); + console.log( + JSON.stringify({ + event + }) + ); + /** + * Just end + */ + if (event.Records) { + return; + } + try { + const fetcher = createFetcher({ + maxRetries: 10, + retryDelay: 1000, + createDocumentClient: deployment => { + return createDocumentClient({ + region: deployment.region + }); + } + }); + + const deploymentsFetcher = createDeploymentsFetcher({ + client: createDocumentClient({ + region: process.env.AWS_REGION + }), + table: tableName + }); + /** + * Fetch all possible deployments, out of which we will filter out the deployment that the records came from. + */ + const deployments = await deploymentsFetcher.fetch(); + + const storer = createStorer({ + createDocumentClient: deployment => { + return createDocumentClient({ + region: deployment.region + }); + } + }); + + const transformHandler = new TransformHandler({ + plugins: context.plugins + }); + + const recordHandler = createRecordHandler({ + plugins: context.plugins, + fetcher, + storer, + deployments, + transformHandler, + commandBundler: createBundler({ + createBundles: () => { + return createBundles({ + createBundle: createCommandBundle + }); + } + }), + tableBundler: createBundler({ + createBundles: () => { + return createBundles({ + createBundle: createTableBundle + }); + } + }) + }); + const app = createResolverApp({ + recordHandler, + deployments + }); + await app.resolve({ + records: event.Records + }); + return reply.send({ + ok: true + }); + } catch (ex) { + console.error(convertException(ex)); + return reply.send(ex); + } + }); +}; diff --git a/packages/api-sync-system/src/resolver/createResolverHandler.ts b/packages/api-sync-system/src/resolver/createResolverHandler.ts new file mode 100644 index 00000000000..bb0d197ecaa --- /dev/null +++ b/packages/api-sync-system/src/resolver/createResolverHandler.ts @@ -0,0 +1,40 @@ +import type { HandlerCallable, HandlerParams } from "@webiny/handler-aws/sqs"; +import { createHandler as createSQSHandler } from "@webiny/handler-aws/sqs"; +import { PluginsContainer } from "@webiny/plugins"; +import { createEventHandlerPlugin } from "./createEventHandlerPlugin.js"; +import type { TransformRecordPlugin } from "~/resolver/plugins/TransformRecordPlugin.js"; +import type { CommandHandlerPlugin } from "~/resolver/plugins/CommandHandlerPlugin.js"; +import { createPutCommandHandlerPlugin } from "~/resolver/app/commandHandler/put.js"; +import { createDeleteCommandHandlerPlugin } from "~/resolver/app/commandHandler/delete.js"; +import type { + DynamoDBClientConfig, + DynamoDBDocument +} from "@webiny/aws-sdk/client-dynamodb/index.js"; + +export type AllowedResolverPlugins = TransformRecordPlugin | CommandHandlerPlugin; + +export interface ICreateResolverHandlerParams extends HandlerParams { + plugins: AllowedResolverPlugins[]; + createDocumentClient: (params: DynamoDBClientConfig) => DynamoDBDocument; + tableName?: string; +} +/** + * Handler for the Sync System Resolver - based on SQS handler. + */ +export const createResolverHandler = (params: ICreateResolverHandlerParams): HandlerCallable => { + const plugins = new PluginsContainer([ + createEventHandlerPlugin({ + createDocumentClient: params.createDocumentClient, + tableName: params.tableName || process.env.DB_TABLE + }), + createPutCommandHandlerPlugin(), + createDeleteCommandHandlerPlugin() + ]); + + plugins.register(params.plugins); + + return createSQSHandler({ + ...params, + plugins + }); +}; diff --git a/packages/api-sync-system/src/resolver/deployment/Deployment.ts b/packages/api-sync-system/src/resolver/deployment/Deployment.ts new file mode 100644 index 00000000000..91b0cf6ed2d --- /dev/null +++ b/packages/api-sync-system/src/resolver/deployment/Deployment.ts @@ -0,0 +1,59 @@ +import type { SemVer } from "semver"; +import { IDeployment, IDeploymentServices } from "./types"; +import type { DynamoDBTableType } from "~/types.js"; +import type { ITable } from "~/sync/types.js"; + +export interface IDeploymentParams extends Omit {} + +export class Deployment implements IDeployment { + public readonly name: string; + public readonly env: string; + public readonly variant: string | undefined; + public readonly region: string; + public readonly services: IDeploymentServices; + public readonly version: SemVer; + + public constructor(params: IDeploymentParams) { + this.name = params.name; + this.env = params.env; + this.variant = params.variant; + this.region = params.region; + this.services = params.services; + this.version = params.version; + } + + public getTable(type: DynamoDBTableType): ITable { + switch (type) { + case "regular": + return { + name: this.services.primaryDynamoDbName, + arn: this.services.primaryDynamoDbArn, + type + }; + case "elasticsearch": + if ( + !this.services.elasticsearchDynamodbTableName || + !this.services.elasticsearchDynamodbTableArn + ) { + throw new Error(`Unknown table type "${type}" - no data.`); + } + return { + name: this.services.elasticsearchDynamodbTableName, + arn: this.services.elasticsearchDynamodbTableArn, + type + }; + case "log": + return { + name: this.services.logDynamodbTableName, + arn: this.services.logDynamodbTableArn, + type + }; + default: + throw new Error(`Unknown table type "${type}".`); + } + } +} + +export const createDeployment = (params: IDeploymentParams): IDeployment => { + return new Deployment(params); +}; diff --git a/packages/api-sync-system/src/resolver/deployment/Deployments.ts b/packages/api-sync-system/src/resolver/deployment/Deployments.ts new file mode 100644 index 00000000000..c671b4d8d60 --- /dev/null +++ b/packages/api-sync-system/src/resolver/deployment/Deployments.ts @@ -0,0 +1,37 @@ +import type { IDeployment, IDeployments } from "./types.js"; + +export interface IDeploymentsParams { + deployments: IDeployment[]; +} + +export class Deployments implements IDeployments { + private readonly deployments: IDeployment[]; + + public constructor(params: IDeploymentsParams) { + this.deployments = params.deployments; + } + + public hasAny(): boolean { + return this.deployments.length > 0; + } + + public all(): IDeployment[] { + return this.deployments; + } + + public get(name: string): IDeployment | null { + return this.deployments.find(deployment => deployment.name === name) || null; + } + + public without(input: Pick): IDeployments { + return createDeployments({ + deployments: this.deployments.filter(deployment => { + return deployment.name !== input.name; + }) + }); + } +} + +export const createDeployments = (params: IDeploymentsParams): IDeployments => { + return new Deployments(params); +}; diff --git a/packages/api-sync-system/src/resolver/deployment/DeploymentsFetcher.ts b/packages/api-sync-system/src/resolver/deployment/DeploymentsFetcher.ts new file mode 100644 index 00000000000..5cc3a5e04c0 --- /dev/null +++ b/packages/api-sync-system/src/resolver/deployment/DeploymentsFetcher.ts @@ -0,0 +1,125 @@ +import type { IDeployment, IDeployments, IDeploymentsFetcher } from "./types.js"; +import type { + DynamoDBDocument, + QueryCommandOutput +} from "@webiny/aws-sdk/client-dynamodb/index.js"; +import { QueryCommand, unmarshall } from "@webiny/aws-sdk/client-dynamodb/index.js"; +import { WebinyError } from "@webiny/error"; +import { createDeployments } from "./Deployments.js"; +import zod from "zod"; +import { createZodError } from "@webiny/utils/createZodError.js"; +import { createDeployment } from "~/resolver/deployment/Deployment.js"; +import { SemVer } from "semver"; + +const deploymentsValidation = zod.array( + zod.object({ + name: zod.string(), + env: zod.string(), + variant: zod.string().optional(), + region: zod.string(), + version: zod.string(), + s3Id: zod.string(), + s3Arn: zod.string(), + primaryDynamoDbArn: zod.string(), + primaryDynamoDbName: zod.string(), + primaryDynamoDbHashKey: zod.string(), + primaryDynamoDbRangeKey: zod.string(), + elasticsearchDynamodbTableArn: zod.string().optional(), + elasticsearchDynamodbTableName: zod.string().optional() + }) +); + +export interface IDeploymentsFetcherParams { + client: Pick; + table: string; +} + +export class DeploymentsFetcher implements IDeploymentsFetcher { + private readonly client: Pick; + private deployments: IDeployments | undefined; + private readonly table: string; + + public constructor(params: IDeploymentsFetcherParams) { + this.client = params.client; + this.table = params.table; + } + + public async fetch(): Promise { + if (!this.deployments) { + this.deployments = createDeployments({ + deployments: await this.load() + }); + } + return this.deployments; + } + + private async load(): Promise { + const cmd = new QueryCommand({ + TableName: this.table, + IndexName: "GSI1", + KeyConditionExpression: `GSI1_PK = :pk`, + ExpressionAttributeValues: { + ":pk": { + S: "DEPLOYMENTS" + } + } + }); + + let result: QueryCommandOutput; + try { + result = await this.client.send(cmd); + } catch (ex) { + console.error("Error while fetching all deployments to be synced."); + throw ex; + } + return this.output(result); + } + + private output(output: QueryCommandOutput): IDeployment[] { + const items = (output.Items || []).map(item => { + const result = unmarshall(item); + return result.item; + }); + if (items.length === 0) { + throw new WebinyError({ + message: "No deployments found which need to be synced.", + code: "NO_DEPLOYMENTS", + data: { + table: this.table + } + }); + } + + const result = deploymentsValidation.safeParse(items); + if (!result.success) { + throw createZodError(result.error); + } + return result.data.map(item => { + return createDeployment({ + name: item.name, + env: item.env, + variant: item.variant, + region: item.region, + version: new SemVer(item.version), + services: { + s3Id: item.s3Id, + s3Arn: item.s3Arn, + primaryDynamoDbArn: item.primaryDynamoDbArn, + primaryDynamoDbName: item.primaryDynamoDbName, + primaryDynamoDbHashKey: item.primaryDynamoDbHashKey, + primaryDynamoDbRangeKey: item.primaryDynamoDbRangeKey, + elasticsearchDynamodbTableArn: item.elasticsearchDynamodbTableArn, + elasticsearchDynamodbTableName: item.elasticsearchDynamodbTableName, + logDynamodbTableName: item.primaryDynamoDbName, + logDynamodbTableArn: item.primaryDynamoDbArn + } + }); + }); + } +} + +export const createDeploymentsFetcher = ( + params: IDeploymentsFetcherParams +): IDeploymentsFetcher => { + return new DeploymentsFetcher(params); +}; diff --git a/packages/api-sync-system/src/resolver/deployment/types.ts b/packages/api-sync-system/src/resolver/deployment/types.ts new file mode 100644 index 00000000000..96298e220e5 --- /dev/null +++ b/packages/api-sync-system/src/resolver/deployment/types.ts @@ -0,0 +1,37 @@ +import { DynamoDBTableType } from "~/types"; +import { SemVer } from "semver"; +import { ITable } from "~/sync/types"; + +export interface IDeploymentServices { + s3Id: string; + s3Arn: string; + primaryDynamoDbArn: string; + primaryDynamoDbName: string; + primaryDynamoDbHashKey: string; + primaryDynamoDbRangeKey: string; + elasticsearchDynamodbTableArn?: string; + elasticsearchDynamodbTableName?: string; + logDynamodbTableArn: string; + logDynamodbTableName: string; +} + +export interface IDeployment { + name: string; + env: string; + variant: string | undefined; + region: string; + services: IDeploymentServices; + version: SemVer; + getTable(type: DynamoDBTableType): ITable; +} + +export interface IDeployments { + hasAny(): boolean; + all(): IDeployment[]; + get(name: string): IDeployment | null; + without(deployment: Pick): IDeployments; +} + +export interface IDeploymentsFetcher { + fetch(): Promise; +} diff --git a/packages/api-sync-system/src/resolver/plugins/CommandHandlerPlugin.ts b/packages/api-sync-system/src/resolver/plugins/CommandHandlerPlugin.ts new file mode 100644 index 00000000000..ebb4be86192 --- /dev/null +++ b/packages/api-sync-system/src/resolver/plugins/CommandHandlerPlugin.ts @@ -0,0 +1,55 @@ +import { Plugin } from "@webiny/plugins"; +import type { CommandType } from "~/types.js"; +import type { IStoreItem, IStorer } from "~/resolver/app/storer/types.js"; +import type { IDeployment } from "~/resolver/deployment/types.js"; +import type { ITable } from "~/sync/types.js"; + +export interface ICommandHandlerPluginCallable { + (params: ICommandHandlerPluginHandleParams): Promise; +} + +export interface ICommandHandlerPluginCanHandleCallable { + (command: CommandType): boolean; +} + +export interface ICommandHandlerPluginHandleParams { + storer: IStorer; + items: IStoreItem[]; + targetDeployment: IDeployment; + targetTable: ITable; +} + +export interface ICommandHandlerPluginParams { + handle: ICommandHandlerPluginCallable; + canHandle: ICommandHandlerPluginCanHandleCallable; +} + +export class CommandHandlerPlugin extends Plugin { + public static override type: string = "syncSystem.commandHandlerPlugin"; + + private readonly config: ICommandHandlerPluginParams; + + public constructor(params: ICommandHandlerPluginParams) { + super(); + this.config = params; + } + + public canHandle(command: CommandType): boolean { + return this.config.canHandle(command); + } + + public async handle(params: ICommandHandlerPluginHandleParams): Promise { + return await this.config.handle({ + storer: params.storer, + items: params.items, + targetDeployment: params.targetDeployment, + targetTable: params.targetTable + }); + } +} + +export const createCommandHandlerPlugin = ( + params: ICommandHandlerPluginParams +): CommandHandlerPlugin => { + return new CommandHandlerPlugin(params); +}; diff --git a/packages/api-sync-system/src/resolver/plugins/TransformRecordPlugin.ts b/packages/api-sync-system/src/resolver/plugins/TransformRecordPlugin.ts new file mode 100644 index 00000000000..2ea622f9bba --- /dev/null +++ b/packages/api-sync-system/src/resolver/plugins/TransformRecordPlugin.ts @@ -0,0 +1,59 @@ +import { Plugin } from "@webiny/plugins"; +import type { ITable } from "~/sync/types.js"; +import type { IDeployment } from "~/resolver/deployment/types.js"; +import type { IStoreItem } from "~/resolver/app/storer/types.js"; + +export interface ITransformRecordPluginConfigTransformCallableParams { + readonly record: IStoreItem; + sourceDeployment: IDeployment; + targetDeployment: IDeployment; + sourceTable: ITable; + targetTable: ITable; +} + +export interface ITransformRecordPluginConfigCanTransformCallableParams { + from: Omit; + to: Omit; +} + +export interface ITransformRecordPluginConfigCanTransformCallable { + (params: ITransformRecordPluginConfigCanTransformCallableParams): boolean; +} + +export interface ITransformRecordPluginConfigTransformCallable { + ( + params: ITransformRecordPluginConfigTransformCallableParams, + next: () => Promise> + ): Promise>; +} + +export interface ITransformRecordPluginConfig { + canTransform: ITransformRecordPluginConfigCanTransformCallable; + transform: ITransformRecordPluginConfigTransformCallable; +} + +export class TransformRecordPlugin extends Plugin { + public static override type: string = "syncSystem.transformRecordPlugin"; + + private readonly config: ITransformRecordPluginConfig; + + public constructor(config: ITransformRecordPluginConfig) { + super(); + this.config = config; + } + + public canTransform(params: ITransformRecordPluginConfigCanTransformCallableParams): boolean { + return this.config.canTransform(params); + } + + public transform( + params: ITransformRecordPluginConfigTransformCallableParams, + next: () => Promise> + ): Promise> { + return this.config.transform(params, next); + } +} + +export const createTransformRecordPlugin = (config: ITransformRecordPluginConfig) => { + return new TransformRecordPlugin(config); +}; diff --git a/packages/api-sync-system/src/sync/attachToDynamoDbDocument.ts b/packages/api-sync-system/src/sync/attachToDynamoDbDocument.ts new file mode 100644 index 00000000000..0b52f515d3b --- /dev/null +++ b/packages/api-sync-system/src/sync/attachToDynamoDbDocument.ts @@ -0,0 +1,78 @@ +import { decorateDocumentClient } from "@webiny/aws-sdk/client-dynamodb/getDocumentClient"; +import type { IHandler } from "~/sync/types.js"; +import type { DynamoDBDocument } from "@webiny/aws-sdk/client-dynamodb/index.js"; +import { + BatchWriteCommand, + PutCommand, + UpdateCommand +} from "@webiny/aws-sdk/client-dynamodb/index.js"; + +export interface IAttachToDynamoDbDocumentParams { + handler: IHandler; +} + +export interface IDecorateClientWithHandlerParams { + handler: IHandler; + client: DynamoDBDocument; +} + +export const decorateClientWithHandler = ( + params: IDecorateClientWithHandlerParams +): DynamoDBDocument => { + const { handler, client } = params; + /** + * Is there a possibility that this is already attached? + * Let's check for the handler and then skip attaching. + */ + // @ts-expect-error + if (client.__webinyHandler?.id === handler.id) { + return client; + } + + const originalSend = client.send; + const originalPut = client.put; + const originalBatchWrite = client.batchWrite; + const originalUpdate = client.update; + + // @ts-expect-error + client.__webinyHandler = handler; + + client.send = async params => { + // @ts-expect-error + handler.add(params); + // @ts-expect-error + return originalSend.apply(client, [params]); + }; + // @ts-expect-error + client.put = async params => { + const cmd = new PutCommand(params); + handler.add(cmd); + // @ts-expect-error + return originalPut.apply(client, [params]); + }; + + // @ts-expect-error + client.batchWrite = async params => { + const cmd = new BatchWriteCommand(params); + handler.add(cmd); + // @ts-expect-error + return originalBatchWrite.apply(client, [params]); + }; + + client.update = async params => { + const cmd = new UpdateCommand(params); + handler.add(cmd); + return originalUpdate(params); + }; + + return client; +}; + +export const attachToDynamoDbDocument = ({ handler }: IAttachToDynamoDbDocumentParams): void => { + return decorateDocumentClient(client => { + return decorateClientWithHandler({ + handler, + client + }); + }); +}; diff --git a/packages/api-sync-system/src/sync/createHandler.ts b/packages/api-sync-system/src/sync/createHandler.ts new file mode 100644 index 00000000000..dcbbf86b600 --- /dev/null +++ b/packages/api-sync-system/src/sync/createHandler.ts @@ -0,0 +1,46 @@ +import { createHandlerConverter } from "~/sync/handler/HandlerConverter.js"; +import { NullCommandValue } from "~/sync/handler/converter/commands/NullCommandValue.js"; +import { createBatchWriteCommandConverter } from "~/sync/handler/converter/BatchWriteCommandConverter.js"; +import { createPutCommandConverter } from "~/sync/handler/converter/PutCommandConverter.js"; +import { createDeleteCommandConverter } from "~/sync/handler/converter/DeleteCommandConverter.js"; +import { createUpdateCommandConverter } from "~/sync/handler/converter/UpdateCommandConverter.js"; +import { createSyncHandler } from "~/sync/handler/Handler.js"; +import type { EventBridgeClient } from "@webiny/aws-sdk/client-eventbridge/index.js"; +import type { ICommandConverter, IManifest, ISystem } from "./types"; + +export interface ICreateHandlerParams { + client: Pick; + commandConverters?: ICommandConverter[]; + system: ISystem; + manifest: IManifest; +} + +export const createHandler = (params: ICreateHandlerParams) => { + const { manifest, commandConverters, system, client } = params; + const converter = createHandlerConverter({ + default: new NullCommandValue() + }); + /** + * We register users command converters because those are tested out first. + * Our converters are in some order I got from my head - the most used commands are first. + */ + converter.register(commandConverters || []); + converter.register(createBatchWriteCommandConverter()); + converter.register(createPutCommandConverter()); + converter.register(createDeleteCommandConverter()); + converter.register(createUpdateCommandConverter()); + + const handler = createSyncHandler({ + system, + client, + eventBus: { + arn: manifest.sync.eventBusArn, + name: manifest.sync.eventBusName + }, + converter + }); + return { + handler, + converter + }; +}; diff --git a/packages/api-sync-system/src/sync/createSendDataToEventBridgeOnRequestEnd.ts b/packages/api-sync-system/src/sync/createSendDataToEventBridgeOnRequestEnd.ts new file mode 100644 index 00000000000..a541339576b --- /dev/null +++ b/packages/api-sync-system/src/sync/createSendDataToEventBridgeOnRequestEnd.ts @@ -0,0 +1,42 @@ +import type { IHandler } from "./types.js"; +import { convertException } from "@webiny/utils"; +import { createOnRequestResponse, createOnRequestTimeout } from "@webiny/handler"; +import type { Request as FastifyRequest } from "@webiny/handler/types"; + +const execute = async (handler: IHandler) => { + try { + await handler.flush(); + } catch (ex) { + /** + * We do not want to throw an error here, because we are in the request end. + * Just log it and exit. + */ + console.error("Error flushing DynamoDB data into the Sync System."); + console.log(convertException(ex, ["message"])); + } +}; + +const isOptionsRequest = (request: FastifyRequest): boolean => { + return request.method.toUpperCase() === "OPTIONS"; +}; + +export const createSendDataToEventBridgeOnRequestEnd = (handler: IHandler) => { + return [ + createOnRequestResponse(async request => { + if (isOptionsRequest(request)) { + console.log("Skipping OPTIONS request - response."); + return; + } + console.log("Executing on request end."); + return execute(handler); + }), + createOnRequestTimeout(async request => { + if (isOptionsRequest(request)) { + console.log("Skipping OPTIONS request - timeout."); + return; + } + console.log("Executing on request timeout."); + return execute(handler); + }) + ]; +}; diff --git a/packages/api-sync-system/src/sync/createSyncSystem.ts b/packages/api-sync-system/src/sync/createSyncSystem.ts new file mode 100644 index 00000000000..c3f4e77509d --- /dev/null +++ b/packages/api-sync-system/src/sync/createSyncSystem.ts @@ -0,0 +1,46 @@ +import type { Plugin } from "@webiny/plugins"; +import type { ISystem } from "./types.js"; +import { validateSystemInput } from "./utils/validateSystemInput.js"; +import type { DynamoDBDocument } from "@webiny/aws-sdk/client-dynamodb/index.js"; +import type { PossiblyUndefinedProperties } from "@webiny/api/types"; +import { createSyncSystemHandlerOnRequestPlugin } from "./requestPlugin.js"; + +export interface ICreateSyncSystemParams { + documentClient: Pick; + system: PossiblyUndefinedProperties>; +} + +export interface ICreateSyncSystemResponse { + plugins(): Plugin[]; +} + +const emptyResponse: ICreateSyncSystemResponse = { + plugins(): Plugin[] { + return []; + } +}; + +export const createSyncSystem = (params: ICreateSyncSystemParams): ICreateSyncSystemResponse => { + const { system, error } = validateSystemInput(params.system); + /** + * We do not want to throw any errors. We will log them and just return a function which returns empty array as plugins. + */ + if (error) { + console.error(error); + return emptyResponse; + } else if (!system) { + console.error("Sync System: No system provided. Sync System will not be attached."); + return emptyResponse; + } + + return { + plugins: () => { + return [ + createSyncSystemHandlerOnRequestPlugin({ + documentClient: params.documentClient, + system + }) + ]; + } + }; +}; diff --git a/packages/api-sync-system/src/sync/handler/Handler.ts b/packages/api-sync-system/src/sync/handler/Handler.ts new file mode 100644 index 00000000000..69107eeeac7 --- /dev/null +++ b/packages/api-sync-system/src/sync/handler/Handler.ts @@ -0,0 +1,110 @@ +import type { + ICommandValue, + IDynamoDbCommand, + IHandler, + IHandlerConverter, + ISystem +} from "../types.js"; +import type { + EventBridgeClient, + PutEventsCommandInput, + PutEventsRequestEntry +} from "@webiny/aws-sdk/client-eventbridge"; +import { PutEventsCommand } from "@webiny/aws-sdk/client-eventbridge"; +import { convertException } from "@webiny/utils"; +import type { IDetail } from "./types.js"; +import { SQS_EVENT_NAME } from "~/constants.js"; +import { generateAlphaNumericId } from "@webiny/utils/generateId.js"; + +export interface IHandlerEventBus { + name: string; + arn: string; +} + +export interface IHandlerParams { + client: Pick; + converter: IHandlerConverter; + eventBus: IHandlerEventBus; + system: ISystem; +} + +export class Handler implements IHandler { + public readonly id = generateAlphaNumericId(); + private readonly system: ISystem; + private readonly client: Pick; + private commands: ICommandValue[] = []; + private readonly converter: IHandlerConverter; + private readonly eventBus: IHandlerEventBus; + + public constructor(params: IHandlerParams) { + this.client = params.client; + this.system = params.system; + this.converter = params.converter; + this.eventBus = params.eventBus; + } + + public add(input: IDynamoDbCommand): void { + const cmd = this.converter.convert(input); + this.commands.push(cmd); + } + + public async flush(): Promise { + const entries = this.createEventBusEntries(); + if (entries.length === 0) { + return; + } + + const input: PutEventsCommandInput = { + Entries: entries, + /** + * If we get to the global event bus usage, we will need to set the EndpointId + */ + EndpointId: undefined + }; + const command = new PutEventsCommand(input); + + try { + await this.client.send(command); + } catch (ex) { + console.log("Could not send events to Sync System EventBridge."); + console.error(ex.message); + console.error(convertException(ex, ["message"])); + console.log( + JSON.stringify({ + entries: entries.map(entry => entry.Detail) + }) + ); + throw ex; + } + } + + private createEventBusEntries(): PutEventsRequestEntry[] { + const result = this.commands + .map((cmd): PutEventsRequestEntry | null => { + const items = cmd.getItems(); + if (!items?.length) { + return null; + } + const detail: IDetail = { + items, + source: this.system + }; + return { + DetailType: SQS_EVENT_NAME, + Detail: JSON.stringify(detail), + Source: `webiny:${this.system.name}`, + EventBusName: this.eventBus.arn + }; + }) + .filter((item): item is PutEventsRequestEntry => !!item); + /** + * Remove all existing commands so we can start fresh. + */ + this.commands = []; + return result; + } +} + +export const createSyncHandler = (params: IHandlerParams): IHandler => { + return new Handler(params); +}; diff --git a/packages/api-sync-system/src/sync/handler/HandlerConverter.ts b/packages/api-sync-system/src/sync/handler/HandlerConverter.ts new file mode 100644 index 00000000000..2ef7b38b1c2 --- /dev/null +++ b/packages/api-sync-system/src/sync/handler/HandlerConverter.ts @@ -0,0 +1,55 @@ +import type { + ICommandConverter, + ICommandValue, + IDynamoDbCommand, + IHandlerConverter +} from "../types.js"; + +export interface IHandlerConverterParams { + default: ICommandValue; +} + +export class HandlerConverter implements IHandlerConverter { + private readonly _default: ICommandValue; + private readonly converters: ICommandConverter[] = []; + + public constructor(params: IHandlerConverterParams) { + this._default = params.default; + } + + public register(input: ICommandConverter | ICommandConverter[]): void { + if (Array.isArray(input)) { + this.converters.push(...input); + return; + } + + this.converters.push(input); + } + + public convert(command: IDynamoDbCommand): ICommandValue { + for (const converter of this.converters) { + if (converter.can(command)) { + return converter.convert(command); + } + } + if (process.env.DEBUG === "true") { + console.error(`Unknown command: ${command.constructor?.name || "unknown"}`); + if (!command.constructor?.name) { + console.error( + "Command is not an instance of a class, it might be a plain object. Stringified command is in next line." + ); + console.log( + JSON.stringify({ + command + }) + ); + } + } + + return this._default; + } +} + +export const createHandlerConverter = (params: IHandlerConverterParams): IHandlerConverter => { + return new HandlerConverter(params); +}; diff --git a/packages/api-sync-system/src/sync/handler/converter/BatchWriteCommandConverter.ts b/packages/api-sync-system/src/sync/handler/converter/BatchWriteCommandConverter.ts new file mode 100644 index 00000000000..27a54b8e6c0 --- /dev/null +++ b/packages/api-sync-system/src/sync/handler/converter/BatchWriteCommandConverter.ts @@ -0,0 +1,18 @@ +import { BatchWriteCommand } from "@webiny/aws-sdk/client-dynamodb/index.js"; +import type { ICommandConverter, IDynamoDbCommand } from "../../types.js"; +import { BatchWriteCommandValue } from "./commands/BatchWriteCommandValue.js"; + +export class BatchWriteCommandConverter implements ICommandConverter { + public readonly name: string = "put"; + + public can(input: IDynamoDbCommand): boolean { + return input instanceof BatchWriteCommand; + } + public convert(input: BatchWriteCommand) { + return new BatchWriteCommandValue(input); + } +} + +export const createBatchWriteCommandConverter = (): ICommandConverter => { + return new BatchWriteCommandConverter(); +}; diff --git a/packages/api-sync-system/src/sync/handler/converter/DeleteCommandConverter.ts b/packages/api-sync-system/src/sync/handler/converter/DeleteCommandConverter.ts new file mode 100644 index 00000000000..c11fb90a4d5 --- /dev/null +++ b/packages/api-sync-system/src/sync/handler/converter/DeleteCommandConverter.ts @@ -0,0 +1,18 @@ +import { DeleteCommand } from "@webiny/aws-sdk/client-dynamodb/index.js"; +import type { ICommandConverter, IDynamoDbCommand } from "../../types.js"; +import { DeleteCommandValue } from "./commands/DeleteCommandValue.js"; + +export class DeleteCommandConverter implements ICommandConverter { + public readonly name: string = "delete"; + + public can(input: IDynamoDbCommand): boolean { + return input instanceof DeleteCommand; + } + public convert(input: DeleteCommand) { + return new DeleteCommandValue(input); + } +} + +export const createDeleteCommandConverter = (): ICommandConverter => { + return new DeleteCommandConverter(); +}; diff --git a/packages/api-sync-system/src/sync/handler/converter/PutCommandConverter.ts b/packages/api-sync-system/src/sync/handler/converter/PutCommandConverter.ts new file mode 100644 index 00000000000..d899207d4eb --- /dev/null +++ b/packages/api-sync-system/src/sync/handler/converter/PutCommandConverter.ts @@ -0,0 +1,18 @@ +import { PutCommand } from "@webiny/aws-sdk/client-dynamodb/index.js"; +import type { ICommandConverter, IDynamoDbCommand } from "../../types.js"; +import { PutCommandValue } from "./commands/PutCommandValue.js"; + +export class PutCommandConverter implements ICommandConverter { + public readonly name: string = "put"; + + public can(input: IDynamoDbCommand): boolean { + return input instanceof PutCommand; + } + public convert(input: PutCommand) { + return new PutCommandValue(input); + } +} + +export const createPutCommandConverter = (): ICommandConverter => { + return new PutCommandConverter(); +}; diff --git a/packages/api-sync-system/src/sync/handler/converter/UpdateCommandConverter.ts b/packages/api-sync-system/src/sync/handler/converter/UpdateCommandConverter.ts new file mode 100644 index 00000000000..a636c46724e --- /dev/null +++ b/packages/api-sync-system/src/sync/handler/converter/UpdateCommandConverter.ts @@ -0,0 +1,18 @@ +import { UpdateCommand } from "@webiny/aws-sdk/client-dynamodb/index.js"; +import type { ICommandConverter, IDynamoDbCommand } from "../../types.js"; +import { UpdateCommandValue } from "./commands/UpdateCommandValue.js"; + +export class UpdateCommandConverter implements ICommandConverter { + public readonly name: string = "update"; + + public can(input: IDynamoDbCommand): boolean { + return input instanceof UpdateCommand; + } + public convert(input: UpdateCommand) { + return new UpdateCommandValue(input); + } +} + +export const createUpdateCommandConverter = (): ICommandConverter => { + return new UpdateCommandConverter(); +}; diff --git a/packages/api-sync-system/src/sync/handler/converter/commands/BatchWriteCommandValue.ts b/packages/api-sync-system/src/sync/handler/converter/commands/BatchWriteCommandValue.ts new file mode 100644 index 00000000000..78dc1a24003 --- /dev/null +++ b/packages/api-sync-system/src/sync/handler/converter/commands/BatchWriteCommandValue.ts @@ -0,0 +1,49 @@ +import type { BatchWriteCommand } from "@webiny/aws-sdk/client-dynamodb"; +import type { ICommandValue, ICommandValueItem } from "~/sync/types.js"; +import type { NonEmptyArray } from "@webiny/api/types.js"; +import { getTableType } from "~/sync/utils/getTableType.js"; + +const convert = (items: ICommandValueItem[]): NonEmptyArray | null => { + if (items.length === 0) { + return null; + } + return items as NonEmptyArray; +}; + +export class BatchWriteCommandValue implements ICommandValue { + public readonly command = "batchWrite"; + public readonly items: ICommandValueItem[] = []; + + public constructor(input: BatchWriteCommand) { + for (const tableName in input.input.RequestItems) { + const values = input.input.RequestItems[tableName]; + for (const value of values) { + if (value.PutRequest?.Item) { + const item = value.PutRequest.Item; + + this.items.push({ + command: "put", + PK: item.PK, + SK: item.SK, + tableName, + tableType: getTableType(tableName) + }); + } else if (value.DeleteRequest?.Key) { + const item = value.DeleteRequest.Key; + + this.items.push({ + command: "delete", + PK: item.PK, + SK: item.SK, + tableName, + tableType: getTableType(tableName) + }); + } + } + } + } + + public getItems(): NonEmptyArray | null { + return convert(this.items); + } +} diff --git a/packages/api-sync-system/src/sync/handler/converter/commands/DeleteCommandValue.ts b/packages/api-sync-system/src/sync/handler/converter/commands/DeleteCommandValue.ts new file mode 100644 index 00000000000..0e8c30687c1 --- /dev/null +++ b/packages/api-sync-system/src/sync/handler/converter/commands/DeleteCommandValue.ts @@ -0,0 +1,24 @@ +import type { DeleteCommand } from "@webiny/aws-sdk/client-dynamodb"; +import type { ICommandValue, ICommandValueItem } from "~/sync/types.js"; +import type { NonEmptyArray } from "@webiny/api/types.js"; +import { getTableType } from "~/sync/utils/getTableType.js"; + +export class DeleteCommandValue implements ICommandValue { + public readonly command = "delete"; + public readonly item: ICommandValueItem; + + public constructor(input: DeleteCommand) { + const tableName = input.input.TableName as string; + this.item = { + command: this.command, + PK: input.input.Key!.PK, + SK: input.input.Key!.SK, + tableName, + tableType: getTableType(tableName) + }; + } + + public getItems(): NonEmptyArray { + return [this.item]; + } +} diff --git a/packages/api-sync-system/src/sync/handler/converter/commands/NullCommandValue.ts b/packages/api-sync-system/src/sync/handler/converter/commands/NullCommandValue.ts new file mode 100644 index 00000000000..1c83a630d6d --- /dev/null +++ b/packages/api-sync-system/src/sync/handler/converter/commands/NullCommandValue.ts @@ -0,0 +1,12 @@ +import type { ICommandValue } from "~/sync/types.js"; + +export class NullCommandValue implements ICommandValue { + /** + * Does not matter what will be here, we will not use it. + */ + public readonly command = "null"; + + public getItems(): null { + return null; + } +} diff --git a/packages/api-sync-system/src/sync/handler/converter/commands/PutCommandValue.ts b/packages/api-sync-system/src/sync/handler/converter/commands/PutCommandValue.ts new file mode 100644 index 00000000000..31ee8070f7b --- /dev/null +++ b/packages/api-sync-system/src/sync/handler/converter/commands/PutCommandValue.ts @@ -0,0 +1,24 @@ +import type { PutCommand } from "@webiny/aws-sdk/client-dynamodb"; +import type { ICommandValue, ICommandValueItem } from "~/sync/types.js"; +import type { NonEmptyArray } from "@webiny/api/types.js"; +import { getTableType } from "~/sync/utils/getTableType.js"; + +export class PutCommandValue implements ICommandValue { + public readonly command = "put"; + public readonly item: ICommandValueItem; + + public constructor(input: PutCommand) { + const tableName = input.input.TableName as string; + this.item = { + command: this.command, + PK: input.input.Item!.PK, + SK: input.input.Item!.SK, + tableName, + tableType: getTableType(tableName) + }; + } + + public getItems(): NonEmptyArray { + return [this.item]; + } +} diff --git a/packages/api-sync-system/src/sync/handler/converter/commands/UpdateCommandValue.ts b/packages/api-sync-system/src/sync/handler/converter/commands/UpdateCommandValue.ts new file mode 100644 index 00000000000..708b2239541 --- /dev/null +++ b/packages/api-sync-system/src/sync/handler/converter/commands/UpdateCommandValue.ts @@ -0,0 +1,24 @@ +import type { UpdateCommand } from "@webiny/aws-sdk/client-dynamodb"; +import type { ICommandValue, ICommandValueItem } from "~/sync/types.js"; +import type { NonEmptyArray } from "@webiny/api/types.js"; +import { getTableType } from "~/sync/utils/getTableType.js"; + +export class UpdateCommandValue implements ICommandValue { + public readonly command = "update"; + public readonly item: ICommandValueItem; + + public constructor(input: UpdateCommand) { + const tableName = input.input.TableName as string; + this.item = { + command: this.command, + PK: input.input.Key!.PK, + SK: input.input.Key!.SK, + tableName, + tableType: getTableType(tableName) + }; + } + + public getItems(): NonEmptyArray { + return [this.item]; + } +} diff --git a/packages/api-sync-system/src/sync/handler/types.ts b/packages/api-sync-system/src/sync/handler/types.ts new file mode 100644 index 00000000000..9c7ddd6ddb8 --- /dev/null +++ b/packages/api-sync-system/src/sync/handler/types.ts @@ -0,0 +1,19 @@ +import type { NonEmptyArray } from "@webiny/api/types"; +import type { DynamoDBTableType, ExtendedCommandType } from "~/types.js"; +import type { ISystem } from "../types"; + +export interface IDetailItem { + PK: string; + SK: string; + command: ExtendedCommandType; + /** + * There will be multiple tables that will get populated through the system (regular table and elasticsearch for start). + */ + tableName: string; + tableType: DynamoDBTableType; +} + +export interface IDetail { + items: NonEmptyArray; + source: ISystem; +} diff --git a/packages/api-sync-system/src/sync/requestPlugin.ts b/packages/api-sync-system/src/sync/requestPlugin.ts new file mode 100644 index 00000000000..bf9e7f7941c --- /dev/null +++ b/packages/api-sync-system/src/sync/requestPlugin.ts @@ -0,0 +1,54 @@ +import type { DynamoDBDocument } from "@webiny/aws-sdk/client-dynamodb/index.js"; +import type { ICommandConverter, ISystem } from "~/sync/types.js"; +import { createHandlerOnRequest } from "@webiny/handler"; +import { getManifest } from "~/sync/utils/manifest.js"; +import { attachToDynamoDbDocument } from "~/sync/attachToDynamoDbDocument.js"; +import { createSendDataToEventBridgeOnRequestEnd } from "~/sync/createSendDataToEventBridgeOnRequestEnd.js"; +import { createHandler } from "./createHandler.js"; +import type { EventBridgeClient } from "@webiny/aws-sdk/client-eventbridge/index.js"; +import { createEventBridgeClient } from "@webiny/aws-sdk/client-eventbridge/index.js"; + +export interface ICreateSyncSystemHandlerOnRequestPluginParams { + documentClient: Pick; + system: ISystem; + client?: EventBridgeClient; + commandConverters?: ICommandConverter[]; +} + +export const createSyncSystemHandlerOnRequestPlugin = ( + params: ICreateSyncSystemHandlerOnRequestPluginParams +) => { + return createHandlerOnRequest(async (_, __, context) => { + const { data: manifest, error } = await getManifest(params); + if (!manifest?.sync?.region || error) { + console.log( + JSON.stringify({ + error, + noManifest: manifest + }) + ); + return; + } + + const { handler } = createHandler({ + client: + params.client || + createEventBridgeClient({ + region: manifest.sync.region + }), + system: params.system, + manifest, + commandConverters: params.commandConverters + }); + + attachToDynamoDbDocument({ + handler + }); + context.plugins.register([ + /** + * When request ends, send the data to the EventBridge. + */ + createSendDataToEventBridgeOnRequestEnd(handler) + ]); + }); +}; diff --git a/packages/api-sync-system/src/sync/types.ts b/packages/api-sync-system/src/sync/types.ts new file mode 100644 index 00000000000..c09bd3acd6f --- /dev/null +++ b/packages/api-sync-system/src/sync/types.ts @@ -0,0 +1,78 @@ +import type { NonEmptyArray } from "@webiny/api/types"; +import { + type BatchGetCommand, + type BatchWriteCommand, + type DeleteCommand, + type GetCommand, + type PutCommand, + type UpdateCommand +} from "@webiny/aws-sdk/client-dynamodb"; +import type { AllCommandType, ExtendedCommandType, DynamoDBTableType } from "~/types.js"; + +export interface IManifestData { + region: string; + eventBusName: string; + eventBusArn: string; +} + +export interface IManifest { + sync: IManifestData; +} + +export type IDynamoDbCommand = + | PutCommand + | DeleteCommand + | BatchWriteCommand + | BatchGetCommand + | GetCommand + | UpdateCommand; + +export interface ICommandValueItem { + PK: string; + SK: string; + command: ExtendedCommandType; + tableName: string; + tableType: DynamoDBTableType; +} + +export interface ICommandValue { + readonly command: AllCommandType; + getItems(): NonEmptyArray | null; +} + +export interface ICommand { + name: string; + can(input: IDynamoDbCommand): boolean; + convert(input: IDynamoDbCommand): Result; +} + +export interface ITable { + name: string; + arn: string; + type: DynamoDBTableType; +} + +export interface ISystem { + name: string; + env: string; + variant?: string | undefined; + region: string; + version: string; +} + +export interface IHandler { + readonly id: string; + flush(): Promise; + add(input: IDynamoDbCommand): void; +} + +export interface ICommandConverter { + name: string; + can(input: IDynamoDbCommand): boolean; + convert(input: IDynamoDbCommand): Result; +} + +export interface IHandlerConverter { + register(input: ICommandConverter | ICommandConverter[]): void; + convert(input: IDynamoDbCommand): ICommandValue; +} diff --git a/packages/api-sync-system/src/sync/utils/getTableType.ts b/packages/api-sync-system/src/sync/utils/getTableType.ts new file mode 100644 index 00000000000..71b0d262ce8 --- /dev/null +++ b/packages/api-sync-system/src/sync/utils/getTableType.ts @@ -0,0 +1,14 @@ +import type { DynamoDBTableType } from "~/types.js"; + +export const getTableType = (tableName: string): DynamoDBTableType => { + switch (tableName) { + case process.env.DB_TABLE: + return "regular"; + case process.env.DB_TABLE_ELASTICSEARCH: + return "elasticsearch"; + case process.env.DB_TABLE_LOG: + return "log"; + default: + return "unknown"; + } +}; diff --git a/packages/api-sync-system/src/sync/utils/manifest.ts b/packages/api-sync-system/src/sync/utils/manifest.ts new file mode 100644 index 00000000000..f17d7d716a4 --- /dev/null +++ b/packages/api-sync-system/src/sync/utils/manifest.ts @@ -0,0 +1,51 @@ +import { ServiceDiscovery } from "@webiny/api"; +import zod from "zod"; +import { convertException, createZodError } from "@webiny/utils"; +import type { DynamoDBDocument } from "@webiny/aws-sdk/client-dynamodb"; + +const validateManifest = zod.object({ + sync: zod.object({ + eventBusArn: zod.string(), + eventBusName: zod.string(), + region: zod.string() + }) +}); + +export interface IGetManifestParams { + documentClient: Pick; +} + +export const getManifest = async (params: IGetManifestParams) => { + try { + ServiceDiscovery.setDocumentClient(params.documentClient); + const manifest = await ServiceDiscovery.load(); + if (!manifest?.sync) { + return { + /** + * This error will be silent. We do not want to log or throw at this point. + */ + error: new Error( + "Sync System Manifest not found. Probably Sync System is not turned on." + ) + }; + } + const { data, error } = validateManifest.safeParse(manifest); + if (error) { + console.error("Sync System: Failed to validate manifest."); + const err = createZodError(error); + console.info(JSON.stringify(convertException(err))); + return { + error: err + }; + } + return { + data + }; + } catch (ex) { + console.error("Sync System: Failed to load manifest."); + console.info(convertException(ex)); + return { + error: ex + }; + } +}; diff --git a/packages/api-sync-system/src/sync/utils/validateSystemInput.ts b/packages/api-sync-system/src/sync/utils/validateSystemInput.ts new file mode 100644 index 00000000000..e6c369fb224 --- /dev/null +++ b/packages/api-sync-system/src/sync/utils/validateSystemInput.ts @@ -0,0 +1,45 @@ +import type { ISystem } from "~/sync/types.js"; +import { createSystemName } from "~/utils/createSystemName.js"; + +export interface IValidResponse { + system: ISystem; + error?: never; +} + +export interface IErrorResponse { + error: string; + system?: never; +} + +export type ValidateSystemInputResponse = IValidResponse | IErrorResponse; + +export const validateSystemInput = (input: Partial): ValidateSystemInputResponse => { + const { env, region, variant, version } = input; + if (!env) { + return { + error: "Sync System: No environment variable provided. Sync System will not be attached." + }; + } else if (!region) { + return { + error: "Sync System: No region variable provided. Sync System will not be attached." + }; + } else if (!version) { + return { + error: "Sync System: No version variable provided. Sync System will not be attached." + }; + } + const name = createSystemName({ + env, + variant + }); + + return { + system: { + env, + name, + region, + variant, + version + } + }; +}; diff --git a/packages/api-sync-system/src/types.ts b/packages/api-sync-system/src/types.ts new file mode 100644 index 00000000000..e63febbcb77 --- /dev/null +++ b/packages/api-sync-system/src/types.ts @@ -0,0 +1,9 @@ +import { Context as BaseContext } from "@webiny/handler-aws/types"; + +export type CommandType = "put" | "delete"; +export type ExtendedCommandType = "put" | "delete" | "update"; +export type AllCommandType = ExtendedCommandType | "batchWrite" | "null"; + +export type DynamoDBTableType = "regular" | "elasticsearch" | "log" | "unknown"; + +export interface Context extends BaseContext {} diff --git a/packages/api-sync-system/src/utils/createSystemName.ts b/packages/api-sync-system/src/utils/createSystemName.ts new file mode 100644 index 00000000000..5d12d6bc692 --- /dev/null +++ b/packages/api-sync-system/src/utils/createSystemName.ts @@ -0,0 +1,8 @@ +export interface ICreateSystemNameParams { + env: string; + variant: string | undefined; +} + +export const createSystemName = (params: ICreateSystemNameParams): string => { + return [params.env, params.variant].filter(Boolean).join("#"); +}; diff --git a/packages/api-sync-system/tsconfig.build.json b/packages/api-sync-system/tsconfig.build.json new file mode 100644 index 00000000000..9d939cbee89 --- /dev/null +++ b/packages/api-sync-system/tsconfig.build.json @@ -0,0 +1,20 @@ +{ + "extends": "../../tsconfig.build.json", + "include": ["src"], + "references": [ + { "path": "../api/tsconfig.build.json" }, + { "path": "../aws-sdk/tsconfig.build.json" }, + { "path": "../error/tsconfig.build.json" }, + { "path": "../handler/tsconfig.build.json" }, + { "path": "../handler-aws/tsconfig.build.json" }, + { "path": "../plugins/tsconfig.build.json" }, + { "path": "../utils/tsconfig.build.json" } + ], + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "declarationDir": "./dist", + "paths": { "~/*": ["./src/*"], "~tests/*": ["./__tests__/*"] }, + "baseUrl": "." + } +} diff --git a/packages/api-sync-system/tsconfig.json b/packages/api-sync-system/tsconfig.json new file mode 100644 index 00000000000..c845a1e1b77 --- /dev/null +++ b/packages/api-sync-system/tsconfig.json @@ -0,0 +1,37 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src", "__tests__"], + "references": [ + { "path": "../api" }, + { "path": "../aws-sdk" }, + { "path": "../error" }, + { "path": "../handler" }, + { "path": "../handler-aws" }, + { "path": "../plugins" }, + { "path": "../utils" } + ], + "compilerOptions": { + "rootDirs": ["./src", "./__tests__"], + "outDir": "./dist", + "declarationDir": "./dist", + "paths": { + "~/*": ["./src/*"], + "~tests/*": ["./__tests__/*"], + "@webiny/api/*": ["../api/src/*"], + "@webiny/api": ["../api/src"], + "@webiny/aws-sdk/*": ["../aws-sdk/src/*"], + "@webiny/aws-sdk": ["../aws-sdk/src"], + "@webiny/error/*": ["../error/src/*"], + "@webiny/error": ["../error/src"], + "@webiny/handler/*": ["../handler/src/*"], + "@webiny/handler": ["../handler/src"], + "@webiny/handler-aws/*": ["../handler-aws/src/*"], + "@webiny/handler-aws": ["../handler-aws/src"], + "@webiny/plugins/*": ["../plugins/src/*"], + "@webiny/plugins": ["../plugins/src"], + "@webiny/utils/*": ["../utils/src/*"], + "@webiny/utils": ["../utils/src"] + }, + "baseUrl": "." + } +} diff --git a/packages/api-sync-system/webiny.config.js b/packages/api-sync-system/webiny.config.js new file mode 100644 index 00000000000..6dff86766c9 --- /dev/null +++ b/packages/api-sync-system/webiny.config.js @@ -0,0 +1,8 @@ +const { createWatchPackage, createBuildPackage } = require("@webiny/project-utils"); + +module.exports = { + commands: { + build: createBuildPackage({ cwd: __dirname }), + watch: createWatchPackage({ cwd: __dirname }) + } +}; diff --git a/packages/api/src/ServiceDiscovery.ts b/packages/api/src/ServiceDiscovery.ts index 4c5231d721f..82c2f424702 100644 --- a/packages/api/src/ServiceDiscovery.ts +++ b/packages/api/src/ServiceDiscovery.ts @@ -1,6 +1,6 @@ import { - getDocumentClient, DynamoDBDocument, + getDocumentClient, QueryCommand, unmarshall } from "@webiny/aws-sdk/client-dynamodb"; @@ -14,10 +14,10 @@ interface ServiceManifest { type Manifest = GenericRecord; class ServiceManifestLoader { - private client: DynamoDBDocument | undefined; + private client: Pick | undefined; private manifest: Manifest | undefined = undefined; - async load() { + public async load() { if (this.manifest) { return this.manifest; } @@ -39,10 +39,14 @@ class ServiceManifestLoader { return this.manifest; } - setDocumentClient(client: DynamoDBDocument) { + public setDocumentClient(client: Pick) { this.client = client; } + public clear(): void { + this.manifest = undefined; + } + private async loadManifests(): Promise { const client = this.client || getDocumentClient(); const { Items } = await client.send( @@ -68,11 +72,17 @@ class ServiceManifestLoader { const serviceManifestLoader = new ServiceManifestLoader(); export class ServiceDiscovery { - static setDocumentClient(client: DynamoDBDocument): void { + static setDocumentClient(client: Pick): void { serviceManifestLoader.setDocumentClient(client); } static async load() { return serviceManifestLoader.load(); } + /** + * Should be used for testing purposes only! + */ + static clear(): void { + serviceManifestLoader.clear(); + } } diff --git a/packages/api/src/types.ts b/packages/api/src/types.ts index 47e1774e7ce..8e35e250b41 100644 --- a/packages/api/src/types.ts +++ b/packages/api/src/types.ts @@ -5,6 +5,10 @@ export type GenericRecord = Record export type NonEmptyArray = [T, ...T[]]; +export type PossiblyUndefinedProperties = { + [K in keyof T]: T[K] extends undefined ? T[K] : T[K] | undefined; +}; + export type BenchmarkRuns = GenericRecord; export interface BenchmarkMeasurement { diff --git a/packages/aws-sdk/src/client-dynamodb/getDocumentClient.ts b/packages/aws-sdk/src/client-dynamodb/getDocumentClient.ts index eb4e360f938..88e056b9e79 100644 --- a/packages/aws-sdk/src/client-dynamodb/getDocumentClient.ts +++ b/packages/aws-sdk/src/client-dynamodb/getDocumentClient.ts @@ -1,19 +1,21 @@ -import { DynamoDBClient, DynamoDBClientConfig } from "@aws-sdk/client-dynamodb"; -import { DynamoDBDocument, TranslateConfig } from "@aws-sdk/lib-dynamodb"; -import crypto from "crypto"; +import type { DynamoDBClientConfig } from "@aws-sdk/client-dynamodb"; +import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; +import type { TranslateConfig } from "@aws-sdk/lib-dynamodb"; +import { DynamoDBDocument } from "@aws-sdk/lib-dynamodb"; +import { createCacheKey } from "@webiny/utils"; + +export interface IDecorateDocumentClientCallable { + (client: DynamoDBDocument): DynamoDBDocument; +} + +let decorateDocumentClientCallable: IDecorateDocumentClientCallable | undefined = undefined; const DEFAULT_CONFIG = { region: process.env.AWS_REGION }; -const createKey = (config: DynamoDBClientConfig): string => { - const key = JSON.stringify(config); - const hash = crypto.createHash("sha1"); - hash.update(key); - return hash.digest("hex"); -}; - const documentClients: Record = {}; + /** * We do not want users to be able to change these options, so we are not exposing them. */ @@ -26,15 +28,47 @@ const documentClientConfig: TranslateConfig = { }; export const getDocumentClient = (input?: DynamoDBClientConfig): DynamoDBDocument => { - const config = input || DEFAULT_CONFIG; - const key = createKey(config); + const config: DynamoDBClientConfig = { + ...DEFAULT_CONFIG, + ...input + }; + const key = createCacheKey(config); if (documentClients[key]) { - return documentClients[key]; + console.log({ + existingKey: key + }); + return applyDecoration(documentClients[key]); } const client = new DynamoDBClient(config); const documentClient = DynamoDBDocument.from(client, documentClientConfig); + console.log({ + newKey: key + }); - documentClients[key] = documentClient; - return documentClient; + return (documentClients[key] = applyDecoration(documentClient)); +}; +/** + * Client will not be decorated more than once. + */ +const applyDecoration = (client: DynamoDBDocument): DynamoDBDocument => { + if (!decorateDocumentClientCallable) { + console.log("No decoration function provided."); + return client; + } + console.log("applying decoration"); + + // @ts-expect-error + client.__decoratedByWebiny = true; + return decorateDocumentClientCallable(client); +}; + +export const decorateDocumentClient = (cb: IDecorateDocumentClientCallable): void => { + decorateDocumentClientCallable = cb; + /** + * Decorate already existing clients. + */ + for (const key in documentClients) { + cb(documentClients[key]); + } }; diff --git a/packages/aws-sdk/src/client-dynamodb/index.ts b/packages/aws-sdk/src/client-dynamodb/index.ts index 31d7c6ae2fb..7d81487912c 100644 --- a/packages/aws-sdk/src/client-dynamodb/index.ts +++ b/packages/aws-sdk/src/client-dynamodb/index.ts @@ -8,13 +8,27 @@ export type { export type { StreamRecord } from "@aws-sdk/client-dynamodb-streams"; export { + BatchWriteCommandInput, + BatchWriteCommandOutput, + BatchGetCommandInput, + BatchGetCommandOutput, + PutCommandInput, + PutCommandOutput, + GetCommandInput, GetCommandOutput, + DeleteCommandInput, + DeleteCommandOutput, BatchWriteCommand, + BatchGetCommand, PutCommand, + ScanCommand, + ScanCommandInput, + ScanCommandOutput, GetCommand, UpdateCommand, DeleteCommand, - DynamoDBDocument + DynamoDBDocument, + QueryCommandOutput } from "@aws-sdk/lib-dynamodb"; export { unmarshall, marshall } from "@aws-sdk/util-dynamodb"; diff --git a/packages/aws-sdk/src/client-eventbridge/index.ts b/packages/aws-sdk/src/client-eventbridge/index.ts index e0d893c85f6..37a7eedcd23 100644 --- a/packages/aws-sdk/src/client-eventbridge/index.ts +++ b/packages/aws-sdk/src/client-eventbridge/index.ts @@ -1,7 +1,20 @@ +import type { EventBridgeClientConfig } from "@aws-sdk/client-eventbridge"; +import { EventBridgeClient } from "@aws-sdk/client-eventbridge"; + export { EventBridgeClient, PutEventsRequestEntry, - PutEventsCommand, + PutEventsCommand +} from "@aws-sdk/client-eventbridge"; + +export type { + EventBridgeClientConfig, PutEventsCommandInput, PutEventsCommandOutput } from "@aws-sdk/client-eventbridge"; + +export const createEventBridgeClient = (config?: Partial) => { + return new EventBridgeClient({ + ...config + }); +}; diff --git a/packages/cli-plugin-deploy-pulumi/src/commands/deploy/pulumiLoginSelectStack.ts b/packages/cli-plugin-deploy-pulumi/src/commands/deploy/pulumiLoginSelectStack.ts index 654612ce2af..edf53d999d7 100644 --- a/packages/cli-plugin-deploy-pulumi/src/commands/deploy/pulumiLoginSelectStack.ts +++ b/packages/cli-plugin-deploy-pulumi/src/commands/deploy/pulumiLoginSelectStack.ts @@ -43,7 +43,7 @@ export const pulumiLoginSelectStack = async ({ */ const region = inputs.region || process.env.AWS_REGION; - const skip = ["core", "blueGreen"].includes(projectApplication.id); + const skip = ["core", "blueGreen", "sync"].includes(projectApplication.id); if (!skip) { const coreStack = getStackOutput({ diff --git a/packages/cli-plugin-deploy-pulumi/src/plugins/AfterDestroyPlugin.ts b/packages/cli-plugin-deploy-pulumi/src/plugins/AfterDestroyPlugin.ts new file mode 100644 index 00000000000..a4ee22a4659 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/src/plugins/AfterDestroyPlugin.ts @@ -0,0 +1,12 @@ +import { + Callable, + PulumiCommandLifecycleEventHookPlugin +} from "./PulumiCommandLifecycleEventHookPlugin"; + +export class AfterDestroyPlugin extends PulumiCommandLifecycleEventHookPlugin { + public static override type = "hook-after-destroy"; +} + +export const createAfterDestroyPlugin = (callable: Callable) => { + return new AfterDestroyPlugin(callable); +}; diff --git a/packages/cli-plugin-deploy-pulumi/src/plugins/index.ts b/packages/cli-plugin-deploy-pulumi/src/plugins/index.ts index 38cd7282eee..abbda8047ca 100644 --- a/packages/cli-plugin-deploy-pulumi/src/plugins/index.ts +++ b/packages/cli-plugin-deploy-pulumi/src/plugins/index.ts @@ -1,5 +1,6 @@ export * from "./AfterBuildPlugin"; export * from "./AfterDeployPlugin"; +export * from "./AfterDestroyPlugin"; export * from "./BeforeBuildPlugin"; export * from "./BeforeDeployPlugin"; diff --git a/packages/cli-plugin-deploy-pulumi/src/utils/getStackOutput.ts b/packages/cli-plugin-deploy-pulumi/src/utils/getStackOutput.ts index 3cd9deb2c58..cafc34c9c25 100644 --- a/packages/cli-plugin-deploy-pulumi/src/utils/getStackOutput.ts +++ b/packages/cli-plugin-deploy-pulumi/src/utils/getStackOutput.ts @@ -80,6 +80,10 @@ export interface IDefaultStackOutput extends IStackOutput { apiDomain: string; apiUrl: string; graphqlLambdaRole: string; + graphqlLambdaRoleName: string; + fileManagerManageLambdaArn: string; + fileManagerManageLambdaRole: string; + fileManagerManageLambdaRoleName: string; apwSchedulerEventRule: string | undefined; apwSchedulerEventTargetId: string | undefined; apwSchedulerExecuteAction: string | undefined; @@ -90,6 +94,7 @@ export interface IDefaultStackOutput extends IStackOutput { cognitoUserPoolPasswordPolicy: string; websocketApiUrl: string; fileManagerBucketId: string; + fileManagerBucketArn: string; primaryDynamodbTableArn: string; primaryDynamodbTableName: string; primaryDynamodbTableHashKey: string; @@ -105,6 +110,8 @@ export interface IDefaultStackOutput extends IStackOutput { vpcSecurityGroupIds: string[] | undefined; elasticsearchDomainArn: string | undefined; elasticsearchDomainEndpoint: string | undefined; + elasticsearchDynamodbTableHashKey: string; + elasticsearchDynamodbTableRangeKey: string; elasticsearchDynamodbTableArn: string | undefined; elasticsearchDynamodbTableName: string | undefined; appStorage: string; diff --git a/packages/cli/files/references.json b/packages/cli/files/references.json index 59efa888d67..646af9131fb 100644 --- a/packages/cli/files/references.json +++ b/packages/cli/files/references.json @@ -1 +1 @@ -{"dependencies":[{"name":"@apollo/react-common","version":"3.1.4","files":["/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"@apollo/react-components","version":"3.1.5","files":["/packages/app-admin/package.json","/packages/app-file-manager/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json"]},{"name":"@apollo/react-hooks","version":"3.1.5","files":["/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n/package.json","/packages/app-page-builder/package.json","/packages/app-record-locking/package.json","/packages/app-security-access-management/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/cwp-template-aws/template/common/extensions/theme/package.json","/extensions/theme/package.json"]},{"name":"@auth0/auth0-react","version":"2.2.4","files":["/packages/app-admin-auth0/package.json"]},{"name":"@aws-amplify/auth","version":"5.6.15","files":["/packages/app-admin-cognito/package.json","/packages/app-cognito-authenticator/package.json"]},{"name":"@aws-sdk/client-apigatewaymanagementapi","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-cloudfront","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-cloudwatch-events","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-cloudwatch-logs","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-cognito-identity-provider","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-dynamodb","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-dynamodb-streams","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-eventbridge","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-iam","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-iot","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-lambda","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-s3","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-sfn","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-sqs","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-sts","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/credential-providers","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/lib-dynamodb","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/lib-storage","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/s3-presigned-post","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/s3-request-presigner","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/util-dynamodb","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@babel/cli","version":"7.27.2","files":["/packages/project-utils/package.json"]},{"name":"@babel/code-frame","version":"7.27.1","files":["/packages/api-headless-cms/package.json"]},{"name":"@babel/core","version":"7.27.4","files":["/packages/project-utils/package.json"]},{"name":"@babel/plugin-proposal-class-properties","version":"7.18.6","files":["/packages/project-utils/package.json"]},{"name":"@babel/plugin-proposal-object-rest-spread","version":"7.20.7","files":["/packages/project-utils/package.json"]},{"name":"@babel/plugin-proposal-throw-expressions","version":"7.27.1","files":["/packages/project-utils/package.json"]},{"name":"@babel/plugin-syntax-object-rest-spread","version":"7.8.3","files":["/packages/project-utils/package.json"]},{"name":"@babel/preset-env","version":"7.27.2","files":["/packages/project-utils/package.json"]},{"name":"@babel/preset-react","version":"7.27.1","files":["/packages/project-utils/package.json"]},{"name":"@babel/preset-typescript","version":"7.27.1","files":["/packages/project-utils/package.json"]},{"name":"@babel/runtime","version":"7.27.4","files":["/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-extensions/package.json","/packages/project-utils/package.json"]},{"name":"@dnd-kit/core","version":"6.1.0","files":["/packages/app-form-builder/package.json"]},{"name":"@dnd-kit/sortable","version":"8.0.0","files":["/packages/app-form-builder/package.json"]},{"name":"@dnd-kit/utilities","version":"3.2.2","files":["/packages/app-form-builder/package.json"]},{"name":"@editorjs/delimiter","version":"1.4.2","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/apps/admin/package.json"]},{"name":"@editorjs/editorjs","version":"2.26.5","files":["/packages/app-admin/package.json","/packages/app-form-builder/package.json","/packages/react-rich-text-renderer/package.json","/packages/ui/package.json"]},{"name":"@editorjs/list","version":"1.10.0","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/apps/admin/package.json"]},{"name":"@editorjs/quote","version":"2.7.2","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/apps/admin/package.json"]},{"name":"@editorjs/underline","version":"1.2.1","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/apps/admin/package.json"]},{"name":"@elastic/elasticsearch","version":"7.12.0","files":["/packages/api-elasticsearch/package.json","/packages/api-form-builder-so-ddb-es/package.json","/packages/data-migration/package.json","/packages/migrations/package.json"]},{"name":"@emotion/cache","version":"11.10.5","files":["/packages/app-website/package.json"]},{"name":"@emotion/is-prop-valid","version":"1.1.1","files":["/packages/app-apw/package.json"]},{"name":"@emotion/react","version":"11.10.8","files":["/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-page-builder-elements/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/packages/cwp-template-aws/template/common/extensions/theme/package.json","/packages/lexical-editor/package.json","/packages/lexical-theme/package.json","/packages/theme/package.json","/packages/ui/package.json","/apps/website/package.json","/extensions/theme/package.json"]},{"name":"@emotion/styled","version":"11.10.6","files":["/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-page-builder/package.json","/packages/app-page-builder-elements/package.json","/packages/app-record-locking/package.json","/packages/app-security-access-management/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-trash-bin/package.json","/packages/app-website/package.json","/packages/cwp-template-aws/template/common/extensions/theme/package.json","/packages/lexical-editor-actions/package.json","/packages/lexical-editor-pb-element/package.json","/packages/ui/package.json","/extensions/theme/package.json"]},{"name":"@fastify/aws-lambda","version":"4.1.0","files":["/packages/handler-aws/package.json"]},{"name":"@fastify/compress","version":"7.0.3","files":["/packages/handler/package.json"]},{"name":"@fastify/cookie","version":"9.4.0","files":["/packages/handler/package.json"]},{"name":"@fortawesome/fontawesome-common-types","version":"0.3.0","files":["/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"@fortawesome/fontawesome-svg-core","version":"1.3.0","files":["/packages/app-dynamic-pages/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-page-builder/package.json"]},{"name":"@fortawesome/free-brands-svg-icons","version":"6.0.0","files":["/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"@fortawesome/free-regular-svg-icons","version":"6.0.0","files":["/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"@fortawesome/free-solid-svg-icons","version":"6.0.0","files":["/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"@fortawesome/react-fontawesome","version":"0.1.17","files":["/packages/app-dynamic-pages/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"@graphql-tools/merge","version":"9.0.24","files":["/packages/api-headless-cms/package.json","/packages/handler-graphql/package.json"]},{"name":"@graphql-tools/resolvers-composition","version":"7.0.18","files":["/packages/handler-graphql/package.json"]},{"name":"@graphql-tools/schema","version":"10.0.23","files":["/packages/api-headless-cms/package.json","/packages/handler-graphql/package.json"]},{"name":"@graphql-tools/utils","version":"10.8.6","files":["/packages/handler-graphql/package.json"]},{"name":"@iconify/json","version":"2.2.142","files":["/packages/app-admin/package.json"]},{"name":"@lexical/code","version":"0.23.1","files":["/packages/lexical-editor/package.json","/packages/lexical-nodes/package.json"]},{"name":"@lexical/hashtag","version":"0.23.1","files":["/packages/lexical-nodes/package.json"]},{"name":"@lexical/headless","version":"0.23.1","files":["/packages/lexical-converter/package.json"]},{"name":"@lexical/history","version":"0.23.1","files":["/packages/lexical-editor/package.json","/packages/lexical-nodes/package.json"]},{"name":"@lexical/html","version":"0.23.1","files":["/packages/lexical-converter/package.json"]},{"name":"@lexical/list","version":"0.23.1","files":["/packages/lexical-nodes/package.json"]},{"name":"@lexical/mark","version":"0.23.1","files":["/packages/lexical-nodes/package.json"]},{"name":"@lexical/overflow","version":"0.23.1","files":["/packages/lexical-nodes/package.json"]},{"name":"@lexical/react","version":"0.23.1","files":["/packages/lexical-editor/package.json","/packages/lexical-nodes/package.json"]},{"name":"@lexical/rich-text","version":"0.23.1","files":["/packages/lexical-editor/package.json","/packages/lexical-nodes/package.json"]},{"name":"@lexical/selection","version":"0.23.1","files":["/packages/lexical-editor/package.json","/packages/lexical-editor-actions/package.json","/packages/lexical-nodes/package.json"]},{"name":"@lexical/text","version":"0.23.1","files":["/packages/lexical-editor/package.json"]},{"name":"@lexical/utils","version":"0.23.1","files":["/packages/app-headless-cms/package.json","/packages/lexical-editor/package.json","/packages/lexical-editor-pb-element/package.json","/packages/lexical-nodes/package.json"]},{"name":"@material-design-icons/svg","version":"0.14.13","files":["/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-rmwc/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json","/packages/app-record-locking/package.json","/packages/app-security-access-management/package.json","/packages/app-trash-bin/package.json","/packages/lexical-editor-pb-element/package.json","/packages/ui/package.json"]},{"name":"@material-symbols/svg-400","version":"0.4.1","files":["/packages/app-aco/package.json","/packages/app-form-builder/package.json"]},{"name":"@minoru/react-dnd-treeview","version":"3.2.1","files":["/packages/app-aco/package.json"]},{"name":"@monaco-editor/react","version":"4.7.0","files":["/packages/app-admin/package.json"]},{"name":"@okta/okta-auth-js","version":"5.3.1","files":["/packages/app-admin-okta/package.json"]},{"name":"@okta/okta-react","version":"6.1.0","files":["/packages/app-admin-okta/package.json"]},{"name":"@okta/okta-signin-widget","version":"5.9.4","files":["/packages/app-admin-okta/package.json"]},{"name":"@pmmmwh/react-refresh-webpack-plugin","version":"0.5.15","files":["/packages/project-utils/package.json"]},{"name":"@pulumi/aws","version":"6.67.0","files":["/packages/pulumi-aws/package.json","/packages/pulumi-sdk/package.json","/packages/serverless-cms-aws/package.json"]},{"name":"@pulumi/pulumi","version":"3.147.0","files":["/packages/pulumi/package.json","/packages/pulumi-aws/package.json","/packages/pulumi-sdk/package.json","/packages/serverless-cms-aws/package.json"]},{"name":"@pulumi/random","version":"4.17.0","files":["/packages/pulumi-aws/package.json"]},{"name":"@rmwc/base","version":"14.3.5","files":["/packages/app-admin-rmwc/package.json"]},{"name":"@rmwc/button","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/checkbox","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/chip","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/data-table","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/dialog","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/drawer","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/elevation","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/fab","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/grid","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/icon-button","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/list","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/menu","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/provider","version":"14.3.5","files":["/packages/app-admin-rmwc/package.json"]},{"name":"@rmwc/radio","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/ripple","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/select","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/slider","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/snackbar","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/switch","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/tabs","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/textfield","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/top-app-bar","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/touch-target","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/typography","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rspack/core","version":"1.3.13","files":["/packages/project-utils/package.json"]},{"name":"@rspack/dev-server","version":"1.1.3","files":["/packages/project-utils/package.json"]},{"name":"@rspack/plugin-react-refresh","version":"1.4.3","files":["/packages/project-utils/package.json"]},{"name":"@smithy/node-http-handler","version":"2.1.6","files":["/packages/api-headless-cms-import-export/package.json","/packages/api-page-builder-import-export/package.json"]},{"name":"@sparticuz/chromium","version":"131.0.1","files":["/packages/api-prerendering-service/package.json"]},{"name":"@svgr/webpack","version":"6.1.1","files":["/packages/app-admin/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json","/packages/project-utils/package.json","/packages/ui/package.json"]},{"name":"@swc/plugin-emotion","version":"9.0.4","files":["/packages/project-utils/package.json"]},{"name":"@tanstack/react-table","version":"8.5.22","files":["/packages/ui/package.json"]},{"name":"@types/aws-lambda","version":"8.10.145","files":["/packages/aws-helpers/package.json","/packages/aws-sdk/package.json"]},{"name":"@types/hoist-non-react-statics","version":"3.3.5","files":["/package.json"]},{"name":"@types/medium-editor","version":"5.0.3","files":["/packages/app-page-builder/package.json"]},{"name":"@types/mime","version":"2.0.3","files":["/packages/app-admin/package.json"]},{"name":"@types/prismjs","version":"1.26.4","files":["/packages/lexical-nodes/package.json"]},{"name":"@types/react","version":"18.2.79","files":["/packages/app/package.json","/packages/app-admin/package.json","/packages/app-admin-rmwc/package.json","/packages/app-apw/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n/package.json","/packages/app-page-builder/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/packages/react-composition/package.json","/packages/react-properties/package.json","/packages/react-rich-text-lexical-renderer/package.json","/packages/react-rich-text-renderer/package.json","/apps/admin/package.json","/apps/website/package.json"]},{"name":"@types/webpack-env","version":"1.18.5","files":["/packages/project-utils/package.json"]},{"name":"accept-language-parser","version":"1.5.0","files":["/packages/api-i18n/package.json"]},{"name":"accounting","version":"0.4.1","files":["/packages/i18n/package.json"]},{"name":"aos","version":"2.3.4","files":["/packages/app-page-builder/package.json"]},{"name":"apollo-cache","version":"1.3.5","files":["/packages/app/package.json","/packages/app-admin/package.json","/packages/app-apw/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-wcp/package.json"]},{"name":"apollo-cache-inmemory","version":"1.6.6","files":["/packages/app/package.json"]},{"name":"apollo-client","version":"2.6.10","files":["/packages/app/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-record-locking/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/packages/react-router/package.json","/apps/website/package.json"]},{"name":"apollo-link","version":"1.2.14","files":["/packages/app/package.json","/packages/app-admin/package.json","/packages/app-apw/package.json","/packages/app-file-manager/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-record-locking/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/apps/website/package.json"]},{"name":"apollo-link-batch-http","version":"1.2.14","files":["/packages/app-serverless-cms/package.json","/packages/app-website/package.json"]},{"name":"apollo-link-context","version":"1.0.20","files":["/packages/app/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-graphql-playground/package.json","/packages/app-i18n/package.json"]},{"name":"apollo-link-error","version":"1.1.13","files":["/packages/app/package.json"]},{"name":"apollo-link-http-common","version":"0.2.16","files":["/packages/app/package.json"]},{"name":"apollo-utilities","version":"1.3.4","files":["/packages/app/package.json","/packages/app-admin/package.json","/packages/app-apw/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-wcp/package.json"]},{"name":"archiver","version":"7.0.1","files":["/packages/api-headless-cms-import-export/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json"]},{"name":"archy","version":"1.0.0","files":["/packages/cli-plugin-workspaces/package.json"]},{"name":"assert-browserify","version":"2.0.0","files":["/packages/project-utils/package.json"]},{"name":"babel-loader","version":"9.2.1","files":["/packages/project-utils/package.json"]},{"name":"boolean","version":"3.2.0","files":["/packages/app/package.json","/packages/cli/package.json","/packages/handler-graphql/package.json"]},{"name":"brace","version":"0.11.1","files":["/packages/ui/package.json"]},{"name":"buffer","version":"6.0.3","files":["/packages/project-utils/package.json"]},{"name":"bufferutil","version":"4.0.1","files":["/packages/project-utils/package.json"]},{"name":"bytes","version":"3.1.2","files":["/packages/api-headless-cms-import-export/package.json","/packages/app/package.json","/packages/app-file-manager/package.json"]},{"name":"cache-control-parser","version":"2.0.6","files":["/packages/api-file-manager/package.json"]},{"name":"camelcase","version":"6.3.0","files":["/packages/cli/package.json","/packages/project-utils/package.json"]},{"name":"case","version":"1.6.3","files":["/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json"]},{"name":"case-sensitive-paths-webpack-plugin","version":"2.4.0","files":["/packages/project-utils/package.json"]},{"name":"center-align","version":"1.0.1","files":["/packages/data-migration/package.json"]},{"name":"chalk","version":"4.1.2","files":["/packages/aws-layers/package.json","/packages/cli/package.json","/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-workspaces/package.json","/packages/create-webiny-project/package.json","/packages/cwp-template-aws/package.json","/packages/data-migration/package.json","/packages/project-utils/package.json","/packages/serverless-cms-aws/package.json","/packages/system-requirements/package.json","/scripts/buildPackages/package.json","/scripts/prepublishOnly/package.json"]},{"name":"cheerio","version":"1.0.0-rc.10","files":["/packages/aws-helpers/package.json"]},{"name":"ci-info","version":"4.1.0","files":["/packages/cli/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cwp-template-aws/package.json","/packages/project-utils/package.json","/packages/telemetry/package.json"]},{"name":"classnames","version":"2.5.1","files":["/packages/app-admin/package.json","/packages/app-admin-rmwc/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-page-builder/package.json","/packages/react-rich-text-renderer/package.json","/packages/ui/package.json"]},{"name":"cli-table3","version":"0.6.5","files":["/packages/system-requirements/package.json"]},{"name":"color","version":"4.2.3","files":["/packages/cli-plugin-workspaces/package.json"]},{"name":"core-js","version":"3.39.0","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/apps/admin/package.json","/apps/website/package.json"]},{"name":"cropperjs","version":"1.4.3","files":["/packages/ui/package.json"]},{"name":"cross-fetch","version":"3.1.5","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/apps/admin/package.json","/apps/website/package.json"]},{"name":"crypto-browserify","version":"3.12.0","files":["/packages/project-utils/package.json"]},{"name":"crypto-hash","version":"3.0.0","files":["/packages/app-record-locking/package.json"]},{"name":"crypto-js","version":"4.2.0","files":["/packages/api-mailer/package.json"]},{"name":"css-loader","version":"6.10.0","files":["/packages/project-utils/package.json"]},{"name":"css-minimizer-webpack-plugin","version":"7.0.0","files":["/packages/project-utils/package.json"]},{"name":"dataloader","version":"2.2.2","files":["/packages/api-admin-users/package.json","/packages/api-headless-cms-ddb/package.json","/packages/api-headless-cms-ddb-es/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-so-ddb/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/api-tenancy/package.json"]},{"name":"dataurl-to-blob","version":"0.0.1","files":["/packages/app-file-manager/package.json"]},{"name":"date-fns","version":"2.22.1","files":["/packages/api-form-builder/package.json","/packages/app-audit-logs/package.json","/packages/db-dynamodb/package.json"]},{"name":"dayjs","version":"1.11.13","files":["/packages/api-apw/package.json","/packages/app-apw/package.json","/packages/app-file-manager/package.json"]},{"name":"decompress","version":"4.2.1","files":["/packages/pulumi-sdk/package.json"]},{"name":"deep-equal","version":"2.2.3","files":["/packages/api-security/package.json","/packages/api-security-cognito/package.json","/packages/tasks/package.json"]},{"name":"dnd-core","version":"16.0.1","files":["/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-page-builder/package.json"]},{"name":"dnd-kit-sortable-tree","version":"0.1.73","files":["/packages/app-page-builder/package.json"]},{"name":"dot-prop","version":"6.0.1","files":["/packages/api-headless-cms/package.json","/packages/api-headless-cms-ddb/package.json","/packages/db-dynamodb/package.json"]},{"name":"dot-prop-immutable","version":"2.1.1","files":["/packages/api-page-builder-import-export/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-apw/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/ui/package.json"]},{"name":"dotenv","version":"8.2.0","files":["/packages/cli/package.json"]},{"name":"downshift","version":"3.1.2","files":["/packages/app-admin/package.json"]},{"name":"downshift","version":"2.1.5","files":["/packages/ui/package.json"]},{"name":"dynamodb-toolbox","version":"0.9.2","files":["/packages/db-dynamodb/package.json"]},{"name":"elastic-ts","version":"0.12.0","files":["/packages/api-elasticsearch/package.json","/packages/api-form-builder-so-ddb-es/package.json","/packages/api-page-builder-so-ddb-es/package.json"]},{"name":"emotion","version":"10.0.27","files":["/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n-content/package.json","/packages/app-page-builder/package.json","/packages/app-security-access-management/package.json","/packages/app-tenant-manager/package.json","/packages/lexical-editor/package.json","/packages/lexical-editor-actions/package.json","/packages/lexical-theme/package.json","/packages/ui/package.json"]},{"name":"eslint","version":"8.57.1","files":["/packages/project-utils/package.json"]},{"name":"eslint-config-react-app","version":"6.0.0","files":["/packages/project-utils/package.json"]},{"name":"eslint-webpack-plugin","version":"4.2.0","files":["/packages/project-utils/package.json"]},{"name":"execa","version":"5.1.1","files":["/packages/cli/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json","/packages/cli-plugin-workspaces/package.json","/packages/create-webiny-project/package.json","/packages/cwp-template-aws/package.json","/packages/pulumi-sdk/package.json","/packages/system-requirements/package.json","/scripts/buildPackages/package.json"]},{"name":"exit-hook","version":"4.0.0","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"extract-zip","version":"1.6.7","files":["/packages/api-page-builder/package.json"]},{"name":"facepaint","version":"1.2.1","files":["/packages/app-page-builder-elements/package.json"]},{"name":"fast-glob","version":"3.2.7","files":["/packages/cli/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-extensions/package.json","/packages/cwp-template-aws/package.json","/packages/serverless-cms-aws/package.json"]},{"name":"fastify","version":"4.29.1","files":["/packages/handler/package.json","/packages/handler-aws/package.json"]},{"name":"fecha","version":"2.3.3","files":["/packages/i18n/package.json"]},{"name":"file-loader","version":"6.2.0","files":["/packages/project-utils/package.json"]},{"name":"find-up","version":"5.0.0","files":["/packages/cli/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/create-webiny-project/package.json","/packages/pulumi/package.json","/packages/serverless-cms-aws/package.json","/scripts/prepublishOnly/package.json"]},{"name":"folder-hash","version":"4.0.4","files":["/scripts/buildPackages/package.json"]},{"name":"fork-ts-checker-webpack-plugin","version":"9.0.2","files":["/packages/project-utils/package.json"]},{"name":"form-data","version":"4.0.0","files":["/packages/api-file-manager-s3/package.json","/packages/pulumi-aws/package.json"]},{"name":"fs-extra","version":"11.2.0","files":["/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/cli/package.json","/packages/create-webiny-project/package.json","/packages/cwp-template-aws/package.json","/packages/project-utils/package.json","/packages/pulumi-sdk/package.json","/scripts/buildPackages/package.json","/scripts/prepublishOnly/package.json"]},{"name":"fuse.js","version":"7.0.0","files":["/packages/db-dynamodb/package.json"]},{"name":"get-yarn-workspaces","version":"1.0.2","files":["/packages/cli-plugin-dependencies/package.json","/packages/cwp-template-aws/package.json","/packages/project-utils/package.json","/scripts/prepublishOnly/package.json"]},{"name":"glob","version":"7.2.3","files":["/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-extensions/package.json","/packages/project-utils/package.json"]},{"name":"graphlib","version":"2.1.8","files":["/packages/app-admin/package.json","/packages/cli-plugin-workspaces/package.json"]},{"name":"graphql","version":"15.9.0","files":["/packages/api-headless-cms/package.json","/packages/api-i18n-content/package.json","/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-trash-bin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/packages/cwp-template-aws/template/common/extensions/theme/package.json","/packages/handler-graphql/package.json","/packages/react-router/package.json","/apps/website/package.json","/extensions/theme/package.json"]},{"name":"graphql-request","version":"3.7.0","files":["/packages/cli/package.json"]},{"name":"graphql-scalars","version":"1.12.0","files":["/packages/handler-graphql/package.json"]},{"name":"graphql-tag","version":"2.12.6","files":["/packages/api-headless-cms/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-file-manager/package.json","/packages/app-file-manager-s3/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-record-locking/package.json","/packages/app-security-access-management/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/handler-graphql/package.json"]},{"name":"history","version":"5.3.0","files":["/packages/app-form-builder/package.json","/packages/app-page-builder/package.json","/packages/react-router/package.json"]},{"name":"html-webpack-plugin","version":"5.6.3","files":["/packages/project-utils/package.json"]},{"name":"humanize-duration","version":"3.32.1","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"i18n-locales","version":"0.0.5","files":["/packages/api-i18n/package.json"]},{"name":"indent-string","version":"5.0.0","files":["/packages/cli-plugin-scaffold-react-component/package.json"]},{"name":"inquirer","version":"8.2.6","files":["/packages/cli/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cwp-template-aws/package.json"]},{"name":"invariant","version":"2.2.4","files":["/packages/app/package.json","/packages/app-page-builder/package.json","/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/serverless-cms-aws/package.json"]},{"name":"inversify","version":"6.1.6","files":["/packages/ioc/package.json"]},{"name":"is-hotkey","version":"0.2.0","files":["/packages/app-admin/package.json","/packages/app-page-builder/package.json"]},{"name":"isnumeric","version":"0.3.3","files":["/packages/validation/package.json"]},{"name":"js-base64","version":"3.7.7","files":["/packages/cli-plugin-scaffold-ci/package.json"]},{"name":"js-yaml","version":"3.14.1","files":["/packages/create-webiny-project/package.json"]},{"name":"jsdom","version":"25.0.1","files":["/packages/api-headless-cms/package.json"]},{"name":"jsesc","version":"3.0.2","files":["/packages/telemetry/package.json"]},{"name":"json2csv","version":"4.5.4","files":["/packages/api-form-builder/package.json","/packages/app-form-builder/package.json"]},{"name":"jsonpack","version":"1.1.5","files":["/packages/api-page-builder/package.json","/packages/utils/package.json"]},{"name":"jsonwebtoken","version":"9.0.1","files":["/packages/api-cognito-authenticator/package.json","/packages/api-security/package.json","/packages/api-security-auth0/package.json","/packages/api-security-okta/package.json"]},{"name":"jwk-to-pem","version":"2.0.1","files":["/packages/api-cognito-authenticator/package.json","/packages/api-security-auth0/package.json","/packages/api-security-okta/package.json"]},{"name":"keycode","version":"2.2.0","files":["/packages/ui/package.json"]},{"name":"lexical","version":"0.23.1","files":["/packages/lexical-converter/package.json","/packages/lexical-editor/package.json","/packages/lexical-nodes/package.json","/packages/lexical-theme/package.json"]},{"name":"listr","version":"0.14.3","files":["/packages/cli-plugin-deploy-pulumi/package.json","/packages/create-webiny-project/package.json"]},{"name":"listr2","version":"5.0.8","files":["/scripts/buildPackages/package.json"]},{"name":"load-json-file","version":"6.2.0","files":["/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json","/packages/create-webiny-project/package.json","/packages/cwp-template-aws/package.json","/packages/global-config/package.json","/scripts/buildPackages/package.json","/scripts/prepublishOnly/package.json"]},{"name":"load-script","version":"1.0.0","files":["/packages/app-graphql-playground/package.json","/packages/ui/package.json"]},{"name":"lodash","version":"4.17.21","files":["/packages/api-aco/package.json","/packages/api-admin-users/package.json","/packages/api-apw/package.json","/packages/api-file-manager/package.json","/packages/api-form-builder/package.json","/packages/api-headless-cms/package.json","/packages/api-headless-cms-ddb/package.json","/packages/api-headless-cms-ddb-es/package.json","/packages/api-mailer/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-aco/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/api-prerendering-service/package.json","/packages/api-prerendering-service-aws/package.json","/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-cognito-authenticator/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-page-builder/package.json","/packages/app-page-builder-elements/package.json","/packages/app-security-access-management/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-trash-bin/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cwp-template-aws/package.json","/packages/db-dynamodb/package.json","/packages/form/package.json","/packages/i18n/package.json","/packages/i18n-react/package.json","/packages/migrations/package.json","/packages/project-utils/package.json","/packages/pulumi/package.json","/packages/pulumi-aws/package.json","/packages/pulumi-sdk/package.json","/packages/tasks/package.json","/packages/ui/package.json","/packages/validation/package.json","/scripts/prepublishOnly/package.json"]},{"name":"log-update","version":"4.0.0","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"lz-string","version":"1.5.0","files":["/packages/app-website/package.json"]},{"name":"material-components-web","version":"14.0.0","files":["/packages/ui/package.json"]},{"name":"md5","version":"2.3.0","files":["/packages/api-admin-users/package.json"]},{"name":"mdbid","version":"1.0.0","files":["/packages/utils/package.json"]},{"name":"medium-editor","version":"5.23.3","files":["/packages/app-page-builder/package.json"]},{"name":"mime","version":"3.0.0","files":["/packages/api-file-manager-s3/package.json","/packages/app-file-manager/package.json","/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"mini-css-extract-plugin","version":"2.4.5","files":["/packages/project-utils/package.json"]},{"name":"minimatch","version":"5.1.6","files":["/packages/api-security/package.json","/packages/app/package.json","/packages/app-file-manager/package.json","/packages/app-security/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/data-migration/package.json"]},{"name":"mobx","version":"6.9.0","files":["/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json","/packages/app-trash-bin/package.json","/packages/app-utils/package.json"]},{"name":"mobx-react-lite","version":"3.4.3","files":["/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-file-manager/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json","/packages/app-trash-bin/package.json"]},{"name":"mqtt","version":"5.10.3","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"multimatch","version":"5.0.0","files":["/packages/cli-plugin-workspaces/package.json"]},{"name":"nanoid","version":"3.3.8","files":["/packages/app/package.json","/packages/app-page-builder/package.json","/packages/react-properties/package.json","/packages/utils/package.json"]},{"name":"nanoid-dictionary","version":"4.3.0","files":["/packages/utils/package.json"]},{"name":"ncp","version":"2.0.0","files":["/packages/cli/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json"]},{"name":"node-fetch","version":"2.6.7","files":["/packages/api-cognito-authenticator/package.json","/packages/api-file-manager-s3/package.json","/packages/api-form-builder/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-security-auth0/package.json","/packages/api-security-okta/package.json","/packages/api-wcp/package.json","/packages/create-webiny-project/package.json","/packages/pulumi-aws/package.json","/packages/pulumi-sdk/package.json","/packages/serverless-cms-aws/package.json","/packages/wcp/package.json"]},{"name":"node-notifier","version":"10.0.1","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"nodemailer","version":"6.9.16","files":["/packages/api-mailer/package.json"]},{"name":"nprogress","version":"0.2.0","files":["/packages/ui/package.json"]},{"name":"nuka-carousel","version":"4.7.1","files":["/packages/ui/package.json"]},{"name":"null-loader","version":"4.0.1","files":["/packages/project-utils/package.json"]},{"name":"object-hash","version":"3.0.0","files":["/packages/api-file-manager/package.json","/packages/api-file-manager-s3/package.json","/packages/api-prerendering-service/package.json"]},{"name":"object-merge-advanced","version":"12.1.0","files":["/packages/tasks/package.json"]},{"name":"object-sizeof","version":"2.6.4","files":["/packages/tasks/package.json"]},{"name":"octokit","version":"3.1.2","files":["/packages/cli-plugin-scaffold-ci/package.json"]},{"name":"open","version":"8.4.2","files":["/packages/cli/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cwp-template-aws/package.json"]},{"name":"ora","version":"4.1.1","files":["/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cwp-template-aws/package.json","/packages/serverless-cms-aws/package.json"]},{"name":"os","version":"0.1.1","files":["/packages/create-webiny-project/package.json"]},{"name":"os-browserify","version":"0.3.0","files":["/packages/project-utils/package.json"]},{"name":"p-map","version":"4.0.0","files":["/packages/api-file-manager-s3/package.json","/packages/api-headless-cms/package.json","/packages/cli-plugin-workspaces/package.json"]},{"name":"p-reduce","version":"2.1.0","files":["/packages/api-file-manager-s3/package.json","/packages/api-headless-cms/package.json"]},{"name":"p-retry","version":"4.6.2","files":["/packages/api-dynamodb-to-elasticsearch/package.json","/packages/app-file-manager-s3/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/create-webiny-project/package.json","/packages/utils/package.json"]},{"name":"p-wait-for","version":"4.1.0","files":["/packages/ui-composer/package.json"]},{"name":"pako","version":"2.1.0","files":["/packages/app-aco/package.json","/packages/app-page-builder/package.json"]},{"name":"path-browserify","version":"1.0.1","files":["/packages/project-utils/package.json"]},{"name":"pino-pretty","version":"9.4.0","files":["/packages/data-migration/package.json"]},{"name":"pirates","version":"4.0.6","files":["/packages/cli/package.json"]},{"name":"platform","version":"1.3.5","files":["/packages/app-page-builder/package.json"]},{"name":"pluralize","version":"8.0.0","files":["/packages/api-headless-cms/package.json","/packages/api-prerendering-service/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json"]},{"name":"postcss-flexbugs-fixes","version":"5.0.2","files":["/packages/project-utils/package.json"]},{"name":"postcss-loader","version":"6.2.1","files":["/packages/project-utils/package.json"]},{"name":"postcss-normalize","version":"10.0.1","files":["/packages/project-utils/package.json"]},{"name":"postcss-preset-env","version":"9.4.0","files":["/packages/project-utils/package.json"]},{"name":"posthtml","version":"0.15.0","files":["/packages/api-prerendering-service/package.json"]},{"name":"posthtml-noopener","version":"1.0.5","files":["/packages/api-prerendering-service/package.json"]},{"name":"posthtml-plugin-link-preload","version":"1.0.0","files":["/packages/api-prerendering-service/package.json"]},{"name":"process","version":"0.11.10","files":["/packages/project-utils/package.json"]},{"name":"prop-types","version":"15.8.1","files":["/packages/app-admin/package.json","/packages/app-apw/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/cwp-template-aws/template/common/apps/admin/package.json","/apps/admin/package.json"]},{"name":"puppeteer-core","version":"23.11.1","files":["/packages/api-prerendering-service/package.json"]},{"name":"raw-loader","version":"4.0.2","files":["/packages/project-utils/package.json"]},{"name":"raw.macro","version":"0.4.2","files":["/packages/app-headless-cms/package.json"]},{"name":"rc-tooltip","version":"5.3.1","files":["/packages/ui/package.json"]},{"name":"react","version":"18.2.0","files":["/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-cognito-authenticator/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-i18n-content/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-plugin-admin-welcome-screen/package.json","/packages/app-record-locking/package.json","/packages/app-security/package.json","/packages/app-security-access-management/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-trash-bin/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/app-websockets/package.json","/packages/cli-plugin-extensions/templates/admin/package.json","/packages/cli-plugin-extensions/templates/pbElement/package.json","/packages/cli-plugin-extensions/templates/website/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json","/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/packages/cwp-template-aws/template/common/extensions/theme/package.json","/packages/lexical-editor/package.json","/packages/lexical-editor-actions/package.json","/packages/lexical-editor-pb-element/package.json","/packages/project-utils/package.json","/packages/react-composition/package.json","/packages/react-properties/package.json","/packages/react-rich-text-lexical-renderer/package.json","/packages/react-rich-text-renderer/package.json","/packages/react-router/package.json","/packages/ui-composer/package.json","/apps/admin/package.json","/apps/website/package.json","/extensions/theme/package.json"]},{"name":"react-ace","version":"6.1.4","files":["/packages/ui/package.json"]},{"name":"react-butterfiles","version":"1.3.3","files":["/packages/app-file-manager/package.json","/packages/app-headless-cms/package.json","/packages/ui/package.json"]},{"name":"react-color","version":"2.19.3","files":["/packages/app-page-builder/package.json","/packages/lexical-editor-actions/package.json","/packages/ui/package.json"]},{"name":"react-columned","version":"1.1.3","files":["/packages/ui/package.json"]},{"name":"react-custom-scrollbars","version":"4.2.1","files":["/packages/app-file-manager/package.json","/packages/app-headless-cms/package.json","/packages/ui/package.json"]},{"name":"react-dev-utils","version":"12.0.1","files":["/packages/project-utils/package.json"]},{"name":"react-dnd","version":"16.0.1","files":["/packages/app-aco/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"react-dnd-html5-backend","version":"16.0.1","files":["/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"react-dom","version":"18.2.0","files":["/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-cognito-authenticator/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n/package.json","/packages/app-i18n-content/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-plugin-admin-welcome-screen/package.json","/packages/app-record-locking/package.json","/packages/app-security/package.json","/packages/app-security-access-management/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-trash-bin/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/app-websockets/package.json","/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/packages/lexical-editor/package.json","/packages/lexical-editor-actions/package.json","/packages/lexical-editor-pb-element/package.json","/packages/project-utils/package.json","/packages/react-composition/package.json","/packages/react-router/package.json","/packages/ui-composer/package.json","/apps/admin/package.json","/apps/website/package.json"]},{"name":"react-draggable","version":"4.4.6","files":["/packages/app-admin/package.json"]},{"name":"react-google-recaptcha","version":"1.1.0","files":["/packages/app-form-builder/package.json"]},{"name":"react-hamburger-menu","version":"1.2.1","files":["/packages/cwp-template-aws/template/common/extensions/theme/package.json","/extensions/theme/package.json"]},{"name":"react-helmet","version":"6.1.0","files":["/packages/app-admin-auth0/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-headless-cms/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-security-access-management/package.json","/packages/app-website/package.json"]},{"name":"react-hotkeyz","version":"1.0.4","files":["/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-rmwc/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json"]},{"name":"react-images","version":"0.5.19","files":["/packages/app-page-builder/package.json"]},{"name":"react-in-viewport","version":"1.0.0-alpha.30","files":["/packages/app-page-builder/package.json"]},{"name":"react-lazy-load","version":"3.1.14","files":["/packages/app-file-manager/package.json"]},{"name":"react-loading-skeleton","version":"3.1.0","files":["/packages/ui/package.json"]},{"name":"react-refresh","version":"0.11.0","files":["/packages/project-utils/package.json"]},{"name":"react-resizable","version":"3.0.5","files":["/packages/app-admin/package.json"]},{"name":"react-resizable-panels","version":"2.0.19","files":["/packages/app-admin/package.json"]},{"name":"react-router-dom","version":"6.3.0","files":["/packages/react-router/package.json"]},{"name":"react-sortable","version":"2.0.0","files":["/packages/app-page-builder/package.json"]},{"name":"react-spinner-material","version":"1.1.4","files":["/packages/app-apw/package.json","/packages/ui/package.json"]},{"name":"react-style-object-to-css","version":"1.1.2","files":["/packages/lexical-theme/package.json"]},{"name":"react-transition-group","version":"4.4.5","files":["/packages/app-admin/package.json","/packages/app-admin-rmwc/package.json","/packages/ui/package.json"]},{"name":"react-virtualized","version":"9.22.5","files":["/packages/app-admin/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"read-json-sync","version":"2.0.1","files":["/packages/project-utils/package.json"]},{"name":"recoil","version":"0.7.7","files":["/packages/app-page-builder/package.json"]},{"name":"reflect-metadata","version":"0.2.2","files":["/packages/di-container/package.json","/packages/ioc/package.json"]},{"name":"regenerator-runtime","version":"0.13.11","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/apps/admin/package.json","/apps/website/package.json"]},{"name":"replace-in-path","version":"1.1.0","files":["/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json"]},{"name":"reset-css","version":"5.0.1","files":["/packages/app-admin/package.json","/packages/app-website/package.json"]},{"name":"resolve","version":"1.22.8","files":["/packages/project-utils/package.json"]},{"name":"resolve-url-loader","version":"5.0.0","files":["/packages/project-utils/package.json"]},{"name":"rimraf","version":"6.0.1","files":["/packages/create-webiny-project/package.json","/packages/project-utils/package.json"]},{"name":"sanitize-filename","version":"1.6.3","files":["/packages/api-file-manager-s3/package.json"]},{"name":"sanitize-html","version":"2.12.1","files":["/packages/react-rich-text-renderer/package.json"]},{"name":"sass","version":"1.44.0","files":["/packages/project-utils/package.json"]},{"name":"sass-loader","version":"12.3.0","files":["/packages/project-utils/package.json"]},{"name":"scheduler","version":"0.19.1","files":["/packages/project-utils/package.json"]},{"name":"semver","version":"7.6.3","files":["/packages/api-headless-cms/package.json","/packages/cli/package.json","/packages/cli-plugin-dependencies/package.json","/packages/create-webiny-project/package.json","/packages/data-migration/package.json","/packages/pulumi-sdk/package.json","/packages/system-requirements/package.json"]},{"name":"serialize-error","version":"8.0.0","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"sharp","version":"0.32.6","files":["/packages/api-file-manager-s3/package.json"]},{"name":"short-hash","version":"1.0.0","files":["/packages/i18n/package.json"]},{"name":"slugify","version":"1.6.6","files":["/packages/api-form-builder/package.json","/packages/api-headless-cms/package.json","/packages/app-aco/package.json","/packages/app-dynamic-pages/package.json","/packages/app-page-builder/package.json"]},{"name":"source-map-loader","version":"1.1.3","files":["/packages/project-utils/package.json"]},{"name":"source-map-support","version":"0.5.21","files":["/packages/project-utils/package.json"]},{"name":"srcset","version":"4.0.0","files":["/packages/api-prerendering-service/package.json","/packages/aws-helpers/package.json"]},{"name":"store","version":"2.0.12","files":["/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-rmwc/package.json","/packages/app-page-builder/package.json","/packages/app-tenancy/package.json"]},{"name":"stream","version":"0.0.3","files":["/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json"]},{"name":"strip-ansi","version":"6.0.1","files":["/packages/telemetry/package.json"]},{"name":"style-loader","version":"3.3.1","files":["/packages/project-utils/package.json"]},{"name":"swiper","version":"9.3.2","files":["/packages/app-page-builder/package.json"]},{"name":"tar","version":"6.2.1","files":["/packages/pulumi-sdk/package.json"]},{"name":"terminal-link","version":"2.1.1","files":["/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json"]},{"name":"terser-webpack-plugin","version":"5.3.10","files":["/packages/project-utils/package.json"]},{"name":"theme","version":"1.0.0","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/apps/admin/package.json","/apps/website/package.json"]},{"name":"timeago-react","version":"3.0.6","files":["/packages/ui/package.json"]},{"name":"ts-checker-rspack-plugin","version":"1.0.3","files":["/packages/project-utils/package.json"]},{"name":"ts-invariant","version":"0.10.3","files":["/packages/app/package.json"]},{"name":"ts-morph","version":"11.0.0","files":["/packages/cli/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json"]},{"name":"ts-patch","version":"3.3.0","files":["/packages/project-utils/package.json"]},{"name":"tslib","version":"2.8.1","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/apps/admin/package.json"]},{"name":"type-fest","version":"4.14.0","files":["/packages/api-websockets/package.json","/packages/db/package.json"]},{"name":"typescript","version":"5.3.3","files":["/packages/cli/package.json","/packages/project-utils/package.json"]},{"name":"unicode-emoji-json","version":"0.4.0","files":["/packages/app-admin/package.json"]},{"name":"uniqid","version":"5.4.0","files":["/packages/api-headless-cms-import-export/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/app-page-builder/package.json","/packages/cli/package.json","/packages/plugins/package.json"]},{"name":"unzipper","version":"0.12.3","files":["/packages/api-headless-cms-import-export/package.json"]},{"name":"url","version":"0.11.4","files":["/packages/project-utils/package.json"]},{"name":"url-loader","version":"4.1.1","files":["/packages/project-utils/package.json"]},{"name":"use-deep-compare-effect","version":"1.8.1","files":["/packages/app-headless-cms/package.json"]},{"name":"utf-8-validate","version":"5.0.2","files":["/packages/project-utils/package.json"]},{"name":"uuid","version":"9.0.1","files":["/packages/create-webiny-project/package.json","/packages/global-config/package.json"]},{"name":"validate-npm-package-name","version":"3.0.0","files":["/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json","/packages/create-webiny-project/package.json"]},{"name":"vm-browserify","version":"1.1.2","files":["/packages/project-utils/package.json"]},{"name":"warning","version":"4.0.2","files":["/packages/app/package.json"]},{"name":"webpack","version":"5.97.0","files":["/packages/project-utils/package.json","/packages/serverless-cms-aws/package.json"]},{"name":"webpack-dev-server","version":"4.15.2","files":["/packages/project-utils/package.json"]},{"name":"webpack-manifest-plugin","version":"5.0.0","files":["/packages/project-utils/package.json"]},{"name":"webpackbar","version":"7.0.0","files":["/packages/project-utils/package.json"]},{"name":"write-json-file","version":"4.3.0","files":["/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json","/packages/create-webiny-project/package.json","/packages/cwp-template-aws/package.json","/packages/global-config/package.json","/scripts/buildPackages/package.json","/scripts/prepublishOnly/package.json"]},{"name":"wts-client","version":"1.0.1","files":["/packages/telemetry/package.json"]},{"name":"yargs","version":"17.7.2","files":["/packages/cli/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/create-webiny-project/package.json","/packages/i18n/package.json","/scripts/buildPackages/package.json"]},{"name":"yauzl","version":"2.10.0","files":["/packages/api-page-builder-import-export/package.json"]},{"name":"yesno","version":"0.4.0","files":["/packages/create-webiny-project/package.json"]},{"name":"zod","version":"3.23.8","files":["/packages/api-admin-users/package.json","/packages/api-apw/package.json","/packages/api-file-manager/package.json","/packages/api-form-builder/package.json","/packages/api-headless-cms/package.json","/packages/api-headless-cms-import-export/package.json","/packages/api-headless-cms-tasks/package.json","/packages/api-log/package.json","/packages/api-mailer/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-security/package.json","/packages/api-websockets/package.json","/packages/app-aco/package.json","/packages/app-file-manager/package.json","/packages/pulumi-aws/package.json","/packages/tasks/package.json"]}],"devDependencies":[{"name":"@4tw/cypress-drag-drop","version":"1.4.0","files":["/cypress-tests/package.json"]},{"name":"@babel/cli","version":"7.27.2","files":["/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@babel/code-frame","version":"7.27.1","files":["/package.json"]},{"name":"@babel/compat-data","version":"7.27.5","files":["/package.json"]},{"name":"@babel/core","version":"7.27.4","files":["/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@babel/helper-define-polyfill-provider","version":"0.6.4","files":["/package.json"]},{"name":"@babel/helper-environment-visitor","version":"7.24.7","files":["/package.json"]},{"name":"@babel/parser","version":"7.27.5","files":["/package.json"]},{"name":"@babel/plugin-proposal-class-properties","version":"7.18.6","files":["/package.json"]},{"name":"@babel/plugin-proposal-object-rest-spread","version":"7.20.7","files":["/package.json"]},{"name":"@babel/plugin-proposal-throw-expressions","version":"7.27.1","files":["/package.json"]},{"name":"@babel/plugin-syntax-object-rest-spread","version":"7.8.3","files":["/package.json"]},{"name":"@babel/plugin-transform-modules-commonjs","version":"7.27.1","files":["/package.json"]},{"name":"@babel/plugin-transform-runtime","version":"7.27.4","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@babel/preset-env","version":"7.27.2","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@babel/preset-react","version":"7.27.1","files":["/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json"]},{"name":"@babel/preset-typescript","version":"7.27.1","files":["/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@babel/register","version":"7.27.1","files":["/package.json","/packages/i18n/package.json"]},{"name":"@babel/runtime","version":"7.27.4","files":["/package.json"]},{"name":"@babel/template","version":"7.27.2","files":["/package.json"]},{"name":"@babel/traverse","version":"7.27.4","files":["/package.json"]},{"name":"@babel/types","version":"7.27.3","files":["/package.json"]},{"name":"@commitlint/cli","version":"11.0.0","files":["/package.json"]},{"name":"@commitlint/config-conventional","version":"11.0.0","files":["/package.json"]},{"name":"@elastic/elasticsearch","version":"7.12.0","files":["/packages/api-headless-cms-ddb-es/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/project-utils/package.json"]},{"name":"@emotion/babel-plugin","version":"11.11.0","files":["/packages/app-admin/package.json","/packages/app-admin-rmwc/package.json","/packages/app-apw/package.json","/packages/app-dynamic-pages/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-i18n-content/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-security/package.json","/packages/app-security-access-management/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme/package.json","/packages/app-theme-manager/package.json","/packages/theme/package.json","/packages/ui/package.json"]},{"name":"@emotion/react","version":"11.10.8","files":["/packages/react-rich-text-lexical-renderer/package.json"]},{"name":"@faker-js/faker","version":"9.3.0","files":["/packages/api-headless-cms-es-tasks/package.json"]},{"name":"@grpc/grpc-js","version":"1.11.1","files":["/package.json"]},{"name":"@lexical/code","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/hashtag","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/headless","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/history","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/html","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/list","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/mark","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/overflow","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/react","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/rich-text","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/selection","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/text","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/utils","version":"0.23.1","files":["/package.json"]},{"name":"@material-design-icons/svg","version":"0.14.13","files":["/packages/app-audit-logs/package.json"]},{"name":"@material-symbols/svg-400","version":"0.4.1","files":["/packages/app-audit-logs/package.json"]},{"name":"@octokit/rest","version":"20.0.2","files":["/package.json"]},{"name":"@svgr/webpack","version":"6.1.1","files":["/packages/app-file-manager/package.json"]},{"name":"@testing-library/cypress","version":"10.0.0","files":["/cypress-tests/package.json"]},{"name":"@testing-library/react","version":"15.0.7","files":["/packages/form/package.json","/packages/react-composition/package.json","/packages/react-properties/package.json","/packages/react-rich-text-lexical-renderer/package.json","/packages/ui/package.json"]},{"name":"@testing-library/user-event","version":"14.5.2","files":["/packages/form/package.json"]},{"name":"@types/accept-language-parser","version":"1.5.3","files":["/packages/api-i18n/package.json"]},{"name":"@types/accounting","version":"0.4.2","files":["/packages/i18n/package.json"]},{"name":"@types/adm-zip","version":"0.5.5","files":["/packages/api-headless-cms-import-export/package.json"]},{"name":"@types/aos","version":"3.0.4","files":["/packages/app-page-builder/package.json"]},{"name":"@types/archiver","version":"5.3.1","files":["/packages/api-page-builder-import-export/package.json"]},{"name":"@types/babel__code-frame","version":"7.0.6","files":["/packages/api-headless-cms/package.json"]},{"name":"@types/bytes","version":"3.1.4","files":["/packages/app-admin/package.json"]},{"name":"@types/center-align","version":"1.0.0","files":["/packages/data-migration/package.json"]},{"name":"@types/crypto-js","version":"4.2.2","files":["/packages/api-mailer/package.json"]},{"name":"@types/extract-zip","version":"1.6.2","files":["/packages/api-page-builder/package.json"]},{"name":"@types/facepaint","version":"1.2.2","files":["/packages/app-page-builder-elements/package.json"]},{"name":"@types/folder-hash","version":"4.0.4","files":["/scripts/buildPackages/package.json"]},{"name":"@types/fs-extra","version":"11.0.4","files":["/package.json"]},{"name":"@types/graphlib","version":"2.1.12","files":["/packages/app-admin/package.json"]},{"name":"@types/gtag.js","version":"0.0.20","files":["/packages/app-form-builder/package.json"]},{"name":"@types/humanize-duration","version":"3.27.4","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"@types/inquirer","version":"8.2.10","files":["/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-extensions/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json"]},{"name":"@types/invariant","version":"2.2.35","files":["/packages/form/package.json"]},{"name":"@types/is-hotkey","version":"0.1.10","files":["/packages/app-admin/package.json","/packages/app-page-builder/package.json"]},{"name":"@types/is-number","version":"7.0.5","files":["/packages/db-dynamodb/package.json"]},{"name":"@types/jest","version":"29.5.14","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@types/jsdom","version":"21.1.6","files":["/packages/lexical-converter/package.json"]},{"name":"@types/json2csv","version":"4.5.1","files":["/packages/api-form-builder/package.json","/packages/app-form-builder/package.json"]},{"name":"@types/jsonpack","version":"1.1.6","files":["/packages/api-headless-cms-ddb/package.json","/packages/api-headless-cms-ddb-es/package.json"]},{"name":"@types/jsonwebtoken","version":"9.0.2","files":["/packages/api-admin-users/package.json","/packages/api-cognito-authenticator/package.json","/packages/api-security/package.json","/packages/api-security-auth0/package.json","/packages/api-security-cognito/package.json"]},{"name":"@types/jwk-to-pem","version":"2.0.1","files":["/packages/api-cognito-authenticator/package.json","/packages/api-security-auth0/package.json"]},{"name":"@types/listr","version":"0.14.9","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"@types/lodash","version":"4.17.13","files":["/packages/app/package.json","/packages/app-cognito-authenticator/package.json","/packages/form/package.json","/packages/i18n/package.json","/packages/pulumi/package.json","/packages/pulumi-sdk/package.json","/packages/validation/package.json"]},{"name":"@types/md5","version":"2.3.2","files":["/packages/api-admin-users/package.json"]},{"name":"@types/ncp","version":"2.0.4","files":["/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-extensions/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json"]},{"name":"@types/node","version":"20.17.10","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@types/node-fetch","version":"2.6.1","files":["/packages/api-cognito-authenticator/package.json","/packages/api-file-manager-s3/package.json","/packages/api-form-builder/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-security-auth0/package.json","/packages/api-security-okta/package.json"]},{"name":"@types/node-notifier","version":"8.0.5","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"@types/nodemailer","version":"6.4.17","files":["/packages/api-mailer/package.json"]},{"name":"@types/nprogress","version":"0.2.0","files":["/packages/ui/package.json"]},{"name":"@types/object-hash","version":"2.2.1","files":["/packages/api-prerendering-service/package.json"]},{"name":"@types/pako","version":"2.0.3","files":["/packages/app-page-builder/package.json"]},{"name":"@types/platform","version":"1.3.4","files":["/packages/app-page-builder/package.json"]},{"name":"@types/pluralize","version":"0.0.29","files":["/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-extensions/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json"]},{"name":"@types/prettier","version":"2.7.3","files":["/package.json"]},{"name":"@types/react","version":"18.2.79","files":["/package.json","/packages/app-aco/package.json","/packages/app-audit-logs/package.json","/packages/app-headless-cms-common/package.json","/packages/app-mailer/package.json","/packages/app-page-builder-elements/package.json","/packages/app-theme/package.json","/packages/app-trash-bin/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json","/packages/theme/package.json"]},{"name":"@types/react-color","version":"2.17.11","files":["/packages/lexical-editor-actions/package.json","/packages/ui/package.json"]},{"name":"@types/react-custom-scrollbars","version":"4.0.10","files":["/packages/ui/package.json"]},{"name":"@types/react-dom","version":"18.2.25","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@types/react-google-recaptcha","version":"1.1.2","files":["/packages/app-form-builder/package.json"]},{"name":"@types/react-hamburger-menu","version":"0.0.4","files":["/packages/cwp-template-aws/template/common/extensions/theme/package.json","/extensions/theme/package.json"]},{"name":"@types/react-helmet","version":"6.1.11","files":["/packages/app-admin-rmwc/package.json","/packages/app-security-access-management/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/apps/website/package.json"]},{"name":"@types/react-images","version":"0.5.3","files":["/packages/app-page-builder/package.json"]},{"name":"@types/react-resizable","version":"3.0.8","files":["/packages/app-admin/package.json"]},{"name":"@types/react-transition-group","version":"4.4.4","files":["/packages/ui/package.json"]},{"name":"@types/react-virtualized","version":"9.21.16","files":["/packages/app-page-builder/package.json"]},{"name":"@types/resize-observer-browser","version":"0.1.4","files":["/packages/app-page-builder/package.json"]},{"name":"@types/rimraf","version":"3.0.2","files":["/packages/api-page-builder/package.json"]},{"name":"@types/sanitize-html","version":"2.9.0","files":["/packages/react-rich-text-renderer/package.json"]},{"name":"@types/semver","version":"7.3.4","files":["/packages/data-migration/package.json"]},{"name":"@types/store","version":"2.0.2","files":["/packages/app-admin/package.json","/packages/app-page-builder/package.json"]},{"name":"@types/uniqid","version":"5.3.2","files":["/packages/feature-flags/package.json","/packages/plugins/package.json"]},{"name":"@types/unzipper","version":"0.10.10","files":["/packages/api-headless-cms-import-export/package.json"]},{"name":"@types/validate-npm-package-name","version":"3.0.3","files":["/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-extensions/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json"]},{"name":"@types/warning","version":"3.0.0","files":["/packages/app/package.json"]},{"name":"@types/yargs","version":"17.0.8","files":["/scripts/buildPackages/package.json"]},{"name":"@types/yauzl","version":"2.9.2","files":["/packages/api-page-builder-import-export/package.json"]},{"name":"@typescript-eslint/eslint-plugin","version":"6.21.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@typescript-eslint/parser","version":"6.21.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"adio","version":"1.0.1","files":["/package.json"]},{"name":"adm-zip","version":"0.5.14","files":["/packages/api-headless-cms-import-export/package.json"]},{"name":"amazon-cognito-identity-js","version":"4.5.3","files":["/cypress-tests/package.json"]},{"name":"apollo-client","version":"2.6.10","files":["/packages/app-aco/package.json","/packages/app-trash-bin/package.json"]},{"name":"apollo-graphql","version":"0.9.5","files":["/packages/api-admin-settings/package.json","/packages/api-headless-cms/package.json"]},{"name":"apollo-link","version":"1.2.14","files":["/packages/app-aco/package.json","/packages/app-trash-bin/package.json"]},{"name":"aws-sdk-client-mock","version":"4.1.0","files":["/packages/api-headless-cms-import-export/package.json"]},{"name":"axios","version":"1.8.2","files":["/package.json"]},{"name":"babel-jest","version":"29.7.0","files":["/package.json"]},{"name":"babel-loader","version":"9.2.1","files":["/package.json","/packages/ui/package.json"]},{"name":"babel-plugin-dynamic-import-node","version":"2.3.3","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"babel-plugin-macros","version":"3.1.0","files":["/package.json"]},{"name":"babel-plugin-module-resolver","version":"5.0.2","files":["/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"babel-plugin-named-asset-import","version":"1.0.0-next.3e165448","files":["/packages/app-admin-rmwc/package.json","/packages/app-serverless-cms/package.json","/packages/app-theme-manager/package.json"]},{"name":"bytes","version":"3.1.2","files":["/packages/api-page-builder/package.json"]},{"name":"chalk","version":"4.1.2","files":["/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json","/packages/pulumi-aws/package.json"]},{"name":"cross-env","version":"5.2.1","files":["/package.json","/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json","/apps/admin/package.json","/apps/website/package.json"]},{"name":"cross-spawn","version":"6.0.6","files":["/package.json"]},{"name":"csvtojson","version":"2.0.10","files":["/packages/api-form-builder/package.json","/packages/api-form-builder-so-ddb/package.json","/packages/api-form-builder-so-ddb-es/package.json"]},{"name":"cypress","version":"13.16.0","files":["/cypress-tests/package.json"]},{"name":"cypress-image-snapshot","version":"4.0.1","files":["/cypress-tests/package.json"]},{"name":"cypress-mailosaur","version":"2.7.0","files":["/cypress-tests/package.json"]},{"name":"cypress-wait-until","version":"1.7.1","files":["/cypress-tests/package.json"]},{"name":"deepmerge","version":"4.3.1","files":["/package.json"]},{"name":"del","version":"6.0.0","files":["/cypress-tests/package.json"]},{"name":"dotenv","version":"8.2.0","files":["/packages/cwp-template-aws/package.json"]},{"name":"elastic-ts","version":"0.12.0","files":["/packages/migrations/package.json"]},{"name":"elliptic","version":"6.6.1","files":["/package.json"]},{"name":"env-ci","version":"2.0.1","files":["/package.json"]},{"name":"eslint","version":"8.57.1","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-config-standard","version":"16.0.3","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-import-resolver-babel-module","version":"5.3.2","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-plugin-import","version":"2.27.5","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-plugin-jest","version":"25.7.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-plugin-lodash","version":"7.4.0","files":["/package.json"]},{"name":"eslint-plugin-node","version":"11.1.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-plugin-promise","version":"5.2.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-plugin-react","version":"7.32.2","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-plugin-standard","version":"5.0.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"execa","version":"5.1.1","files":["/package.json","/packages/app-audit-logs/package.json","/packages/app-page-builder/package.json","/packages/app-page-builder-elements/package.json","/packages/app-theme/package.json","/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json","/packages/theme/package.json","/packages/ui/package.json"]},{"name":"fast-glob","version":"3.2.7","files":["/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json"]},{"name":"find-up","version":"5.0.0","files":["/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json"]},{"name":"folder-hash","version":"4.0.4","files":["/package.json"]},{"name":"fs-extra","version":"11.2.0","files":["/package.json","/packages/api-form-builder/package.json"]},{"name":"get-stream","version":"3.0.0","files":["/package.json"]},{"name":"get-yarn-workspaces","version":"1.0.2","files":["/package.json"]},{"name":"git-cz","version":"1.7.1","files":["/package.json"]},{"name":"github-actions-wac","version":"1.4.1","files":["/package.json"]},{"name":"glob","version":"7.2.3","files":["/package.json","/packages/i18n/package.json"]},{"name":"graphql","version":"15.9.0","files":["/package.json","/packages/api-aco/package.json","/packages/api-apw/package.json","/packages/api-audit-logs/package.json","/packages/api-file-manager-aco/package.json","/packages/api-headless-cms/package.json","/packages/api-headless-cms-aco/package.json","/packages/api-headless-cms-bulk-actions/package.json","/packages/api-headless-cms-import-export/package.json","/packages/api-mailer/package.json","/packages/api-page-builder-aco/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/api-record-locking/package.json","/packages/api-serverless-cms/package.json","/packages/api-websockets/package.json"]},{"name":"graphql-request","version":"3.7.0","files":["/cypress-tests/package.json","/apps/api/graphql/package.json"]},{"name":"husky","version":"4.2.5","files":["/package.json"]},{"name":"identity-obj-proxy","version":"3.0.0","files":["/packages/react-rich-text-lexical-renderer/package.json"]},{"name":"inquirer","version":"8.2.6","files":["/package.json"]},{"name":"inquirer-autocomplete-prompt","version":"1.0.1","files":["/package.json"]},{"name":"inquirer-checkbox-plus-prompt","version":"1.0.1","files":["/package.json"]},{"name":"inquirer-maxlength-input-prompt","version":"1.0.0","files":["/package.json"]},{"name":"jest","version":"29.7.0","files":["/package.json","/packages/api-admin-settings/package.json","/packages/api-admin-users-so-ddb/package.json","/packages/api-apw/package.json","/packages/api-apw-scheduler-so-ddb/package.json","/packages/api-file-manager/package.json","/packages/api-file-manager-ddb/package.json","/packages/api-form-builder/package.json","/packages/api-form-builder-so-ddb/package.json","/packages/api-form-builder-so-ddb-es/package.json","/packages/api-headless-cms/package.json","/packages/api-headless-cms-ddb/package.json","/packages/api-headless-cms-ddb-es/package.json","/packages/api-i18n/package.json","/packages/api-i18n-ddb/package.json","/packages/api-log/package.json","/packages/api-mailer/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-page-builder-import-export-so-ddb/package.json","/packages/api-page-builder-so-ddb/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/api-security-so-ddb/package.json","/packages/api-tenancy/package.json","/packages/api-tenancy-so-ddb/package.json","/packages/api-tenant-manager/package.json","/packages/api-theme-manager/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json","/packages/data-migration/package.json","/packages/db-dynamodb/package.json","/packages/handler-client/package.json","/packages/handler-graphql/package.json","/packages/validation/package.json"]},{"name":"jest-dynalite","version":"3.6.1","files":["/packages/api-admin-settings/package.json","/packages/api-admin-users-so-ddb/package.json","/packages/api-apw-scheduler-so-ddb/package.json","/packages/api-authentication/package.json","/packages/api-file-manager-ddb/package.json","/packages/api-form-builder/package.json","/packages/api-form-builder-so-ddb/package.json","/packages/api-form-builder-so-ddb-es/package.json","/packages/api-headless-cms-ddb/package.json","/packages/api-headless-cms-ddb-es/package.json","/packages/api-i18n-ddb/package.json","/packages/api-log/package.json","/packages/api-mailer/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-page-builder-import-export-so-ddb/package.json","/packages/api-page-builder-so-ddb/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/api-prerendering-service-so-ddb/package.json","/packages/api-security-so-ddb/package.json","/packages/api-tenancy/package.json","/packages/api-tenancy-so-ddb/package.json","/packages/api-tenant-manager/package.json","/packages/api-wcp/package.json","/packages/data-migration/package.json","/packages/db-dynamodb/package.json","/packages/migrations/package.json","/packages/project-utils/package.json"]},{"name":"jest-environment-jsdom","version":"29.7.0","files":["/package.json"]},{"name":"jest-extended","version":"4.0.2","files":["/package.json"]},{"name":"jest-mock-console","version":"2.0.0","files":["/packages/data-migration/package.json","/packages/handler-graphql/package.json"]},{"name":"jsdom","version":"25.0.1","files":["/packages/lexical-converter/package.json"]},{"name":"jsonpack","version":"1.1.5","files":["/packages/api-file-manager-ddb/package.json"]},{"name":"lerna","version":"8.1.2","files":["/package.json"]},{"name":"lexical","version":"0.23.1","files":["/package.json"]},{"name":"lint-staged","version":"15.3.0","files":["/package.json"]},{"name":"listr","version":"0.14.3","files":["/package.json"]},{"name":"listr2","version":"5.0.8","files":["/packages/project-utils/package.json"]},{"name":"load-json-file","version":"6.2.0","files":["/package.json","/packages/project-utils/package.json"]},{"name":"lodash","version":"4.17.21","files":["/package.json","/cypress-tests/package.json"]},{"name":"longest","version":"2.0.1","files":["/package.json"]},{"name":"md5","version":"2.3.0","files":["/packages/api-security-cognito/package.json"]},{"name":"merge","version":"2.1.1","files":["/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"micromatch","version":"4.0.8","files":["/package.json"]},{"name":"mime","version":"3.0.0","files":["/packages/pulumi-aws/package.json"]},{"name":"minimatch","version":"5.1.6","files":["/package.json"]},{"name":"mobx","version":"6.9.0","files":["/packages/form/package.json"]},{"name":"mobx-react-lite","version":"3.4.3","files":["/packages/form/package.json"]},{"name":"monaco-editor","version":"0.52.2","files":["/packages/app-admin/package.json"]},{"name":"nanoid","version":"3.3.8","files":["/package.json","/cypress-tests/package.json"]},{"name":"ncp","version":"2.0.0","files":["/packages/ui/package.json"]},{"name":"node-fetch","version":"2.6.7","files":["/package.json","/cypress-tests/package.json"]},{"name":"pino","version":"8.21.0","files":["/packages/logger/package.json","/packages/project-utils/package.json"]},{"name":"pino-pretty","version":"9.4.0","files":["/packages/project-utils/package.json"]},{"name":"pm2","version":"5.4.3","files":["/package.json"]},{"name":"prettier","version":"2.8.8","files":["/package.json","/packages/api-aco/package.json","/packages/api-admin-settings/package.json","/packages/api-apw/package.json","/packages/api-headless-cms/package.json","/packages/api-headless-cms-ddb-es/package.json","/packages/api-page-builder/package.json","/packages/api-prerendering-service/package.json","/packages/api-prerendering-service-so-ddb/package.json","/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json","/packages/react-properties/package.json","/packages/react-rich-text-lexical-renderer/package.json"]},{"name":"raw-loader","version":"4.0.2","files":["/packages/ui/package.json"]},{"name":"react","version":"18.2.0","files":["/packages/lexical-nodes/package.json"]},{"name":"rimraf","version":"6.0.1","files":["/packages/api/package.json","/packages/api-aco/package.json","/packages/api-admin-settings/package.json","/packages/api-admin-users/package.json","/packages/api-admin-users-so-ddb/package.json","/packages/api-apw/package.json","/packages/api-apw-scheduler-so-ddb/package.json","/packages/api-authentication/package.json","/packages/api-authentication-cognito/package.json","/packages/api-background-tasks-ddb/package.json","/packages/api-background-tasks-es/package.json","/packages/api-background-tasks-os/package.json","/packages/api-cognito-authenticator/package.json","/packages/api-elasticsearch/package.json","/packages/api-elasticsearch-tasks/package.json","/packages/api-file-manager/package.json","/packages/api-file-manager-ddb/package.json","/packages/api-file-manager-s3/package.json","/packages/api-form-builder/package.json","/packages/api-form-builder-so-ddb/package.json","/packages/api-form-builder-so-ddb-es/package.json","/packages/api-headless-cms/package.json","/packages/api-headless-cms-ddb-es/package.json","/packages/api-i18n/package.json","/packages/api-i18n-content/package.json","/packages/api-i18n-ddb/package.json","/packages/api-log/package.json","/packages/api-mailer/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-page-builder-import-export-so-ddb/package.json","/packages/api-page-builder-so-ddb/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/api-prerendering-service/package.json","/packages/api-prerendering-service-aws/package.json","/packages/api-prerendering-service-so-ddb/package.json","/packages/api-record-locking/package.json","/packages/api-security/package.json","/packages/api-security-auth0/package.json","/packages/api-security-cognito/package.json","/packages/api-security-okta/package.json","/packages/api-security-so-ddb/package.json","/packages/api-serverless-cms/package.json","/packages/api-tenancy/package.json","/packages/api-tenancy-so-ddb/package.json","/packages/api-tenant-manager/package.json","/packages/api-theme-manager/package.json","/packages/api-wcp/package.json","/packages/api-websockets/package.json","/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-cognito-authenticator/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-file-manager-s3/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-i18n-content/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-page-builder-elements/package.json","/packages/app-plugin-admin-welcome-screen/package.json","/packages/app-record-locking/package.json","/packages/app-security/package.json","/packages/app-security-access-management/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme/package.json","/packages/app-theme-manager/package.json","/packages/app-trash-bin/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/app-websockets/package.json","/packages/aws-sdk/package.json","/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-extensions/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json","/packages/cli-plugin-scaffold-workspaces/package.json","/packages/data-migration/package.json","/packages/db/package.json","/packages/db-dynamodb/package.json","/packages/error/package.json","/packages/feature-flags/package.json","/packages/form/package.json","/packages/handler/package.json","/packages/handler-aws/package.json","/packages/handler-client/package.json","/packages/handler-db/package.json","/packages/handler-graphql/package.json","/packages/i18n/package.json","/packages/i18n-react/package.json","/packages/logger/package.json","/packages/plugins/package.json","/packages/pubsub/package.json","/packages/pulumi/package.json","/packages/pulumi-aws/package.json","/packages/pulumi-sdk/package.json","/packages/react-rich-text-renderer/package.json","/packages/react-router/package.json","/packages/tasks/package.json","/packages/theme/package.json","/packages/ui/package.json","/packages/ui-composer/package.json","/packages/utils/package.json","/packages/validation/package.json","/packages/wcp/package.json"]},{"name":"semver","version":"7.6.3","files":["/package.json"]},{"name":"source-map-explorer","version":"2.5.3","files":["/apps/website/package.json"]},{"name":"ts-expect","version":"1.3.0","files":["/package.json"]},{"name":"ts-jest","version":"29.1.5","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"ts-node","version":"10.9.2","files":["/package.json","/scripts/buildPackages/package.json","/scripts/prepublishOnly/package.json"]},{"name":"ttypescript","version":"1.5.15","files":["/packages/api-file-manager-aco/package.json","/packages/app-dynamic-pages/package.json"]},{"name":"type-fest","version":"4.14.0","files":["/package.json","/packages/api-elasticsearch-tasks/package.json","/packages/api-record-locking/package.json","/packages/cli-plugin-dependencies/package.json","/packages/tasks/package.json","/scripts/prepublishOnly/package.json"]},{"name":"typescript","version":"5.3.3","files":["/package.json","/packages/api/package.json","/packages/api-aco/package.json","/packages/api-admin-settings/package.json","/packages/api-admin-users/package.json","/packages/api-admin-users-so-ddb/package.json","/packages/api-apw/package.json","/packages/api-apw-scheduler-so-ddb/package.json","/packages/api-audit-logs/package.json","/packages/api-authentication/package.json","/packages/api-authentication-cognito/package.json","/packages/api-background-tasks-ddb/package.json","/packages/api-background-tasks-es/package.json","/packages/api-background-tasks-os/package.json","/packages/api-cognito-authenticator/package.json","/packages/api-dynamodb-to-elasticsearch/package.json","/packages/api-elasticsearch/package.json","/packages/api-elasticsearch-tasks/package.json","/packages/api-file-manager/package.json","/packages/api-file-manager-aco/package.json","/packages/api-file-manager-ddb/package.json","/packages/api-file-manager-s3/package.json","/packages/api-form-builder/package.json","/packages/api-form-builder-so-ddb/package.json","/packages/api-form-builder-so-ddb-es/package.json","/packages/api-headless-cms/package.json","/packages/api-headless-cms-aco/package.json","/packages/api-headless-cms-bulk-actions/package.json","/packages/api-headless-cms-ddb/package.json","/packages/api-headless-cms-ddb-es/package.json","/packages/api-headless-cms-es-tasks/package.json","/packages/api-headless-cms-import-export/package.json","/packages/api-headless-cms-tasks/package.json","/packages/api-headless-cms-tasks-ddb-es/package.json","/packages/api-i18n/package.json","/packages/api-i18n-content/package.json","/packages/api-i18n-ddb/package.json","/packages/api-log/package.json","/packages/api-mailer/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-aco/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-page-builder-import-export-so-ddb/package.json","/packages/api-page-builder-so-ddb/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/api-prerendering-service/package.json","/packages/api-prerendering-service-aws/package.json","/packages/api-prerendering-service-so-ddb/package.json","/packages/api-record-locking/package.json","/packages/api-security/package.json","/packages/api-security-auth0/package.json","/packages/api-security-cognito/package.json","/packages/api-security-okta/package.json","/packages/api-security-so-ddb/package.json","/packages/api-serverless-cms/package.json","/packages/api-tenancy/package.json","/packages/api-tenancy-so-ddb/package.json","/packages/api-tenant-manager/package.json","/packages/api-theme-manager/package.json","/packages/api-wcp/package.json","/packages/api-websockets/package.json","/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-cognito-authenticator/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-file-manager-s3/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-i18n-content/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-page-builder-elements/package.json","/packages/app-plugin-admin-welcome-screen/package.json","/packages/app-record-locking/package.json","/packages/app-security/package.json","/packages/app-security-access-management/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme/package.json","/packages/app-theme-manager/package.json","/packages/app-trash-bin/package.json","/packages/app-utils/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/app-websockets/package.json","/packages/aws-sdk/package.json","/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-extensions/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json","/packages/cli-plugin-scaffold-workspaces/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json","/packages/data-migration/package.json","/packages/db/package.json","/packages/db-dynamodb/package.json","/packages/di-container/package.json","/packages/error/package.json","/packages/feature-flags/package.json","/packages/form/package.json","/packages/handler/package.json","/packages/handler-aws/package.json","/packages/handler-client/package.json","/packages/handler-db/package.json","/packages/handler-graphql/package.json","/packages/i18n/package.json","/packages/i18n-react/package.json","/packages/ioc/package.json","/packages/logger/package.json","/packages/migrations/package.json","/packages/plugins/package.json","/packages/pubsub/package.json","/packages/pulumi/package.json","/packages/pulumi-aws/package.json","/packages/pulumi-sdk/package.json","/packages/react-composition/package.json","/packages/react-rich-text-renderer/package.json","/packages/react-router/package.json","/packages/serverless-cms-aws/package.json","/packages/shared-aco/package.json","/packages/tasks/package.json","/packages/theme/package.json","/packages/ui/package.json","/packages/ui-composer/package.json","/packages/utils/package.json","/packages/validation/package.json","/packages/wcp/package.json","/cypress-tests/package.json"]},{"name":"typescript-transform-paths","version":"3.5.3","files":["/package.json"]},{"name":"uniqid","version":"5.4.0","files":["/cypress-tests/package.json"]},{"name":"verdaccio","version":"6.0.5","files":["/package.json"]},{"name":"write-json-file","version":"4.3.0","files":["/package.json","/packages/api-headless-cms/package.json"]},{"name":"yargs","version":"17.7.2","files":["/package.json","/packages/project-utils/package.json"]},{"name":"zod","version":"3.23.8","files":["/packages/ioc/package.json"]}],"peerDependencies":[{"name":"@editorjs/editorjs","version":"2.26.5","files":["/packages/app-page-builder-elements/package.json"]},{"name":"aos","version":"2.3.4","files":["/packages/app-page-builder-elements/package.json"]},{"name":"minimatch","version":"5.1.6","files":["/packages/ui/package.json"]},{"name":"react","version":"18.2.0","files":["/packages/app-audit-logs/package.json","/packages/app-page-builder-elements/package.json","/packages/app-theme/package.json","/packages/form/package.json","/packages/i18n/package.json","/packages/i18n-react/package.json","/packages/react-router/package.json","/packages/theme/package.json","/packages/ui/package.json"]},{"name":"react-columned","version":"1.1.3","files":["/packages/app-page-builder-elements/package.json"]},{"name":"react-dom","version":"18.2.0","files":["/packages/ui/package.json"]},{"name":"react-google-recaptcha","version":"1.1.0","files":["/packages/app-page-builder-elements/package.json"]},{"name":"react-images","version":"0.5.19","files":["/packages/app-page-builder-elements/package.json"]},{"name":"swiper","version":"9.3.2","files":["/packages/app-page-builder-elements/package.json"]},{"name":"zod","version":"3.23.8","files":["/packages/utils/package.json"]}],"resolutions":[{"name":"@emotion/react","version":"11.10.8","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@grpc/grpc-js","version":"1.11.1","files":["/package.json"]},{"name":"@octokit/rest","version":"20.0.2","files":["/package.json"]},{"name":"@types/react","version":"18.2.79","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@types/react-dom","version":"18.2.25","files":["/package.json"]},{"name":"@types/webpack","version":"5.28.0","files":["/package.json"]},{"name":"postcss","version":"8.4.35","files":["/package.json"]},{"name":"react","version":"18.2.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"react-dom","version":"18.2.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"semver","version":"7.6.3","files":["/package.json"]},{"name":"systeminformation","version":"5.23.18","files":["/package.json"]},{"name":"tar","version":"6.2.1","files":["/package.json"]}],"references":[{"name":"@types/hoist-non-react-statics","versions":[{"version":"3.3.5","files":[{"file":"/package.json","types":["dependencies"]}]}]},{"name":"@babel/cli","versions":[{"version":"7.27.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/code-frame","versions":[{"version":"7.27.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]}]}]},{"name":"@babel/compat-data","versions":[{"version":"7.27.5","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@babel/core","versions":[{"version":"7.27.4","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/helper-define-polyfill-provider","versions":[{"version":"0.6.4","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@babel/helper-environment-visitor","versions":[{"version":"7.24.7","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@babel/parser","versions":[{"version":"7.27.5","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@babel/plugin-proposal-class-properties","versions":[{"version":"7.18.6","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/plugin-proposal-object-rest-spread","versions":[{"version":"7.20.7","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/plugin-proposal-throw-expressions","versions":[{"version":"7.27.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/plugin-syntax-object-rest-spread","versions":[{"version":"7.8.3","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/plugin-transform-modules-commonjs","versions":[{"version":"7.27.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@babel/plugin-transform-runtime","versions":[{"version":"7.27.4","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"@babel/preset-env","versions":[{"version":"7.27.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/preset-react","versions":[{"version":"7.27.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/preset-typescript","versions":[{"version":"7.27.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/register","versions":[{"version":"7.27.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/i18n/package.json","types":["devDependencies"]}]}]},{"name":"@babel/runtime","versions":[{"version":"7.27.4","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/template","versions":[{"version":"7.27.2","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@babel/traverse","versions":[{"version":"7.27.4","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@babel/types","versions":[{"version":"7.27.3","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@commitlint/cli","versions":[{"version":"11.0.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@commitlint/config-conventional","versions":[{"version":"11.0.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@grpc/grpc-js","versions":[{"version":"1.11.1","files":[{"file":"/package.json","types":["devDependencies","resolutions"]}]}]},{"name":"@lexical/code","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/hashtag","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/headless","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-converter/package.json","types":["dependencies"]}]}]},{"name":"@lexical/history","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/html","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-converter/package.json","types":["dependencies"]}]}]},{"name":"@lexical/list","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/mark","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/overflow","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/react","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/rich-text","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/selection","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-actions/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/text","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]}]}]},{"name":"@lexical/utils","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-pb-element/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@octokit/rest","versions":[{"version":"20.0.2","files":[{"file":"/package.json","types":["devDependencies","resolutions"]}]}]},{"name":"@types/fs-extra","versions":[{"version":"11.0.4","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@types/jest","versions":[{"version":"29.5.14","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"@types/node","versions":[{"version":"20.17.10","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"@types/prettier","versions":[{"version":"2.7.3","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@types/react","versions":[{"version":"18.2.79","files":[{"file":"/package.json","types":["devDependencies","resolutions"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["devDependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["devDependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme/package.json","types":["devDependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies","resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies","resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies","resolutions"]},{"file":"/packages/react-composition/package.json","types":["dependencies"]},{"file":"/packages/react-properties/package.json","types":["dependencies"]},{"file":"/packages/react-rich-text-lexical-renderer/package.json","types":["dependencies"]},{"file":"/packages/react-rich-text-renderer/package.json","types":["dependencies"]},{"file":"/packages/theme/package.json","types":["devDependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"@types/react-dom","versions":[{"version":"18.2.25","files":[{"file":"/package.json","types":["devDependencies","resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"@typescript-eslint/eslint-plugin","versions":[{"version":"6.21.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"@typescript-eslint/parser","versions":[{"version":"6.21.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"adio","versions":[{"version":"1.0.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"axios","versions":[{"version":"1.8.2","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"babel-jest","versions":[{"version":"29.7.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"babel-loader","versions":[{"version":"9.2.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"babel-plugin-dynamic-import-node","versions":[{"version":"2.3.3","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"babel-plugin-macros","versions":[{"version":"3.1.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"babel-plugin-module-resolver","versions":[{"version":"5.0.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"chalk","versions":[{"version":"4.1.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/aws-layers/package.json","types":["dependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies","devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-workspaces/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/data-migration/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["devDependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]},{"file":"/packages/system-requirements/package.json","types":["dependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["dependencies"]}]}]},{"name":"cross-env","versions":[{"version":"5.2.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/apps/admin/package.json","types":["devDependencies"]},{"file":"/apps/website/package.json","types":["devDependencies"]}]}]},{"name":"cross-spawn","versions":[{"version":"6.0.6","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"deepmerge","versions":[{"version":"4.3.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"elliptic","versions":[{"version":"6.6.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"env-ci","versions":[{"version":"2.0.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"eslint","versions":[{"version":"8.57.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"eslint-config-standard","versions":[{"version":"16.0.3","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"eslint-import-resolver-babel-module","versions":[{"version":"5.3.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"eslint-plugin-import","versions":[{"version":"2.27.5","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"eslint-plugin-jest","versions":[{"version":"25.7.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"eslint-plugin-lodash","versions":[{"version":"7.4.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"eslint-plugin-node","versions":[{"version":"11.1.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"eslint-plugin-promise","versions":[{"version":"5.2.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"eslint-plugin-react","versions":[{"version":"7.32.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"eslint-plugin-standard","versions":[{"version":"5.0.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"execa","versions":[{"version":"5.1.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["devDependencies"]},{"file":"/packages/app-theme/package.json","types":["devDependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies","devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-workspaces/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]},{"file":"/packages/system-requirements/package.json","types":["dependencies"]},{"file":"/packages/theme/package.json","types":["devDependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]}]}]},{"name":"folder-hash","versions":[{"version":"4.0.4","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]}]}]},{"name":"fs-extra","versions":[{"version":"11.2.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["dependencies"]}]}]},{"name":"get-stream","versions":[{"version":"3.0.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"get-yarn-workspaces","versions":[{"version":"1.0.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["dependencies"]}]}]},{"name":"git-cz","versions":[{"version":"1.7.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"github-actions-wac","versions":[{"version":"1.4.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"glob","versions":[{"version":"7.2.3","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/i18n/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"graphql","versions":[{"version":"15.9.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-apw/package.json","types":["devDependencies"]},{"file":"/packages/api-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies","devDependencies"]},{"file":"/packages/api-headless-cms-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-bulk-actions/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-content/package.json","types":["dependencies"]},{"file":"/packages/api-mailer/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-record-locking/package.json","types":["devDependencies"]},{"file":"/packages/api-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-websockets/package.json","types":["devDependencies"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/extensions/theme/package.json","types":["dependencies"]},{"file":"/packages/handler-graphql/package.json","types":["dependencies"]},{"file":"/packages/react-router/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]},{"file":"/extensions/theme/package.json","types":["dependencies"]}]}]},{"name":"husky","versions":[{"version":"4.2.5","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"inquirer","versions":[{"version":"8.2.6","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]}]}]},{"name":"inquirer-autocomplete-prompt","versions":[{"version":"1.0.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"inquirer-checkbox-plus-prompt","versions":[{"version":"1.0.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"inquirer-maxlength-input-prompt","versions":[{"version":"1.0.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"jest","versions":[{"version":"29.7.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-settings/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-users-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-apw/package.json","types":["devDependencies"]},{"file":"/packages/api-apw-scheduler-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-log/package.json","types":["devDependencies"]},{"file":"/packages/api-mailer/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-security-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-theme-manager/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/data-migration/package.json","types":["devDependencies"]},{"file":"/packages/db-dynamodb/package.json","types":["devDependencies"]},{"file":"/packages/handler-client/package.json","types":["devDependencies"]},{"file":"/packages/handler-graphql/package.json","types":["devDependencies"]},{"file":"/packages/validation/package.json","types":["devDependencies"]}]}]},{"name":"jest-environment-jsdom","versions":[{"version":"29.7.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"jest-extended","versions":[{"version":"4.0.2","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"lerna","versions":[{"version":"8.1.2","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"lexical","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-converter/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]},{"file":"/packages/lexical-theme/package.json","types":["dependencies"]}]}]},{"name":"lint-staged","versions":[{"version":"15.3.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"listr","versions":[{"version":"0.14.3","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]}]}]},{"name":"load-json-file","versions":[{"version":"6.2.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/global-config/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["devDependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["dependencies"]}]}]},{"name":"lodash","versions":[{"version":"4.17.21","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-aco/package.json","types":["dependencies"]},{"file":"/packages/api-admin-users/package.json","types":["dependencies"]},{"file":"/packages/api-apw/package.json","types":["dependencies"]},{"file":"/packages/api-file-manager/package.json","types":["dependencies"]},{"file":"/packages/api-form-builder/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-ddb/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["dependencies"]},{"file":"/packages/api-mailer/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-aco/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["dependencies"]},{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]},{"file":"/packages/api-prerendering-service-aws/package.json","types":["dependencies"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["dependencies"]},{"file":"/packages/app-cognito-authenticator/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/db-dynamodb/package.json","types":["dependencies"]},{"file":"/packages/form/package.json","types":["dependencies"]},{"file":"/packages/i18n/package.json","types":["dependencies"]},{"file":"/packages/i18n-react/package.json","types":["dependencies"]},{"file":"/packages/migrations/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/pulumi/package.json","types":["dependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["dependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]},{"file":"/packages/tasks/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]},{"file":"/packages/validation/package.json","types":["dependencies"]},{"file":"/cypress-tests/package.json","types":["devDependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["dependencies"]}]}]},{"name":"longest","versions":[{"version":"2.0.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"micromatch","versions":[{"version":"4.0.8","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"minimatch","versions":[{"version":"5.1.6","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-security/package.json","types":["dependencies"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-security/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/data-migration/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["peerDependencies"]}]}]},{"name":"nanoid","versions":[{"version":"3.3.8","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/react-properties/package.json","types":["dependencies"]},{"file":"/packages/utils/package.json","types":["dependencies"]},{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"node-fetch","versions":[{"version":"2.6.7","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-cognito-authenticator/package.json","types":["dependencies"]},{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/api-form-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["dependencies"]},{"file":"/packages/api-security-okta/package.json","types":["dependencies"]},{"file":"/packages/api-wcp/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["dependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]},{"file":"/packages/wcp/package.json","types":["dependencies"]},{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"pm2","versions":[{"version":"5.4.3","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"prettier","versions":[{"version":"2.8.8","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-settings/package.json","types":["devDependencies"]},{"file":"/packages/api-apw/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/react-properties/package.json","types":["devDependencies"]},{"file":"/packages/react-rich-text-lexical-renderer/package.json","types":["devDependencies"]}]}]},{"name":"semver","versions":[{"version":"7.6.3","files":[{"file":"/package.json","types":["devDependencies","resolutions"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/data-migration/package.json","types":["dependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]},{"file":"/packages/system-requirements/package.json","types":["dependencies"]}]}]},{"name":"ts-expect","versions":[{"version":"1.3.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"ts-jest","versions":[{"version":"29.1.5","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"ts-node","versions":[{"version":"10.9.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/scripts/buildPackages/package.json","types":["devDependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["devDependencies"]}]}]},{"name":"type-fest","versions":[{"version":"4.14.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-elasticsearch-tasks/package.json","types":["devDependencies"]},{"file":"/packages/api-record-locking/package.json","types":["devDependencies"]},{"file":"/packages/api-websockets/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["devDependencies"]},{"file":"/packages/db/package.json","types":["dependencies"]},{"file":"/packages/tasks/package.json","types":["devDependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["devDependencies"]}]}]},{"name":"typescript","versions":[{"version":"5.3.3","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api/package.json","types":["devDependencies"]},{"file":"/packages/api-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-settings/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-users/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-users-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-apw/package.json","types":["devDependencies"]},{"file":"/packages/api-apw-scheduler-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/api-authentication/package.json","types":["devDependencies"]},{"file":"/packages/api-authentication-cognito/package.json","types":["devDependencies"]},{"file":"/packages/api-background-tasks-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-background-tasks-es/package.json","types":["devDependencies"]},{"file":"/packages/api-background-tasks-os/package.json","types":["devDependencies"]},{"file":"/packages/api-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/api-dynamodb-to-elasticsearch/package.json","types":["devDependencies"]},{"file":"/packages/api-elasticsearch/package.json","types":["devDependencies"]},{"file":"/packages/api-elasticsearch-tasks/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-s3/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-bulk-actions/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-es-tasks/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-tasks/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-tasks-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-content/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-log/package.json","types":["devDependencies"]},{"file":"/packages/api-mailer/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service-aws/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-record-locking/package.json","types":["devDependencies"]},{"file":"/packages/api-security/package.json","types":["devDependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["devDependencies"]},{"file":"/packages/api-security-cognito/package.json","types":["devDependencies"]},{"file":"/packages/api-security-okta/package.json","types":["devDependencies"]},{"file":"/packages/api-security-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-theme-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-wcp/package.json","types":["devDependencies"]},{"file":"/packages/api-websockets/package.json","types":["devDependencies"]},{"file":"/packages/app/package.json","types":["devDependencies"]},{"file":"/packages/app-aco/package.json","types":["devDependencies"]},{"file":"/packages/app-admin/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["devDependencies"]},{"file":"/packages/app-apw/package.json","types":["devDependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/app-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["devDependencies"]},{"file":"/packages/app-file-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-file-manager-s3/package.json","types":["devDependencies"]},{"file":"/packages/app-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n-content/package.json","types":["devDependencies"]},{"file":"/packages/app-mailer/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["devDependencies"]},{"file":"/packages/app-plugin-admin-welcome-screen/package.json","types":["devDependencies"]},{"file":"/packages/app-record-locking/package.json","types":["devDependencies"]},{"file":"/packages/app-security/package.json","types":["devDependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["devDependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-theme/package.json","types":["devDependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["devDependencies"]},{"file":"/packages/app-utils/package.json","types":["devDependencies"]},{"file":"/packages/app-wcp/package.json","types":["devDependencies"]},{"file":"/packages/app-website/package.json","types":["devDependencies"]},{"file":"/packages/app-websockets/package.json","types":["devDependencies"]},{"file":"/packages/aws-sdk/package.json","types":["devDependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/data-migration/package.json","types":["devDependencies"]},{"file":"/packages/db/package.json","types":["devDependencies"]},{"file":"/packages/db-dynamodb/package.json","types":["devDependencies"]},{"file":"/packages/di-container/package.json","types":["devDependencies"]},{"file":"/packages/error/package.json","types":["devDependencies"]},{"file":"/packages/feature-flags/package.json","types":["devDependencies"]},{"file":"/packages/form/package.json","types":["devDependencies"]},{"file":"/packages/handler/package.json","types":["devDependencies"]},{"file":"/packages/handler-aws/package.json","types":["devDependencies"]},{"file":"/packages/handler-client/package.json","types":["devDependencies"]},{"file":"/packages/handler-db/package.json","types":["devDependencies"]},{"file":"/packages/handler-graphql/package.json","types":["devDependencies"]},{"file":"/packages/i18n/package.json","types":["devDependencies"]},{"file":"/packages/i18n-react/package.json","types":["devDependencies"]},{"file":"/packages/ioc/package.json","types":["devDependencies"]},{"file":"/packages/logger/package.json","types":["devDependencies"]},{"file":"/packages/migrations/package.json","types":["devDependencies"]},{"file":"/packages/plugins/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/pubsub/package.json","types":["devDependencies"]},{"file":"/packages/pulumi/package.json","types":["devDependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["devDependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["devDependencies"]},{"file":"/packages/react-composition/package.json","types":["devDependencies"]},{"file":"/packages/react-rich-text-renderer/package.json","types":["devDependencies"]},{"file":"/packages/react-router/package.json","types":["devDependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["devDependencies"]},{"file":"/packages/shared-aco/package.json","types":["devDependencies"]},{"file":"/packages/tasks/package.json","types":["devDependencies"]},{"file":"/packages/theme/package.json","types":["devDependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]},{"file":"/packages/ui-composer/package.json","types":["devDependencies"]},{"file":"/packages/utils/package.json","types":["devDependencies"]},{"file":"/packages/validation/package.json","types":["devDependencies"]},{"file":"/packages/wcp/package.json","types":["devDependencies"]},{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"typescript-transform-paths","versions":[{"version":"3.5.3","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"verdaccio","versions":[{"version":"6.0.5","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"write-json-file","versions":[{"version":"4.3.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/global-config/package.json","types":["dependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["dependencies"]}]}]},{"name":"yargs","versions":[{"version":"17.7.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/i18n/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["devDependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]}]}]},{"name":"systeminformation","versions":[{"version":"5.23.18","files":[{"file":"/package.json","types":["resolutions"]}]}]},{"name":"@emotion/react","versions":[{"version":"11.10.8","files":[{"file":"/package.json","types":["resolutions"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["dependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/extensions/theme/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["resolutions"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-theme/package.json","types":["dependencies"]},{"file":"/packages/react-rich-text-lexical-renderer/package.json","types":["devDependencies"]},{"file":"/packages/theme/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]},{"file":"/extensions/theme/package.json","types":["dependencies"]}]}]},{"name":"@types/webpack","versions":[{"version":"5.28.0","files":[{"file":"/package.json","types":["resolutions"]}]}]},{"name":"react","versions":[{"version":"18.2.0","files":[{"file":"/package.json","types":["resolutions"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["peerDependencies"]},{"file":"/packages/app-cognito-authenticator/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-i18n-content/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["peerDependencies"]},{"file":"/packages/app-plugin-admin-welcome-screen/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-security/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme/package.json","types":["peerDependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/app-websockets/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/templates/admin/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/templates/pbElement/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/templates/website/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/extensions/theme/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["resolutions"]},{"file":"/packages/form/package.json","types":["peerDependencies"]},{"file":"/packages/i18n/package.json","types":["peerDependencies"]},{"file":"/packages/i18n-react/package.json","types":["peerDependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-actions/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-pb-element/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/react-composition/package.json","types":["dependencies"]},{"file":"/packages/react-properties/package.json","types":["dependencies"]},{"file":"/packages/react-rich-text-lexical-renderer/package.json","types":["dependencies"]},{"file":"/packages/react-rich-text-renderer/package.json","types":["dependencies"]},{"file":"/packages/react-router/package.json","types":["dependencies","peerDependencies"]},{"file":"/packages/theme/package.json","types":["peerDependencies"]},{"file":"/packages/ui/package.json","types":["peerDependencies"]},{"file":"/packages/ui-composer/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]},{"file":"/extensions/theme/package.json","types":["dependencies"]}]}]},{"name":"react-dom","versions":[{"version":"18.2.0","files":[{"file":"/package.json","types":["resolutions"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-cognito-authenticator/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-i18n-content/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-plugin-admin-welcome-screen/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-security/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/app-websockets/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["resolutions"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-actions/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-pb-element/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/react-composition/package.json","types":["dependencies"]},{"file":"/packages/react-router/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["peerDependencies"]},{"file":"/packages/ui-composer/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"tar","versions":[{"version":"6.2.1","files":[{"file":"/package.json","types":["resolutions"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]}]}]},{"name":"postcss","versions":[{"version":"8.4.35","files":[{"file":"/package.json","types":["resolutions"]}]}]},{"name":"rimraf","versions":[{"version":"6.0.1","files":[{"file":"/packages/api/package.json","types":["devDependencies"]},{"file":"/packages/api-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-settings/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-users/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-users-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-apw/package.json","types":["devDependencies"]},{"file":"/packages/api-apw-scheduler-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-authentication/package.json","types":["devDependencies"]},{"file":"/packages/api-authentication-cognito/package.json","types":["devDependencies"]},{"file":"/packages/api-background-tasks-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-background-tasks-es/package.json","types":["devDependencies"]},{"file":"/packages/api-background-tasks-os/package.json","types":["devDependencies"]},{"file":"/packages/api-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/api-elasticsearch/package.json","types":["devDependencies"]},{"file":"/packages/api-elasticsearch-tasks/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-s3/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-content/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-log/package.json","types":["devDependencies"]},{"file":"/packages/api-mailer/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service-aws/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-record-locking/package.json","types":["devDependencies"]},{"file":"/packages/api-security/package.json","types":["devDependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["devDependencies"]},{"file":"/packages/api-security-cognito/package.json","types":["devDependencies"]},{"file":"/packages/api-security-okta/package.json","types":["devDependencies"]},{"file":"/packages/api-security-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-theme-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-wcp/package.json","types":["devDependencies"]},{"file":"/packages/api-websockets/package.json","types":["devDependencies"]},{"file":"/packages/app/package.json","types":["devDependencies"]},{"file":"/packages/app-aco/package.json","types":["devDependencies"]},{"file":"/packages/app-admin/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["devDependencies"]},{"file":"/packages/app-apw/package.json","types":["devDependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/app-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["devDependencies"]},{"file":"/packages/app-file-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-file-manager-s3/package.json","types":["devDependencies"]},{"file":"/packages/app-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n-content/package.json","types":["devDependencies"]},{"file":"/packages/app-mailer/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["devDependencies"]},{"file":"/packages/app-plugin-admin-welcome-screen/package.json","types":["devDependencies"]},{"file":"/packages/app-record-locking/package.json","types":["devDependencies"]},{"file":"/packages/app-security/package.json","types":["devDependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["devDependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-theme/package.json","types":["devDependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["devDependencies"]},{"file":"/packages/app-wcp/package.json","types":["devDependencies"]},{"file":"/packages/app-website/package.json","types":["devDependencies"]},{"file":"/packages/app-websockets/package.json","types":["devDependencies"]},{"file":"/packages/aws-sdk/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["devDependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/data-migration/package.json","types":["devDependencies"]},{"file":"/packages/db/package.json","types":["devDependencies"]},{"file":"/packages/db-dynamodb/package.json","types":["devDependencies"]},{"file":"/packages/error/package.json","types":["devDependencies"]},{"file":"/packages/feature-flags/package.json","types":["devDependencies"]},{"file":"/packages/form/package.json","types":["devDependencies"]},{"file":"/packages/handler/package.json","types":["devDependencies"]},{"file":"/packages/handler-aws/package.json","types":["devDependencies"]},{"file":"/packages/handler-client/package.json","types":["devDependencies"]},{"file":"/packages/handler-db/package.json","types":["devDependencies"]},{"file":"/packages/handler-graphql/package.json","types":["devDependencies"]},{"file":"/packages/i18n/package.json","types":["devDependencies"]},{"file":"/packages/i18n-react/package.json","types":["devDependencies"]},{"file":"/packages/logger/package.json","types":["devDependencies"]},{"file":"/packages/plugins/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/pubsub/package.json","types":["devDependencies"]},{"file":"/packages/pulumi/package.json","types":["devDependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["devDependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["devDependencies"]},{"file":"/packages/react-rich-text-renderer/package.json","types":["devDependencies"]},{"file":"/packages/react-router/package.json","types":["devDependencies"]},{"file":"/packages/tasks/package.json","types":["devDependencies"]},{"file":"/packages/theme/package.json","types":["devDependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]},{"file":"/packages/ui-composer/package.json","types":["devDependencies"]},{"file":"/packages/utils/package.json","types":["devDependencies"]},{"file":"/packages/validation/package.json","types":["devDependencies"]},{"file":"/packages/wcp/package.json","types":["devDependencies"]}]}]},{"name":"apollo-graphql","versions":[{"version":"0.9.5","files":[{"file":"/packages/api-admin-settings/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["devDependencies"]}]}]},{"name":"jest-dynalite","versions":[{"version":"3.6.1","files":[{"file":"/packages/api-admin-settings/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-users-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-apw-scheduler-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-authentication/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-log/package.json","types":["devDependencies"]},{"file":"/packages/api-mailer/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-security-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-wcp/package.json","types":["devDependencies"]},{"file":"/packages/data-migration/package.json","types":["devDependencies"]},{"file":"/packages/db-dynamodb/package.json","types":["devDependencies"]},{"file":"/packages/migrations/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["devDependencies"]}]}]},{"name":"dataloader","versions":[{"version":"2.2.2","files":[{"file":"/packages/api-admin-users/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-ddb/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-so-ddb/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["dependencies"]},{"file":"/packages/api-tenancy/package.json","types":["dependencies"]}]}]},{"name":"md5","versions":[{"version":"2.3.0","files":[{"file":"/packages/api-admin-users/package.json","types":["dependencies"]},{"file":"/packages/api-security-cognito/package.json","types":["devDependencies"]}]}]},{"name":"zod","versions":[{"version":"3.23.8","files":[{"file":"/packages/api-admin-users/package.json","types":["dependencies"]},{"file":"/packages/api-apw/package.json","types":["dependencies"]},{"file":"/packages/api-file-manager/package.json","types":["dependencies"]},{"file":"/packages/api-form-builder/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-tasks/package.json","types":["dependencies"]},{"file":"/packages/api-log/package.json","types":["dependencies"]},{"file":"/packages/api-mailer/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-security/package.json","types":["dependencies"]},{"file":"/packages/api-websockets/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/ioc/package.json","types":["devDependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["dependencies"]},{"file":"/packages/tasks/package.json","types":["dependencies"]},{"file":"/packages/utils/package.json","types":["peerDependencies"]}]}]},{"name":"@types/jsonwebtoken","versions":[{"version":"9.0.2","files":[{"file":"/packages/api-admin-users/package.json","types":["devDependencies"]},{"file":"/packages/api-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/api-security/package.json","types":["devDependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["devDependencies"]},{"file":"/packages/api-security-cognito/package.json","types":["devDependencies"]}]}]},{"name":"@types/md5","versions":[{"version":"2.3.2","files":[{"file":"/packages/api-admin-users/package.json","types":["devDependencies"]}]}]},{"name":"dayjs","versions":[{"version":"1.11.13","files":[{"file":"/packages/api-apw/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]}]}]},{"name":"jsonwebtoken","versions":[{"version":"9.0.1","files":[{"file":"/packages/api-cognito-authenticator/package.json","types":["dependencies"]},{"file":"/packages/api-security/package.json","types":["dependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["dependencies"]},{"file":"/packages/api-security-okta/package.json","types":["dependencies"]}]}]},{"name":"jwk-to-pem","versions":[{"version":"2.0.1","files":[{"file":"/packages/api-cognito-authenticator/package.json","types":["dependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["dependencies"]},{"file":"/packages/api-security-okta/package.json","types":["dependencies"]}]}]},{"name":"@types/jwk-to-pem","versions":[{"version":"2.0.1","files":[{"file":"/packages/api-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["devDependencies"]}]}]},{"name":"@types/node-fetch","versions":[{"version":"2.6.1","files":[{"file":"/packages/api-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-s3/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["devDependencies"]},{"file":"/packages/api-security-okta/package.json","types":["devDependencies"]}]}]},{"name":"p-retry","versions":[{"version":"4.6.2","files":[{"file":"/packages/api-dynamodb-to-elasticsearch/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/utils/package.json","types":["dependencies"]}]}]},{"name":"@elastic/elasticsearch","versions":[{"version":"7.12.0","files":[{"file":"/packages/api-elasticsearch/package.json","types":["dependencies"]},{"file":"/packages/api-form-builder-so-ddb-es/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/data-migration/package.json","types":["dependencies"]},{"file":"/packages/migrations/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["devDependencies"]}]}]},{"name":"elastic-ts","versions":[{"version":"0.12.0","files":[{"file":"/packages/api-elasticsearch/package.json","types":["dependencies"]},{"file":"/packages/api-form-builder-so-ddb-es/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["dependencies"]},{"file":"/packages/migrations/package.json","types":["devDependencies"]}]}]},{"name":"cache-control-parser","versions":[{"version":"2.0.6","files":[{"file":"/packages/api-file-manager/package.json","types":["dependencies"]}]}]},{"name":"object-hash","versions":[{"version":"3.0.0","files":[{"file":"/packages/api-file-manager/package.json","types":["dependencies"]},{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]}]}]},{"name":"ttypescript","versions":[{"version":"1.5.15","files":[{"file":"/packages/api-file-manager-aco/package.json","types":["devDependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["devDependencies"]}]}]},{"name":"jsonpack","versions":[{"version":"1.1.5","files":[{"file":"/packages/api-file-manager-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/utils/package.json","types":["dependencies"]}]}]},{"name":"form-data","versions":[{"version":"4.0.0","files":[{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["dependencies"]}]}]},{"name":"mime","versions":[{"version":"3.0.0","files":[{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["devDependencies"]}]}]},{"name":"p-map","versions":[{"version":"4.0.0","files":[{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-workspaces/package.json","types":["dependencies"]}]}]},{"name":"p-reduce","versions":[{"version":"2.1.0","files":[{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]}]}]},{"name":"sanitize-filename","versions":[{"version":"1.6.3","files":[{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]}]}]},{"name":"sharp","versions":[{"version":"0.32.6","files":[{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]}]}]},{"name":"date-fns","versions":[{"version":"2.22.1","files":[{"file":"/packages/api-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["dependencies"]},{"file":"/packages/db-dynamodb/package.json","types":["dependencies"]}]}]},{"name":"json2csv","versions":[{"version":"4.5.4","files":[{"file":"/packages/api-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]}]}]},{"name":"slugify","versions":[{"version":"1.6.6","files":[{"file":"/packages/api-form-builder/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"@types/json2csv","versions":[{"version":"4.5.1","files":[{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-form-builder/package.json","types":["devDependencies"]}]}]},{"name":"csvtojson","versions":[{"version":"2.0.10","files":[{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb-es/package.json","types":["devDependencies"]}]}]},{"name":"@graphql-tools/merge","versions":[{"version":"9.0.24","files":[{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/handler-graphql/package.json","types":["dependencies"]}]}]},{"name":"@graphql-tools/schema","versions":[{"version":"10.0.23","files":[{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/handler-graphql/package.json","types":["dependencies"]}]}]},{"name":"dot-prop","versions":[{"version":"6.0.1","files":[{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-ddb/package.json","types":["dependencies"]},{"file":"/packages/db-dynamodb/package.json","types":["dependencies"]}]}]},{"name":"graphql-tag","versions":[{"version":"2.12.6","files":[{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/handler-graphql/package.json","types":["dependencies"]}]}]},{"name":"jsdom","versions":[{"version":"25.0.1","files":[{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/lexical-converter/package.json","types":["devDependencies"]}]}]},{"name":"pluralize","versions":[{"version":"8.0.0","files":[{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]}]}]},{"name":"@types/babel__code-frame","versions":[{"version":"7.0.6","files":[{"file":"/packages/api-headless-cms/package.json","types":["devDependencies"]}]}]},{"name":"@types/jsonpack","versions":[{"version":"1.1.6","files":[{"file":"/packages/api-headless-cms-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["devDependencies"]}]}]},{"name":"@faker-js/faker","versions":[{"version":"9.3.0","files":[{"file":"/packages/api-headless-cms-es-tasks/package.json","types":["devDependencies"]}]}]},{"name":"@smithy/node-http-handler","versions":[{"version":"2.1.6","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]}]}]},{"name":"archiver","versions":[{"version":"7.0.1","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]}]}]},{"name":"bytes","versions":[{"version":"3.1.2","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]}]}]},{"name":"uniqid","versions":[{"version":"5.4.0","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/plugins/package.json","types":["dependencies"]},{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"unzipper","versions":[{"version":"0.12.3","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["dependencies"]}]}]},{"name":"@types/adm-zip","versions":[{"version":"0.5.5","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["devDependencies"]}]}]},{"name":"@types/unzipper","versions":[{"version":"0.10.10","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["devDependencies"]}]}]},{"name":"adm-zip","versions":[{"version":"0.5.14","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["devDependencies"]}]}]},{"name":"aws-sdk-client-mock","versions":[{"version":"4.1.0","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["devDependencies"]}]}]},{"name":"accept-language-parser","versions":[{"version":"1.5.0","files":[{"file":"/packages/api-i18n/package.json","types":["dependencies"]}]}]},{"name":"i18n-locales","versions":[{"version":"0.0.5","files":[{"file":"/packages/api-i18n/package.json","types":["dependencies"]}]}]},{"name":"@types/accept-language-parser","versions":[{"version":"1.5.3","files":[{"file":"/packages/api-i18n/package.json","types":["devDependencies"]}]}]},{"name":"crypto-js","versions":[{"version":"4.2.0","files":[{"file":"/packages/api-mailer/package.json","types":["dependencies"]}]}]},{"name":"nodemailer","versions":[{"version":"6.9.16","files":[{"file":"/packages/api-mailer/package.json","types":["dependencies"]}]}]},{"name":"@types/crypto-js","versions":[{"version":"4.2.2","files":[{"file":"/packages/api-mailer/package.json","types":["devDependencies"]}]}]},{"name":"@types/nodemailer","versions":[{"version":"6.4.17","files":[{"file":"/packages/api-mailer/package.json","types":["devDependencies"]}]}]},{"name":"extract-zip","versions":[{"version":"1.6.7","files":[{"file":"/packages/api-page-builder/package.json","types":["dependencies"]}]}]},{"name":"stream","versions":[{"version":"0.0.3","files":[{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]}]}]},{"name":"@types/extract-zip","versions":[{"version":"1.6.2","files":[{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/rimraf","versions":[{"version":"3.0.2","files":[{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"dot-prop-immutable","versions":[{"version":"2.1.1","files":[{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"yauzl","versions":[{"version":"2.10.0","files":[{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]}]}]},{"name":"@types/archiver","versions":[{"version":"5.3.1","files":[{"file":"/packages/api-page-builder-import-export/package.json","types":["devDependencies"]}]}]},{"name":"@types/yauzl","versions":[{"version":"2.9.2","files":[{"file":"/packages/api-page-builder-import-export/package.json","types":["devDependencies"]}]}]},{"name":"@sparticuz/chromium","versions":[{"version":"131.0.1","files":[{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]}]}]},{"name":"posthtml","versions":[{"version":"0.15.0","files":[{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]}]}]},{"name":"posthtml-noopener","versions":[{"version":"1.0.5","files":[{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]}]}]},{"name":"posthtml-plugin-link-preload","versions":[{"version":"1.0.0","files":[{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]}]}]},{"name":"puppeteer-core","versions":[{"version":"23.11.1","files":[{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]}]}]},{"name":"srcset","versions":[{"version":"4.0.0","files":[{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]},{"file":"/packages/aws-helpers/package.json","types":["dependencies"]}]}]},{"name":"@types/object-hash","versions":[{"version":"2.2.1","files":[{"file":"/packages/api-prerendering-service/package.json","types":["devDependencies"]}]}]},{"name":"deep-equal","versions":[{"version":"2.2.3","files":[{"file":"/packages/api-security/package.json","types":["dependencies"]},{"file":"/packages/api-security-cognito/package.json","types":["dependencies"]},{"file":"/packages/tasks/package.json","types":["dependencies"]}]}]},{"name":"@apollo/react-hooks","versions":[{"version":"3.1.5","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/extensions/theme/package.json","types":["dependencies"]},{"file":"/extensions/theme/package.json","types":["dependencies"]}]}]},{"name":"@emotion/styled","versions":[{"version":"11.10.6","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/extensions/theme/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-actions/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-pb-element/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]},{"file":"/extensions/theme/package.json","types":["dependencies"]}]}]},{"name":"apollo-cache","versions":[{"version":"1.3.5","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]}]}]},{"name":"apollo-cache-inmemory","versions":[{"version":"1.6.6","files":[{"file":"/packages/app/package.json","types":["dependencies"]}]}]},{"name":"apollo-client","versions":[{"version":"2.6.10","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["devDependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["devDependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/packages/react-router/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"apollo-link","versions":[{"version":"1.2.14","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["devDependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["devDependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"apollo-link-context","versions":[{"version":"1.0.20","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]}]}]},{"name":"apollo-link-error","versions":[{"version":"1.1.13","files":[{"file":"/packages/app/package.json","types":["dependencies"]}]}]},{"name":"apollo-link-http-common","versions":[{"version":"0.2.16","files":[{"file":"/packages/app/package.json","types":["dependencies"]}]}]},{"name":"apollo-utilities","versions":[{"version":"1.3.4","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]}]}]},{"name":"boolean","versions":[{"version":"3.2.0","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/handler-graphql/package.json","types":["dependencies"]}]}]},{"name":"invariant","versions":[{"version":"2.2.4","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]}]}]},{"name":"ts-invariant","versions":[{"version":"0.10.3","files":[{"file":"/packages/app/package.json","types":["dependencies"]}]}]},{"name":"warning","versions":[{"version":"4.0.2","files":[{"file":"/packages/app/package.json","types":["dependencies"]}]}]},{"name":"@types/lodash","versions":[{"version":"4.17.13","files":[{"file":"/packages/app/package.json","types":["devDependencies"]},{"file":"/packages/app-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/form/package.json","types":["devDependencies"]},{"file":"/packages/i18n/package.json","types":["devDependencies"]},{"file":"/packages/pulumi/package.json","types":["devDependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["devDependencies"]},{"file":"/packages/validation/package.json","types":["devDependencies"]}]}]},{"name":"@types/warning","versions":[{"version":"3.0.0","files":[{"file":"/packages/app/package.json","types":["devDependencies"]}]}]},{"name":"@material-design-icons/svg","versions":[{"version":"0.14.13","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-pb-element/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@material-symbols/svg-400","versions":[{"version":"0.4.1","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]}]}]},{"name":"@minoru/react-dnd-treeview","versions":[{"version":"3.2.1","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]}]}]},{"name":"mobx","versions":[{"version":"6.9.0","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/app-utils/package.json","types":["dependencies"]},{"file":"/packages/form/package.json","types":["devDependencies"]}]}]},{"name":"mobx-react-lite","versions":[{"version":"3.4.3","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/form/package.json","types":["devDependencies"]}]}]},{"name":"pako","versions":[{"version":"2.1.0","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"react-dnd","versions":[{"version":"16.0.1","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"react-hotkeyz","versions":[{"version":"1.0.4","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]}]}]},{"name":"store","versions":[{"version":"2.0.12","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]}]}]},{"name":"@apollo/react-components","versions":[{"version":"3.1.5","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"@editorjs/editorjs","versions":[{"version":"2.26.5","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["peerDependencies"]},{"file":"/packages/react-rich-text-renderer/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@iconify/json","versions":[{"version":"2.2.142","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]}]},{"name":"@monaco-editor/react","versions":[{"version":"4.7.0","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]}]},{"name":"@svgr/webpack","versions":[{"version":"6.1.1","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@types/mime","versions":[{"version":"2.0.3","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]}]},{"name":"classnames","versions":[{"version":"2.5.1","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/react-rich-text-renderer/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"downshift","versions":[{"version":"3.1.2","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]},{"version":"2.1.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"emotion","versions":[{"version":"10.0.27","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-i18n-content/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-actions/package.json","types":["dependencies"]},{"file":"/packages/lexical-theme/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"graphlib","versions":[{"version":"2.1.8","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-workspaces/package.json","types":["dependencies"]}]}]},{"name":"is-hotkey","versions":[{"version":"0.2.0","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"prop-types","versions":[{"version":"15.8.1","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]}]}]},{"name":"react-draggable","versions":[{"version":"4.4.6","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]}]},{"name":"react-resizable","versions":[{"version":"3.0.5","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]}]},{"name":"react-resizable-panels","versions":[{"version":"2.0.19","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]}]},{"name":"react-transition-group","versions":[{"version":"4.4.5","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"react-virtualized","versions":[{"version":"9.22.5","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"reset-css","versions":[{"version":"5.0.1","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]}]}]},{"name":"unicode-emoji-json","versions":[{"version":"0.4.0","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]}]},{"name":"@emotion/babel-plugin","versions":[{"version":"11.11.0","files":[{"file":"/packages/app-admin/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["devDependencies"]},{"file":"/packages/app-apw/package.json","types":["devDependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["devDependencies"]},{"file":"/packages/app-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n-content/package.json","types":["devDependencies"]},{"file":"/packages/app-mailer/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-security/package.json","types":["devDependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["devDependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-theme/package.json","types":["devDependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["devDependencies"]},{"file":"/packages/theme/package.json","types":["devDependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"@types/bytes","versions":[{"version":"3.1.4","files":[{"file":"/packages/app-admin/package.json","types":["devDependencies"]}]}]},{"name":"@types/graphlib","versions":[{"version":"2.1.12","files":[{"file":"/packages/app-admin/package.json","types":["devDependencies"]}]}]},{"name":"@types/is-hotkey","versions":[{"version":"0.1.10","files":[{"file":"/packages/app-admin/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/react-resizable","versions":[{"version":"3.0.8","files":[{"file":"/packages/app-admin/package.json","types":["devDependencies"]}]}]},{"name":"@types/store","versions":[{"version":"2.0.2","files":[{"file":"/packages/app-admin/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"monaco-editor","versions":[{"version":"0.52.2","files":[{"file":"/packages/app-admin/package.json","types":["devDependencies"]}]}]},{"name":"@auth0/auth0-react","versions":[{"version":"2.2.4","files":[{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]}]}]},{"name":"react-helmet","versions":[{"version":"6.1.0","files":[{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]}]}]},{"name":"@aws-amplify/auth","versions":[{"version":"5.6.15","files":[{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-cognito-authenticator/package.json","types":["dependencies"]}]}]},{"name":"@okta/okta-auth-js","versions":[{"version":"5.3.1","files":[{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]}]}]},{"name":"@okta/okta-react","versions":[{"version":"6.1.0","files":[{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]}]}]},{"name":"@okta/okta-signin-widget","versions":[{"version":"5.9.4","files":[{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/base","versions":[{"version":"14.3.5","files":[{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/provider","versions":[{"version":"14.3.5","files":[{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]}]}]},{"name":"@types/react-helmet","versions":[{"version":"6.1.11","files":[{"file":"/packages/app-admin-rmwc/package.json","types":["devDependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["devDependencies"]},{"file":"/apps/website/package.json","types":["devDependencies"]}]}]},{"name":"babel-plugin-named-asset-import","versions":[{"version":"1.0.0-next.3e165448","files":[{"file":"/packages/app-admin-rmwc/package.json","types":["devDependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["devDependencies"]}]}]},{"name":"@emotion/is-prop-valid","versions":[{"version":"1.1.1","files":[{"file":"/packages/app-apw/package.json","types":["dependencies"]}]}]},{"name":"react-spinner-material","versions":[{"version":"1.1.4","files":[{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@fortawesome/fontawesome-svg-core","versions":[{"version":"1.3.0","files":[{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"@fortawesome/react-fontawesome","versions":[{"version":"0.1.17","files":[{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"@apollo/react-common","versions":[{"version":"3.1.4","files":[{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"dataurl-to-blob","versions":[{"version":"0.0.1","files":[{"file":"/packages/app-file-manager/package.json","types":["dependencies"]}]}]},{"name":"react-butterfiles","versions":[{"version":"1.3.3","files":[{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"react-custom-scrollbars","versions":[{"version":"4.2.1","files":[{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"react-lazy-load","versions":[{"version":"3.1.14","files":[{"file":"/packages/app-file-manager/package.json","types":["dependencies"]}]}]},{"name":"@dnd-kit/core","versions":[{"version":"6.1.0","files":[{"file":"/packages/app-form-builder/package.json","types":["dependencies"]}]}]},{"name":"@dnd-kit/sortable","versions":[{"version":"8.0.0","files":[{"file":"/packages/app-form-builder/package.json","types":["dependencies"]}]}]},{"name":"@dnd-kit/utilities","versions":[{"version":"3.2.2","files":[{"file":"/packages/app-form-builder/package.json","types":["dependencies"]}]}]},{"name":"dnd-core","versions":[{"version":"16.0.1","files":[{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"history","versions":[{"version":"5.3.0","files":[{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/react-router/package.json","types":["dependencies"]}]}]},{"name":"react-dnd-html5-backend","versions":[{"version":"16.0.1","files":[{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"react-google-recaptcha","versions":[{"version":"1.1.0","files":[{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["peerDependencies"]}]}]},{"name":"@types/gtag.js","versions":[{"version":"0.0.20","files":[{"file":"/packages/app-form-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/react-google-recaptcha","versions":[{"version":"1.1.2","files":[{"file":"/packages/app-form-builder/package.json","types":["devDependencies"]}]}]},{"name":"load-script","versions":[{"version":"1.0.0","files":[{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@fortawesome/fontawesome-common-types","versions":[{"version":"0.3.0","files":[{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"@fortawesome/free-brands-svg-icons","versions":[{"version":"6.0.0","files":[{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"@fortawesome/free-regular-svg-icons","versions":[{"version":"6.0.0","files":[{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"@fortawesome/free-solid-svg-icons","versions":[{"version":"6.0.0","files":[{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"raw.macro","versions":[{"version":"0.4.2","files":[{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]}]}]},{"name":"use-deep-compare-effect","versions":[{"version":"1.8.1","files":[{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]}]}]},{"name":"@types/medium-editor","versions":[{"version":"5.0.3","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"aos","versions":[{"version":"2.3.4","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["peerDependencies"]}]}]},{"name":"dnd-kit-sortable-tree","versions":[{"version":"0.1.73","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"medium-editor","versions":[{"version":"5.23.3","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"platform","versions":[{"version":"1.3.5","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"react-color","versions":[{"version":"2.19.3","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-actions/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"react-images","versions":[{"version":"0.5.19","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["peerDependencies"]}]}]},{"name":"react-in-viewport","versions":[{"version":"1.0.0-alpha.30","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"react-sortable","versions":[{"version":"2.0.0","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"recoil","versions":[{"version":"0.7.7","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"swiper","versions":[{"version":"9.3.2","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["peerDependencies"]}]}]},{"name":"@types/aos","versions":[{"version":"3.0.4","files":[{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/pako","versions":[{"version":"2.0.3","files":[{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/platform","versions":[{"version":"1.3.4","files":[{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/react-images","versions":[{"version":"0.5.3","files":[{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/react-virtualized","versions":[{"version":"9.21.16","files":[{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/resize-observer-browser","versions":[{"version":"0.1.4","files":[{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"facepaint","versions":[{"version":"1.2.1","files":[{"file":"/packages/app-page-builder-elements/package.json","types":["dependencies"]}]}]},{"name":"@types/facepaint","versions":[{"version":"1.2.2","files":[{"file":"/packages/app-page-builder-elements/package.json","types":["devDependencies"]}]}]},{"name":"react-columned","versions":[{"version":"1.1.3","files":[{"file":"/packages/app-page-builder-elements/package.json","types":["peerDependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"crypto-hash","versions":[{"version":"3.0.0","files":[{"file":"/packages/app-record-locking/package.json","types":["dependencies"]}]}]},{"name":"apollo-link-batch-http","versions":[{"version":"1.2.14","files":[{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]}]}]},{"name":"@emotion/cache","versions":[{"version":"11.10.5","files":[{"file":"/packages/app-website/package.json","types":["dependencies"]}]}]},{"name":"lz-string","versions":[{"version":"1.5.0","files":[{"file":"/packages/app-website/package.json","types":["dependencies"]}]}]},{"name":"@types/aws-lambda","versions":[{"version":"8.10.145","files":[{"file":"/packages/aws-helpers/package.json","types":["dependencies"]},{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"cheerio","versions":[{"version":"1.0.0-rc.10","files":[{"file":"/packages/aws-helpers/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-apigatewaymanagementapi","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-cloudfront","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-cloudwatch-events","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-cloudwatch-logs","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-cognito-identity-provider","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-dynamodb","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-dynamodb-streams","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-eventbridge","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-iam","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-iot","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-lambda","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-s3","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-sfn","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-sqs","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-sts","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/credential-providers","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/lib-dynamodb","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/lib-storage","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/s3-presigned-post","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/s3-request-presigner","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/util-dynamodb","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"camelcase","versions":[{"version":"6.3.0","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"ci-info","versions":[{"version":"4.1.0","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/telemetry/package.json","types":["dependencies"]}]}]},{"name":"dotenv","versions":[{"version":"8.2.0","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["devDependencies"]}]}]},{"name":"fast-glob","versions":[{"version":"3.2.7","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies","devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]}]}]},{"name":"find-up","versions":[{"version":"5.0.0","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/pulumi/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["dependencies"]}]}]},{"name":"graphql-request","versions":[{"version":"3.7.0","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/cypress-tests/package.json","types":["devDependencies"]},{"file":"/apps/api/graphql/package.json","types":["devDependencies"]}]}]},{"name":"ncp","versions":[{"version":"2.0.0","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"open","versions":[{"version":"8.4.2","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]}]}]},{"name":"pirates","versions":[{"version":"4.0.6","files":[{"file":"/packages/cli/package.json","types":["dependencies"]}]}]},{"name":"ts-morph","versions":[{"version":"11.0.0","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]}]}]},{"name":"exit-hook","versions":[{"version":"4.0.0","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]}]}]},{"name":"humanize-duration","versions":[{"version":"3.32.1","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]}]}]},{"name":"log-update","versions":[{"version":"4.0.0","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]}]}]},{"name":"mqtt","versions":[{"version":"5.10.3","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]}]}]},{"name":"node-notifier","versions":[{"version":"10.0.1","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]}]}]},{"name":"ora","versions":[{"version":"4.1.1","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]}]}]},{"name":"replace-in-path","versions":[{"version":"1.1.0","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["dependencies"]}]}]},{"name":"serialize-error","versions":[{"version":"8.0.0","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]}]}]},{"name":"@types/humanize-duration","versions":[{"version":"3.27.4","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["devDependencies"]}]}]},{"name":"@types/listr","versions":[{"version":"0.14.9","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["devDependencies"]}]}]},{"name":"@types/node-notifier","versions":[{"version":"8.0.5","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["devDependencies"]}]}]},{"name":"case","versions":[{"version":"1.6.3","files":[{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["dependencies"]}]}]},{"name":"validate-npm-package-name","versions":[{"version":"3.0.0","files":[{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]}]}]},{"name":"@types/inquirer","versions":[{"version":"8.2.10","files":[{"file":"/packages/cli-plugin-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["devDependencies"]}]}]},{"name":"terminal-link","versions":[{"version":"2.1.1","files":[{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]}]}]},{"name":"@types/ncp","versions":[{"version":"2.0.4","files":[{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["devDependencies"]}]}]},{"name":"@types/pluralize","versions":[{"version":"0.0.29","files":[{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["devDependencies"]}]}]},{"name":"js-base64","versions":[{"version":"3.7.7","files":[{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["dependencies"]}]}]},{"name":"octokit","versions":[{"version":"3.1.2","files":[{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["dependencies"]}]}]},{"name":"@types/validate-npm-package-name","versions":[{"version":"3.0.3","files":[{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["devDependencies"]}]}]},{"name":"indent-string","versions":[{"version":"5.0.0","files":[{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]}]}]},{"name":"archy","versions":[{"version":"1.0.0","files":[{"file":"/packages/cli-plugin-workspaces/package.json","types":["dependencies"]}]}]},{"name":"color","versions":[{"version":"4.2.3","files":[{"file":"/packages/cli-plugin-workspaces/package.json","types":["dependencies"]}]}]},{"name":"multimatch","versions":[{"version":"5.0.0","files":[{"file":"/packages/cli-plugin-workspaces/package.json","types":["dependencies"]}]}]},{"name":"js-yaml","versions":[{"version":"3.14.1","files":[{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]}]}]},{"name":"os","versions":[{"version":"0.1.1","files":[{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]}]}]},{"name":"uuid","versions":[{"version":"9.0.1","files":[{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/global-config/package.json","types":["dependencies"]}]}]},{"name":"yesno","versions":[{"version":"0.4.0","files":[{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]}]}]},{"name":"@editorjs/delimiter","versions":[{"version":"1.4.2","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]}]}]},{"name":"@editorjs/list","versions":[{"version":"1.10.0","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]}]}]},{"name":"@editorjs/quote","versions":[{"version":"2.7.2","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]}]}]},{"name":"@editorjs/underline","versions":[{"version":"1.2.1","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]}]}]},{"name":"core-js","versions":[{"version":"3.39.0","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"cross-fetch","versions":[{"version":"3.1.5","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"regenerator-runtime","versions":[{"version":"0.13.11","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"theme","versions":[{"version":"1.0.0","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"tslib","versions":[{"version":"2.8.1","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]}]}]},{"name":"react-hamburger-menu","versions":[{"version":"1.2.1","files":[{"file":"/packages/cwp-template-aws/template/common/extensions/theme/package.json","types":["dependencies"]},{"file":"/extensions/theme/package.json","types":["dependencies"]}]}]},{"name":"@types/react-hamburger-menu","versions":[{"version":"0.0.4","files":[{"file":"/packages/cwp-template-aws/template/common/extensions/theme/package.json","types":["devDependencies"]},{"file":"/extensions/theme/package.json","types":["devDependencies"]}]}]},{"name":"merge","versions":[{"version":"2.1.1","files":[{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"center-align","versions":[{"version":"1.0.1","files":[{"file":"/packages/data-migration/package.json","types":["dependencies"]}]}]},{"name":"pino-pretty","versions":[{"version":"9.4.0","files":[{"file":"/packages/data-migration/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["devDependencies"]}]}]},{"name":"@types/center-align","versions":[{"version":"1.0.0","files":[{"file":"/packages/data-migration/package.json","types":["devDependencies"]}]}]},{"name":"@types/semver","versions":[{"version":"7.3.4","files":[{"file":"/packages/data-migration/package.json","types":["devDependencies"]}]}]},{"name":"jest-mock-console","versions":[{"version":"2.0.0","files":[{"file":"/packages/data-migration/package.json","types":["devDependencies"]},{"file":"/packages/handler-graphql/package.json","types":["devDependencies"]}]}]},{"name":"dynamodb-toolbox","versions":[{"version":"0.9.2","files":[{"file":"/packages/db-dynamodb/package.json","types":["dependencies"]}]}]},{"name":"fuse.js","versions":[{"version":"7.0.0","files":[{"file":"/packages/db-dynamodb/package.json","types":["dependencies"]}]}]},{"name":"@types/is-number","versions":[{"version":"7.0.5","files":[{"file":"/packages/db-dynamodb/package.json","types":["devDependencies"]}]}]},{"name":"reflect-metadata","versions":[{"version":"0.2.2","files":[{"file":"/packages/di-container/package.json","types":["dependencies"]},{"file":"/packages/ioc/package.json","types":["dependencies"]}]}]},{"name":"@types/uniqid","versions":[{"version":"5.3.2","files":[{"file":"/packages/feature-flags/package.json","types":["devDependencies"]},{"file":"/packages/plugins/package.json","types":["devDependencies"]}]}]},{"name":"@testing-library/react","versions":[{"version":"15.0.7","files":[{"file":"/packages/form/package.json","types":["devDependencies"]},{"file":"/packages/react-composition/package.json","types":["devDependencies"]},{"file":"/packages/react-properties/package.json","types":["devDependencies"]},{"file":"/packages/react-rich-text-lexical-renderer/package.json","types":["devDependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"@testing-library/user-event","versions":[{"version":"14.5.2","files":[{"file":"/packages/form/package.json","types":["devDependencies"]}]}]},{"name":"@types/invariant","versions":[{"version":"2.2.35","files":[{"file":"/packages/form/package.json","types":["devDependencies"]}]}]},{"name":"@fastify/compress","versions":[{"version":"7.0.3","files":[{"file":"/packages/handler/package.json","types":["dependencies"]}]}]},{"name":"@fastify/cookie","versions":[{"version":"9.4.0","files":[{"file":"/packages/handler/package.json","types":["dependencies"]}]}]},{"name":"fastify","versions":[{"version":"4.29.1","files":[{"file":"/packages/handler/package.json","types":["dependencies"]},{"file":"/packages/handler-aws/package.json","types":["dependencies"]}]}]},{"name":"@fastify/aws-lambda","versions":[{"version":"4.1.0","files":[{"file":"/packages/handler-aws/package.json","types":["dependencies"]}]}]},{"name":"@graphql-tools/resolvers-composition","versions":[{"version":"7.0.18","files":[{"file":"/packages/handler-graphql/package.json","types":["dependencies"]}]}]},{"name":"@graphql-tools/utils","versions":[{"version":"10.8.6","files":[{"file":"/packages/handler-graphql/package.json","types":["dependencies"]}]}]},{"name":"graphql-scalars","versions":[{"version":"1.12.0","files":[{"file":"/packages/handler-graphql/package.json","types":["dependencies"]}]}]},{"name":"accounting","versions":[{"version":"0.4.1","files":[{"file":"/packages/i18n/package.json","types":["dependencies"]}]}]},{"name":"fecha","versions":[{"version":"2.3.3","files":[{"file":"/packages/i18n/package.json","types":["dependencies"]}]}]},{"name":"short-hash","versions":[{"version":"1.0.0","files":[{"file":"/packages/i18n/package.json","types":["dependencies"]}]}]},{"name":"@types/accounting","versions":[{"version":"0.4.2","files":[{"file":"/packages/i18n/package.json","types":["devDependencies"]}]}]},{"name":"inversify","versions":[{"version":"6.1.6","files":[{"file":"/packages/ioc/package.json","types":["dependencies"]}]}]},{"name":"@types/jsdom","versions":[{"version":"21.1.6","files":[{"file":"/packages/lexical-converter/package.json","types":["devDependencies"]}]}]},{"name":"@types/react-color","versions":[{"version":"2.17.11","files":[{"file":"/packages/lexical-editor-actions/package.json","types":["devDependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"@types/prismjs","versions":[{"version":"1.26.4","files":[{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"react-style-object-to-css","versions":[{"version":"1.1.2","files":[{"file":"/packages/lexical-theme/package.json","types":["dependencies"]}]}]},{"name":"pino","versions":[{"version":"8.21.0","files":[{"file":"/packages/logger/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["devDependencies"]}]}]},{"name":"@pmmmwh/react-refresh-webpack-plugin","versions":[{"version":"0.5.15","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@rspack/core","versions":[{"version":"1.3.13","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@rspack/dev-server","versions":[{"version":"1.1.3","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@rspack/plugin-react-refresh","versions":[{"version":"1.4.3","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@swc/plugin-emotion","versions":[{"version":"9.0.4","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@types/webpack-env","versions":[{"version":"1.18.5","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"assert-browserify","versions":[{"version":"2.0.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"buffer","versions":[{"version":"6.0.3","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"bufferutil","versions":[{"version":"4.0.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"case-sensitive-paths-webpack-plugin","versions":[{"version":"2.4.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"crypto-browserify","versions":[{"version":"3.12.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"css-loader","versions":[{"version":"6.10.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"css-minimizer-webpack-plugin","versions":[{"version":"7.0.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"eslint-config-react-app","versions":[{"version":"6.0.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"eslint-webpack-plugin","versions":[{"version":"4.2.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"file-loader","versions":[{"version":"6.2.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"fork-ts-checker-webpack-plugin","versions":[{"version":"9.0.2","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"html-webpack-plugin","versions":[{"version":"5.6.3","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"mini-css-extract-plugin","versions":[{"version":"2.4.5","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"null-loader","versions":[{"version":"4.0.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"os-browserify","versions":[{"version":"0.3.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"path-browserify","versions":[{"version":"1.0.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"postcss-flexbugs-fixes","versions":[{"version":"5.0.2","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"postcss-loader","versions":[{"version":"6.2.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"postcss-normalize","versions":[{"version":"10.0.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"postcss-preset-env","versions":[{"version":"9.4.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"process","versions":[{"version":"0.11.10","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"raw-loader","versions":[{"version":"4.0.2","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"react-dev-utils","versions":[{"version":"12.0.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"react-refresh","versions":[{"version":"0.11.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"read-json-sync","versions":[{"version":"2.0.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"resolve","versions":[{"version":"1.22.8","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"resolve-url-loader","versions":[{"version":"5.0.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"sass","versions":[{"version":"1.44.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"sass-loader","versions":[{"version":"12.3.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"scheduler","versions":[{"version":"0.19.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"source-map-loader","versions":[{"version":"1.1.3","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"source-map-support","versions":[{"version":"0.5.21","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"style-loader","versions":[{"version":"3.3.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"terser-webpack-plugin","versions":[{"version":"5.3.10","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"ts-checker-rspack-plugin","versions":[{"version":"1.0.3","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"ts-patch","versions":[{"version":"3.3.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"url","versions":[{"version":"0.11.4","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"url-loader","versions":[{"version":"4.1.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"utf-8-validate","versions":[{"version":"5.0.2","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"vm-browserify","versions":[{"version":"1.1.2","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"webpack","versions":[{"version":"5.97.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]}]}]},{"name":"webpack-dev-server","versions":[{"version":"4.15.2","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"webpack-manifest-plugin","versions":[{"version":"5.0.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"webpackbar","versions":[{"version":"7.0.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"listr2","versions":[{"version":"5.0.8","files":[{"file":"/packages/project-utils/package.json","types":["devDependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]}]}]},{"name":"@pulumi/pulumi","versions":[{"version":"3.147.0","files":[{"file":"/packages/pulumi/package.json","types":["dependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["dependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]}]}]},{"name":"@pulumi/aws","versions":[{"version":"6.67.0","files":[{"file":"/packages/pulumi-aws/package.json","types":["dependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]}]}]},{"name":"@pulumi/random","versions":[{"version":"4.17.0","files":[{"file":"/packages/pulumi-aws/package.json","types":["dependencies"]}]}]},{"name":"decompress","versions":[{"version":"4.2.1","files":[{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]}]}]},{"name":"identity-obj-proxy","versions":[{"version":"3.0.0","files":[{"file":"/packages/react-rich-text-lexical-renderer/package.json","types":["devDependencies"]}]}]},{"name":"sanitize-html","versions":[{"version":"2.12.1","files":[{"file":"/packages/react-rich-text-renderer/package.json","types":["dependencies"]}]}]},{"name":"@types/sanitize-html","versions":[{"version":"2.9.0","files":[{"file":"/packages/react-rich-text-renderer/package.json","types":["devDependencies"]}]}]},{"name":"react-router-dom","versions":[{"version":"6.3.0","files":[{"file":"/packages/react-router/package.json","types":["dependencies"]}]}]},{"name":"cli-table3","versions":[{"version":"0.6.5","files":[{"file":"/packages/system-requirements/package.json","types":["dependencies"]}]}]},{"name":"object-merge-advanced","versions":[{"version":"12.1.0","files":[{"file":"/packages/tasks/package.json","types":["dependencies"]}]}]},{"name":"object-sizeof","versions":[{"version":"2.6.4","files":[{"file":"/packages/tasks/package.json","types":["dependencies"]}]}]},{"name":"jsesc","versions":[{"version":"3.0.2","files":[{"file":"/packages/telemetry/package.json","types":["dependencies"]}]}]},{"name":"strip-ansi","versions":[{"version":"6.0.1","files":[{"file":"/packages/telemetry/package.json","types":["dependencies"]}]}]},{"name":"wts-client","versions":[{"version":"1.0.1","files":[{"file":"/packages/telemetry/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/button","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/checkbox","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/chip","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/data-table","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/dialog","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/drawer","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/elevation","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/fab","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/grid","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/icon-button","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/list","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/menu","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/radio","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/ripple","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/select","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/slider","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/snackbar","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/switch","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/tabs","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/textfield","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/top-app-bar","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/touch-target","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/typography","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@tanstack/react-table","versions":[{"version":"8.5.22","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"brace","versions":[{"version":"0.11.1","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"cropperjs","versions":[{"version":"1.4.3","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"keycode","versions":[{"version":"2.2.0","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"material-components-web","versions":[{"version":"14.0.0","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"nprogress","versions":[{"version":"0.2.0","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"nuka-carousel","versions":[{"version":"4.7.1","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"rc-tooltip","versions":[{"version":"5.3.1","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"react-ace","versions":[{"version":"6.1.4","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"react-loading-skeleton","versions":[{"version":"3.1.0","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"timeago-react","versions":[{"version":"3.0.6","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@types/nprogress","versions":[{"version":"0.2.0","files":[{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"@types/react-custom-scrollbars","versions":[{"version":"4.0.10","files":[{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"@types/react-transition-group","versions":[{"version":"4.4.4","files":[{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"p-wait-for","versions":[{"version":"4.1.0","files":[{"file":"/packages/ui-composer/package.json","types":["dependencies"]}]}]},{"name":"mdbid","versions":[{"version":"1.0.0","files":[{"file":"/packages/utils/package.json","types":["dependencies"]}]}]},{"name":"nanoid-dictionary","versions":[{"version":"4.3.0","files":[{"file":"/packages/utils/package.json","types":["dependencies"]}]}]},{"name":"isnumeric","versions":[{"version":"0.3.3","files":[{"file":"/packages/validation/package.json","types":["dependencies"]}]}]},{"name":"@4tw/cypress-drag-drop","versions":[{"version":"1.4.0","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"@testing-library/cypress","versions":[{"version":"10.0.0","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"amazon-cognito-identity-js","versions":[{"version":"4.5.3","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"cypress","versions":[{"version":"13.16.0","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"cypress-image-snapshot","versions":[{"version":"4.0.1","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"cypress-mailosaur","versions":[{"version":"2.7.0","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"cypress-wait-until","versions":[{"version":"1.7.1","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"del","versions":[{"version":"6.0.0","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"source-map-explorer","versions":[{"version":"2.5.3","files":[{"file":"/apps/website/package.json","types":["devDependencies"]}]}]},{"name":"@types/folder-hash","versions":[{"version":"4.0.4","files":[{"file":"/scripts/buildPackages/package.json","types":["devDependencies"]}]}]},{"name":"@types/yargs","versions":[{"version":"17.0.8","files":[{"file":"/scripts/buildPackages/package.json","types":["devDependencies"]}]}]}]} +{"dependencies":[{"name":"@apollo/react-common","version":"3.1.4","files":["/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"@apollo/react-components","version":"3.1.5","files":["/packages/app-admin/package.json","/packages/app-file-manager/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json"]},{"name":"@apollo/react-hooks","version":"3.1.5","files":["/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n/package.json","/packages/app-page-builder/package.json","/packages/app-record-locking/package.json","/packages/app-security-access-management/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/cwp-template-aws/template/common/extensions/theme/package.json","/extensions/theme/package.json"]},{"name":"@auth0/auth0-react","version":"2.2.4","files":["/packages/app-admin-auth0/package.json"]},{"name":"@aws-amplify/auth","version":"5.6.15","files":["/packages/app-admin-cognito/package.json","/packages/app-cognito-authenticator/package.json"]},{"name":"@aws-sdk/client-apigatewaymanagementapi","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-cloudfront","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-cloudwatch-events","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-cloudwatch-logs","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-cognito-identity-provider","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-dynamodb","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-dynamodb-streams","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-eventbridge","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-iam","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-iot","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-lambda","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-s3","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-sfn","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-sqs","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/client-sts","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/credential-providers","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/lib-dynamodb","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/lib-storage","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/s3-presigned-post","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/s3-request-presigner","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@aws-sdk/util-dynamodb","version":"3.821.0","files":["/packages/aws-sdk/package.json"]},{"name":"@babel/cli","version":"7.27.2","files":["/packages/project-utils/package.json"]},{"name":"@babel/code-frame","version":"7.27.1","files":["/packages/api-headless-cms/package.json"]},{"name":"@babel/core","version":"7.27.4","files":["/packages/project-utils/package.json"]},{"name":"@babel/plugin-proposal-class-properties","version":"7.18.6","files":["/packages/project-utils/package.json"]},{"name":"@babel/plugin-proposal-object-rest-spread","version":"7.20.7","files":["/packages/project-utils/package.json"]},{"name":"@babel/plugin-proposal-throw-expressions","version":"7.27.1","files":["/packages/project-utils/package.json"]},{"name":"@babel/plugin-syntax-object-rest-spread","version":"7.8.3","files":["/packages/project-utils/package.json"]},{"name":"@babel/preset-env","version":"7.27.2","files":["/packages/project-utils/package.json"]},{"name":"@babel/preset-react","version":"7.27.1","files":["/packages/project-utils/package.json"]},{"name":"@babel/preset-typescript","version":"7.27.1","files":["/packages/project-utils/package.json"]},{"name":"@babel/runtime","version":"7.27.4","files":["/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-extensions/package.json","/packages/project-utils/package.json"]},{"name":"@dnd-kit/core","version":"6.1.0","files":["/packages/app-form-builder/package.json"]},{"name":"@dnd-kit/sortable","version":"8.0.0","files":["/packages/app-form-builder/package.json"]},{"name":"@dnd-kit/utilities","version":"3.2.2","files":["/packages/app-form-builder/package.json"]},{"name":"@editorjs/delimiter","version":"1.4.2","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/apps/admin/package.json"]},{"name":"@editorjs/editorjs","version":"2.26.5","files":["/packages/app-admin/package.json","/packages/app-form-builder/package.json","/packages/react-rich-text-renderer/package.json","/packages/ui/package.json"]},{"name":"@editorjs/list","version":"1.10.0","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/apps/admin/package.json"]},{"name":"@editorjs/quote","version":"2.7.2","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/apps/admin/package.json"]},{"name":"@editorjs/underline","version":"1.2.1","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/apps/admin/package.json"]},{"name":"@elastic/elasticsearch","version":"7.12.0","files":["/packages/api-elasticsearch/package.json","/packages/api-form-builder-so-ddb-es/package.json","/packages/data-migration/package.json","/packages/migrations/package.json"]},{"name":"@emotion/cache","version":"11.10.5","files":["/packages/app-website/package.json"]},{"name":"@emotion/is-prop-valid","version":"1.1.1","files":["/packages/app-apw/package.json"]},{"name":"@emotion/react","version":"11.10.8","files":["/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-page-builder-elements/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/packages/cwp-template-aws/template/common/extensions/theme/package.json","/packages/lexical-editor/package.json","/packages/lexical-theme/package.json","/packages/theme/package.json","/packages/ui/package.json","/apps/website/package.json","/extensions/theme/package.json"]},{"name":"@emotion/styled","version":"11.10.6","files":["/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-page-builder/package.json","/packages/app-page-builder-elements/package.json","/packages/app-record-locking/package.json","/packages/app-security-access-management/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-trash-bin/package.json","/packages/app-website/package.json","/packages/cwp-template-aws/template/common/extensions/theme/package.json","/packages/lexical-editor-actions/package.json","/packages/lexical-editor-pb-element/package.json","/packages/ui/package.json","/extensions/theme/package.json"]},{"name":"@fastify/aws-lambda","version":"4.1.0","files":["/packages/handler-aws/package.json"]},{"name":"@fastify/compress","version":"7.0.3","files":["/packages/handler/package.json"]},{"name":"@fastify/cookie","version":"9.4.0","files":["/packages/handler/package.json"]},{"name":"@fortawesome/fontawesome-common-types","version":"0.3.0","files":["/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"@fortawesome/fontawesome-svg-core","version":"1.3.0","files":["/packages/app-dynamic-pages/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-page-builder/package.json"]},{"name":"@fortawesome/free-brands-svg-icons","version":"6.0.0","files":["/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"@fortawesome/free-regular-svg-icons","version":"6.0.0","files":["/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"@fortawesome/free-solid-svg-icons","version":"6.0.0","files":["/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"@fortawesome/react-fontawesome","version":"0.1.17","files":["/packages/app-dynamic-pages/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"@graphql-tools/merge","version":"9.0.24","files":["/packages/api-headless-cms/package.json","/packages/handler-graphql/package.json"]},{"name":"@graphql-tools/resolvers-composition","version":"7.0.18","files":["/packages/handler-graphql/package.json"]},{"name":"@graphql-tools/schema","version":"10.0.23","files":["/packages/api-headless-cms/package.json","/packages/handler-graphql/package.json"]},{"name":"@graphql-tools/utils","version":"10.8.6","files":["/packages/handler-graphql/package.json"]},{"name":"@iconify/json","version":"2.2.142","files":["/packages/app-admin/package.json"]},{"name":"@lexical/code","version":"0.23.1","files":["/packages/lexical-editor/package.json","/packages/lexical-nodes/package.json"]},{"name":"@lexical/hashtag","version":"0.23.1","files":["/packages/lexical-nodes/package.json"]},{"name":"@lexical/headless","version":"0.23.1","files":["/packages/lexical-converter/package.json"]},{"name":"@lexical/history","version":"0.23.1","files":["/packages/lexical-editor/package.json","/packages/lexical-nodes/package.json"]},{"name":"@lexical/html","version":"0.23.1","files":["/packages/lexical-converter/package.json"]},{"name":"@lexical/list","version":"0.23.1","files":["/packages/lexical-nodes/package.json"]},{"name":"@lexical/mark","version":"0.23.1","files":["/packages/lexical-nodes/package.json"]},{"name":"@lexical/overflow","version":"0.23.1","files":["/packages/lexical-nodes/package.json"]},{"name":"@lexical/react","version":"0.23.1","files":["/packages/lexical-editor/package.json","/packages/lexical-nodes/package.json"]},{"name":"@lexical/rich-text","version":"0.23.1","files":["/packages/lexical-editor/package.json","/packages/lexical-nodes/package.json"]},{"name":"@lexical/selection","version":"0.23.1","files":["/packages/lexical-editor/package.json","/packages/lexical-editor-actions/package.json","/packages/lexical-nodes/package.json"]},{"name":"@lexical/text","version":"0.23.1","files":["/packages/lexical-editor/package.json"]},{"name":"@lexical/utils","version":"0.23.1","files":["/packages/app-headless-cms/package.json","/packages/lexical-editor/package.json","/packages/lexical-editor-pb-element/package.json","/packages/lexical-nodes/package.json"]},{"name":"@material-design-icons/svg","version":"0.14.13","files":["/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-rmwc/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json","/packages/app-record-locking/package.json","/packages/app-security-access-management/package.json","/packages/app-trash-bin/package.json","/packages/lexical-editor-pb-element/package.json","/packages/ui/package.json"]},{"name":"@material-symbols/svg-400","version":"0.4.1","files":["/packages/app-aco/package.json","/packages/app-form-builder/package.json"]},{"name":"@minoru/react-dnd-treeview","version":"3.2.1","files":["/packages/app-aco/package.json"]},{"name":"@monaco-editor/react","version":"4.7.0","files":["/packages/app-admin/package.json"]},{"name":"@okta/okta-auth-js","version":"5.3.1","files":["/packages/app-admin-okta/package.json"]},{"name":"@okta/okta-react","version":"6.1.0","files":["/packages/app-admin-okta/package.json"]},{"name":"@okta/okta-signin-widget","version":"5.9.4","files":["/packages/app-admin-okta/package.json"]},{"name":"@pmmmwh/react-refresh-webpack-plugin","version":"0.5.15","files":["/packages/project-utils/package.json"]},{"name":"@pulumi/aws","version":"6.67.0","files":["/packages/pulumi-aws/package.json","/packages/pulumi-sdk/package.json","/packages/serverless-cms-aws/package.json"]},{"name":"@pulumi/pulumi","version":"3.147.0","files":["/packages/pulumi/package.json","/packages/pulumi-aws/package.json","/packages/pulumi-sdk/package.json","/packages/serverless-cms-aws/package.json"]},{"name":"@pulumi/random","version":"4.17.0","files":["/packages/pulumi-aws/package.json"]},{"name":"@rmwc/base","version":"14.3.5","files":["/packages/app-admin-rmwc/package.json"]},{"name":"@rmwc/button","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/checkbox","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/chip","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/data-table","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/dialog","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/drawer","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/elevation","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/fab","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/grid","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/icon-button","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/list","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/menu","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/provider","version":"14.3.5","files":["/packages/app-admin-rmwc/package.json"]},{"name":"@rmwc/radio","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/ripple","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/select","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/slider","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/snackbar","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/switch","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/tabs","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/textfield","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/top-app-bar","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/touch-target","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rmwc/typography","version":"14.3.5","files":["/packages/ui/package.json"]},{"name":"@rspack/core","version":"1.3.13","files":["/packages/project-utils/package.json"]},{"name":"@rspack/dev-server","version":"1.1.3","files":["/packages/project-utils/package.json"]},{"name":"@rspack/plugin-react-refresh","version":"1.4.3","files":["/packages/project-utils/package.json"]},{"name":"@smithy/node-http-handler","version":"2.1.6","files":["/packages/api-headless-cms-import-export/package.json","/packages/api-page-builder-import-export/package.json"]},{"name":"@sparticuz/chromium","version":"131.0.1","files":["/packages/api-prerendering-service/package.json"]},{"name":"@svgr/webpack","version":"6.1.1","files":["/packages/app-admin/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json","/packages/project-utils/package.json","/packages/ui/package.json"]},{"name":"@swc/plugin-emotion","version":"9.0.4","files":["/packages/project-utils/package.json"]},{"name":"@tanstack/react-table","version":"8.5.22","files":["/packages/ui/package.json"]},{"name":"@types/aws-lambda","version":"8.10.145","files":["/packages/aws-helpers/package.json","/packages/aws-sdk/package.json"]},{"name":"@types/medium-editor","version":"5.0.3","files":["/packages/app-page-builder/package.json"]},{"name":"@types/mime","version":"2.0.3","files":["/packages/app-admin/package.json"]},{"name":"@types/prismjs","version":"1.26.4","files":["/packages/lexical-nodes/package.json"]},{"name":"@types/react","version":"18.2.79","files":["/packages/app/package.json","/packages/app-admin/package.json","/packages/app-admin-rmwc/package.json","/packages/app-apw/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n/package.json","/packages/app-page-builder/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/packages/react-composition/package.json","/packages/react-properties/package.json","/packages/react-rich-text-lexical-renderer/package.json","/packages/react-rich-text-renderer/package.json","/apps/admin/package.json","/apps/website/package.json"]},{"name":"@types/webpack-env","version":"1.18.5","files":["/packages/project-utils/package.json"]},{"name":"accept-language-parser","version":"1.5.0","files":["/packages/api-i18n/package.json"]},{"name":"accounting","version":"0.4.1","files":["/packages/i18n/package.json"]},{"name":"aos","version":"2.3.4","files":["/packages/app-page-builder/package.json"]},{"name":"apollo-cache","version":"1.3.5","files":["/packages/app/package.json","/packages/app-admin/package.json","/packages/app-apw/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-wcp/package.json"]},{"name":"apollo-cache-inmemory","version":"1.6.6","files":["/packages/app/package.json"]},{"name":"apollo-client","version":"2.6.10","files":["/packages/app/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-record-locking/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/packages/react-router/package.json","/apps/website/package.json"]},{"name":"apollo-link","version":"1.2.14","files":["/packages/app/package.json","/packages/app-admin/package.json","/packages/app-apw/package.json","/packages/app-file-manager/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-record-locking/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/apps/website/package.json"]},{"name":"apollo-link-batch-http","version":"1.2.14","files":["/packages/app-serverless-cms/package.json","/packages/app-website/package.json"]},{"name":"apollo-link-context","version":"1.0.20","files":["/packages/app/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-graphql-playground/package.json","/packages/app-i18n/package.json"]},{"name":"apollo-link-error","version":"1.1.13","files":["/packages/app/package.json"]},{"name":"apollo-link-http-common","version":"0.2.16","files":["/packages/app/package.json"]},{"name":"apollo-utilities","version":"1.3.4","files":["/packages/app/package.json","/packages/app-admin/package.json","/packages/app-apw/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-wcp/package.json"]},{"name":"archiver","version":"7.0.1","files":["/packages/api-headless-cms-import-export/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json"]},{"name":"archy","version":"1.0.0","files":["/packages/cli-plugin-workspaces/package.json"]},{"name":"assert-browserify","version":"2.0.0","files":["/packages/project-utils/package.json"]},{"name":"babel-loader","version":"9.2.1","files":["/packages/project-utils/package.json"]},{"name":"boolean","version":"3.2.0","files":["/packages/app/package.json","/packages/cli/package.json","/packages/handler-graphql/package.json"]},{"name":"brace","version":"0.11.1","files":["/packages/ui/package.json"]},{"name":"buffer","version":"6.0.3","files":["/packages/project-utils/package.json"]},{"name":"bufferutil","version":"4.0.1","files":["/packages/project-utils/package.json"]},{"name":"bytes","version":"3.1.2","files":["/packages/api-headless-cms-import-export/package.json","/packages/app/package.json","/packages/app-file-manager/package.json"]},{"name":"cache-control-parser","version":"2.0.6","files":["/packages/api-file-manager/package.json"]},{"name":"camelcase","version":"6.3.0","files":["/packages/cli/package.json","/packages/project-utils/package.json"]},{"name":"case","version":"1.6.3","files":["/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json"]},{"name":"case-sensitive-paths-webpack-plugin","version":"2.4.0","files":["/packages/project-utils/package.json"]},{"name":"center-align","version":"1.0.1","files":["/packages/data-migration/package.json"]},{"name":"chalk","version":"4.1.2","files":["/packages/aws-layers/package.json","/packages/cli/package.json","/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-workspaces/package.json","/packages/create-webiny-project/package.json","/packages/cwp-template-aws/package.json","/packages/data-migration/package.json","/packages/project-utils/package.json","/packages/serverless-cms-aws/package.json","/packages/system-requirements/package.json","/scripts/buildPackages/package.json","/scripts/prepublishOnly/package.json"]},{"name":"cheerio","version":"1.0.0-rc.10","files":["/packages/aws-helpers/package.json"]},{"name":"ci-info","version":"4.1.0","files":["/packages/cli/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cwp-template-aws/package.json","/packages/project-utils/package.json","/packages/telemetry/package.json"]},{"name":"classnames","version":"2.5.1","files":["/packages/app-admin/package.json","/packages/app-admin-rmwc/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-page-builder/package.json","/packages/react-rich-text-renderer/package.json","/packages/ui/package.json"]},{"name":"cli-table3","version":"0.6.5","files":["/packages/system-requirements/package.json"]},{"name":"color","version":"4.2.3","files":["/packages/cli-plugin-workspaces/package.json"]},{"name":"core-js","version":"3.39.0","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/apps/admin/package.json","/apps/website/package.json"]},{"name":"cropperjs","version":"1.4.3","files":["/packages/ui/package.json"]},{"name":"cross-fetch","version":"3.1.5","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/apps/admin/package.json","/apps/website/package.json"]},{"name":"crypto-browserify","version":"3.12.0","files":["/packages/project-utils/package.json"]},{"name":"crypto-hash","version":"3.0.0","files":["/packages/app-record-locking/package.json"]},{"name":"crypto-js","version":"4.2.0","files":["/packages/api-mailer/package.json"]},{"name":"css-loader","version":"6.10.0","files":["/packages/project-utils/package.json"]},{"name":"css-minimizer-webpack-plugin","version":"7.0.0","files":["/packages/project-utils/package.json"]},{"name":"dataloader","version":"2.2.2","files":["/packages/api-admin-users/package.json","/packages/api-headless-cms-ddb/package.json","/packages/api-headless-cms-ddb-es/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-so-ddb/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/api-tenancy/package.json"]},{"name":"dataurl-to-blob","version":"0.0.1","files":["/packages/app-file-manager/package.json"]},{"name":"date-fns","version":"2.22.1","files":["/packages/api-form-builder/package.json","/packages/app-audit-logs/package.json","/packages/db-dynamodb/package.json"]},{"name":"dayjs","version":"1.11.13","files":["/packages/api-apw/package.json","/packages/app-apw/package.json","/packages/app-file-manager/package.json"]},{"name":"decompress","version":"4.2.1","files":["/packages/pulumi-sdk/package.json"]},{"name":"deep-equal","version":"2.2.3","files":["/packages/api-security/package.json","/packages/api-security-cognito/package.json","/packages/tasks/package.json"]},{"name":"dnd-core","version":"16.0.1","files":["/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-page-builder/package.json"]},{"name":"dnd-kit-sortable-tree","version":"0.1.73","files":["/packages/app-page-builder/package.json"]},{"name":"dot-prop","version":"6.0.1","files":["/packages/api-headless-cms/package.json","/packages/api-headless-cms-ddb/package.json","/packages/db-dynamodb/package.json"]},{"name":"dot-prop-immutable","version":"2.1.1","files":["/packages/api-page-builder-import-export/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-apw/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/ui/package.json"]},{"name":"dotenv","version":"8.2.0","files":["/packages/cli/package.json"]},{"name":"downshift","version":"3.1.2","files":["/packages/app-admin/package.json"]},{"name":"downshift","version":"2.1.5","files":["/packages/ui/package.json"]},{"name":"dynamodb-toolbox","version":"0.9.2","files":["/packages/db-dynamodb/package.json"]},{"name":"elastic-ts","version":"0.12.0","files":["/packages/api-elasticsearch/package.json","/packages/api-form-builder-so-ddb-es/package.json","/packages/api-page-builder-so-ddb-es/package.json"]},{"name":"emotion","version":"10.0.27","files":["/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n-content/package.json","/packages/app-page-builder/package.json","/packages/app-security-access-management/package.json","/packages/app-tenant-manager/package.json","/packages/lexical-editor/package.json","/packages/lexical-editor-actions/package.json","/packages/lexical-theme/package.json","/packages/ui/package.json"]},{"name":"eslint","version":"8.57.1","files":["/packages/project-utils/package.json"]},{"name":"eslint-config-react-app","version":"6.0.0","files":["/packages/project-utils/package.json"]},{"name":"eslint-webpack-plugin","version":"4.2.0","files":["/packages/project-utils/package.json"]},{"name":"execa","version":"5.1.1","files":["/packages/cli/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json","/packages/cli-plugin-workspaces/package.json","/packages/create-webiny-project/package.json","/packages/cwp-template-aws/package.json","/packages/pulumi-sdk/package.json","/packages/system-requirements/package.json","/scripts/buildPackages/package.json"]},{"name":"exit-hook","version":"4.0.0","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"extract-zip","version":"1.6.7","files":["/packages/api-page-builder/package.json"]},{"name":"facepaint","version":"1.2.1","files":["/packages/app-page-builder-elements/package.json"]},{"name":"fast-glob","version":"3.2.7","files":["/packages/cli/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-extensions/package.json","/packages/cwp-template-aws/package.json","/packages/serverless-cms-aws/package.json"]},{"name":"fastify","version":"4.29.1","files":["/packages/handler/package.json","/packages/handler-aws/package.json"]},{"name":"fecha","version":"2.3.3","files":["/packages/i18n/package.json"]},{"name":"file-loader","version":"6.2.0","files":["/packages/project-utils/package.json"]},{"name":"find-up","version":"5.0.0","files":["/packages/cli/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/create-webiny-project/package.json","/packages/pulumi/package.json","/packages/serverless-cms-aws/package.json","/scripts/prepublishOnly/package.json"]},{"name":"folder-hash","version":"4.0.4","files":["/scripts/buildPackages/package.json"]},{"name":"fork-ts-checker-webpack-plugin","version":"9.0.2","files":["/packages/project-utils/package.json"]},{"name":"form-data","version":"4.0.0","files":["/packages/api-file-manager-s3/package.json","/packages/pulumi-aws/package.json"]},{"name":"fs-extra","version":"11.2.0","files":["/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/cli/package.json","/packages/create-webiny-project/package.json","/packages/cwp-template-aws/package.json","/packages/project-utils/package.json","/packages/pulumi-sdk/package.json","/scripts/buildPackages/package.json","/scripts/prepublishOnly/package.json"]},{"name":"fuse.js","version":"7.0.0","files":["/packages/db-dynamodb/package.json"]},{"name":"get-yarn-workspaces","version":"1.0.2","files":["/packages/cli-plugin-dependencies/package.json","/packages/cwp-template-aws/package.json","/packages/project-utils/package.json","/scripts/prepublishOnly/package.json"]},{"name":"glob","version":"7.2.3","files":["/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-extensions/package.json","/packages/project-utils/package.json"]},{"name":"graphlib","version":"2.1.8","files":["/packages/app-admin/package.json","/packages/cli-plugin-workspaces/package.json"]},{"name":"graphql","version":"15.9.0","files":["/packages/api-headless-cms/package.json","/packages/api-i18n-content/package.json","/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-trash-bin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/packages/cwp-template-aws/template/common/extensions/theme/package.json","/packages/handler-graphql/package.json","/packages/react-router/package.json","/apps/website/package.json","/extensions/theme/package.json"]},{"name":"graphql-request","version":"3.7.0","files":["/packages/cli/package.json"]},{"name":"graphql-scalars","version":"1.12.0","files":["/packages/handler-graphql/package.json"]},{"name":"graphql-tag","version":"2.12.6","files":["/packages/api-headless-cms/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-file-manager/package.json","/packages/app-file-manager-s3/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-record-locking/package.json","/packages/app-security-access-management/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/handler-graphql/package.json"]},{"name":"history","version":"5.3.0","files":["/packages/app-form-builder/package.json","/packages/app-page-builder/package.json","/packages/react-router/package.json"]},{"name":"html-webpack-plugin","version":"5.6.3","files":["/packages/project-utils/package.json"]},{"name":"humanize-duration","version":"3.32.1","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"i18n-locales","version":"0.0.5","files":["/packages/api-i18n/package.json"]},{"name":"indent-string","version":"5.0.0","files":["/packages/cli-plugin-scaffold-react-component/package.json"]},{"name":"inquirer","version":"8.2.6","files":["/packages/cli/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cwp-template-aws/package.json"]},{"name":"invariant","version":"2.2.4","files":["/packages/app/package.json","/packages/app-page-builder/package.json","/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/serverless-cms-aws/package.json"]},{"name":"inversify","version":"6.1.6","files":["/packages/ioc/package.json"]},{"name":"is-hotkey","version":"0.2.0","files":["/packages/app-admin/package.json","/packages/app-page-builder/package.json"]},{"name":"isnumeric","version":"0.3.3","files":["/packages/validation/package.json"]},{"name":"js-base64","version":"3.7.7","files":["/packages/cli-plugin-scaffold-ci/package.json"]},{"name":"js-yaml","version":"3.14.1","files":["/packages/create-webiny-project/package.json"]},{"name":"jsdom","version":"25.0.1","files":["/packages/api-headless-cms/package.json"]},{"name":"jsesc","version":"3.0.2","files":["/packages/telemetry/package.json"]},{"name":"json2csv","version":"4.5.4","files":["/packages/api-form-builder/package.json","/packages/app-form-builder/package.json"]},{"name":"jsonpack","version":"1.1.5","files":["/packages/api-page-builder/package.json","/packages/utils/package.json"]},{"name":"jsonwebtoken","version":"9.0.1","files":["/packages/api-cognito-authenticator/package.json","/packages/api-security/package.json","/packages/api-security-auth0/package.json","/packages/api-security-okta/package.json"]},{"name":"jwk-to-pem","version":"2.0.1","files":["/packages/api-cognito-authenticator/package.json","/packages/api-security-auth0/package.json","/packages/api-security-okta/package.json"]},{"name":"keycode","version":"2.2.0","files":["/packages/ui/package.json"]},{"name":"lexical","version":"0.23.1","files":["/packages/lexical-converter/package.json","/packages/lexical-editor/package.json","/packages/lexical-nodes/package.json","/packages/lexical-theme/package.json"]},{"name":"listr","version":"0.14.3","files":["/packages/cli-plugin-deploy-pulumi/package.json","/packages/create-webiny-project/package.json"]},{"name":"listr2","version":"5.0.8","files":["/scripts/buildPackages/package.json"]},{"name":"load-json-file","version":"6.2.0","files":["/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json","/packages/create-webiny-project/package.json","/packages/cwp-template-aws/package.json","/packages/global-config/package.json","/scripts/buildPackages/package.json","/scripts/prepublishOnly/package.json"]},{"name":"load-script","version":"1.0.0","files":["/packages/app-graphql-playground/package.json","/packages/ui/package.json"]},{"name":"lodash","version":"4.17.21","files":["/packages/api-aco/package.json","/packages/api-admin-users/package.json","/packages/api-apw/package.json","/packages/api-file-manager/package.json","/packages/api-form-builder/package.json","/packages/api-headless-cms/package.json","/packages/api-headless-cms-ddb/package.json","/packages/api-headless-cms-ddb-es/package.json","/packages/api-mailer/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-aco/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/api-prerendering-service/package.json","/packages/api-prerendering-service-aws/package.json","/packages/api-sync-system/package.json","/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-cognito-authenticator/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-page-builder/package.json","/packages/app-page-builder-elements/package.json","/packages/app-security-access-management/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-trash-bin/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cwp-template-aws/package.json","/packages/db-dynamodb/package.json","/packages/form/package.json","/packages/i18n/package.json","/packages/i18n-react/package.json","/packages/migrations/package.json","/packages/project-utils/package.json","/packages/pulumi/package.json","/packages/pulumi-aws/package.json","/packages/pulumi-sdk/package.json","/packages/tasks/package.json","/packages/ui/package.json","/packages/validation/package.json","/scripts/prepublishOnly/package.json"]},{"name":"log-update","version":"4.0.0","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"lz-string","version":"1.5.0","files":["/packages/app-website/package.json"]},{"name":"material-components-web","version":"14.0.0","files":["/packages/ui/package.json"]},{"name":"md5","version":"2.3.0","files":["/packages/api-admin-users/package.json"]},{"name":"mdbid","version":"1.0.0","files":["/packages/utils/package.json"]},{"name":"medium-editor","version":"5.23.3","files":["/packages/app-page-builder/package.json"]},{"name":"mime","version":"3.0.0","files":["/packages/api-file-manager-s3/package.json","/packages/app-file-manager/package.json","/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"mini-css-extract-plugin","version":"2.4.5","files":["/packages/project-utils/package.json"]},{"name":"minimatch","version":"5.1.6","files":["/packages/api-security/package.json","/packages/app/package.json","/packages/app-file-manager/package.json","/packages/app-security/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/data-migration/package.json"]},{"name":"mobx","version":"6.9.0","files":["/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json","/packages/app-trash-bin/package.json","/packages/app-utils/package.json"]},{"name":"mobx-react-lite","version":"3.4.3","files":["/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-file-manager/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json","/packages/app-trash-bin/package.json"]},{"name":"mqtt","version":"5.10.3","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"multimatch","version":"5.0.0","files":["/packages/cli-plugin-workspaces/package.json"]},{"name":"nanoid","version":"3.3.8","files":["/packages/app/package.json","/packages/app-page-builder/package.json","/packages/react-properties/package.json","/packages/utils/package.json"]},{"name":"nanoid-dictionary","version":"4.3.0","files":["/packages/utils/package.json"]},{"name":"ncp","version":"2.0.0","files":["/packages/cli/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json"]},{"name":"node-fetch","version":"2.6.7","files":["/packages/api-cognito-authenticator/package.json","/packages/api-file-manager-s3/package.json","/packages/api-form-builder/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-security-auth0/package.json","/packages/api-security-okta/package.json","/packages/api-wcp/package.json","/packages/create-webiny-project/package.json","/packages/pulumi-aws/package.json","/packages/pulumi-sdk/package.json","/packages/serverless-cms-aws/package.json","/packages/wcp/package.json"]},{"name":"node-notifier","version":"10.0.1","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"nodemailer","version":"6.9.16","files":["/packages/api-mailer/package.json"]},{"name":"nprogress","version":"0.2.0","files":["/packages/ui/package.json"]},{"name":"nuka-carousel","version":"4.7.1","files":["/packages/ui/package.json"]},{"name":"null-loader","version":"4.0.1","files":["/packages/project-utils/package.json"]},{"name":"object-hash","version":"3.0.0","files":["/packages/api-file-manager/package.json","/packages/api-file-manager-s3/package.json","/packages/api-prerendering-service/package.json"]},{"name":"object-merge-advanced","version":"12.1.0","files":["/packages/tasks/package.json"]},{"name":"object-sizeof","version":"2.6.4","files":["/packages/tasks/package.json"]},{"name":"octokit","version":"3.1.2","files":["/packages/cli-plugin-scaffold-ci/package.json"]},{"name":"open","version":"8.4.2","files":["/packages/cli/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cwp-template-aws/package.json"]},{"name":"ora","version":"4.1.1","files":["/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cwp-template-aws/package.json","/packages/serverless-cms-aws/package.json"]},{"name":"os","version":"0.1.1","files":["/packages/create-webiny-project/package.json"]},{"name":"os-browserify","version":"0.3.0","files":["/packages/project-utils/package.json"]},{"name":"p-map","version":"4.0.0","files":["/packages/api-file-manager-s3/package.json","/packages/api-headless-cms/package.json","/packages/cli-plugin-workspaces/package.json"]},{"name":"p-reduce","version":"2.1.0","files":["/packages/api-file-manager-s3/package.json","/packages/api-headless-cms/package.json"]},{"name":"p-retry","version":"4.6.2","files":["/packages/api-dynamodb-to-elasticsearch/package.json","/packages/app-file-manager-s3/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/create-webiny-project/package.json","/packages/utils/package.json"]},{"name":"p-wait-for","version":"4.1.0","files":["/packages/ui-composer/package.json"]},{"name":"pako","version":"2.1.0","files":["/packages/app-aco/package.json","/packages/app-page-builder/package.json"]},{"name":"path-browserify","version":"1.0.1","files":["/packages/project-utils/package.json"]},{"name":"pino-pretty","version":"9.4.0","files":["/packages/data-migration/package.json"]},{"name":"pirates","version":"4.0.6","files":["/packages/cli/package.json"]},{"name":"platform","version":"1.3.5","files":["/packages/app-page-builder/package.json"]},{"name":"pluralize","version":"8.0.0","files":["/packages/api-headless-cms/package.json","/packages/api-prerendering-service/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json"]},{"name":"postcss-flexbugs-fixes","version":"5.0.2","files":["/packages/project-utils/package.json"]},{"name":"postcss-loader","version":"6.2.1","files":["/packages/project-utils/package.json"]},{"name":"postcss-normalize","version":"10.0.1","files":["/packages/project-utils/package.json"]},{"name":"postcss-preset-env","version":"9.4.0","files":["/packages/project-utils/package.json"]},{"name":"posthtml","version":"0.15.0","files":["/packages/api-prerendering-service/package.json"]},{"name":"posthtml-noopener","version":"1.0.5","files":["/packages/api-prerendering-service/package.json"]},{"name":"posthtml-plugin-link-preload","version":"1.0.0","files":["/packages/api-prerendering-service/package.json"]},{"name":"process","version":"0.11.10","files":["/packages/project-utils/package.json"]},{"name":"prop-types","version":"15.8.1","files":["/packages/app-admin/package.json","/packages/app-apw/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/cwp-template-aws/template/common/apps/admin/package.json","/apps/admin/package.json"]},{"name":"puppeteer-core","version":"23.11.1","files":["/packages/api-prerendering-service/package.json"]},{"name":"raw-loader","version":"4.0.2","files":["/packages/project-utils/package.json"]},{"name":"raw.macro","version":"0.4.2","files":["/packages/app-headless-cms/package.json"]},{"name":"rc-tooltip","version":"5.3.1","files":["/packages/ui/package.json"]},{"name":"react","version":"18.2.0","files":["/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-cognito-authenticator/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-i18n-content/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-plugin-admin-welcome-screen/package.json","/packages/app-record-locking/package.json","/packages/app-security/package.json","/packages/app-security-access-management/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-trash-bin/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/app-websockets/package.json","/packages/cli-plugin-extensions/templates/admin/package.json","/packages/cli-plugin-extensions/templates/pbElement/package.json","/packages/cli-plugin-extensions/templates/website/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json","/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/packages/cwp-template-aws/template/common/extensions/theme/package.json","/packages/lexical-editor/package.json","/packages/lexical-editor-actions/package.json","/packages/lexical-editor-pb-element/package.json","/packages/project-utils/package.json","/packages/react-composition/package.json","/packages/react-properties/package.json","/packages/react-rich-text-lexical-renderer/package.json","/packages/react-rich-text-renderer/package.json","/packages/react-router/package.json","/packages/ui-composer/package.json","/apps/admin/package.json","/apps/website/package.json","/extensions/theme/package.json"]},{"name":"react-ace","version":"6.1.4","files":["/packages/ui/package.json"]},{"name":"react-butterfiles","version":"1.3.3","files":["/packages/app-file-manager/package.json","/packages/app-headless-cms/package.json","/packages/ui/package.json"]},{"name":"react-color","version":"2.19.3","files":["/packages/app-page-builder/package.json","/packages/lexical-editor-actions/package.json","/packages/ui/package.json"]},{"name":"react-columned","version":"1.1.3","files":["/packages/ui/package.json"]},{"name":"react-custom-scrollbars","version":"4.2.1","files":["/packages/app-file-manager/package.json","/packages/app-headless-cms/package.json","/packages/ui/package.json"]},{"name":"react-dev-utils","version":"12.0.1","files":["/packages/project-utils/package.json"]},{"name":"react-dnd","version":"16.0.1","files":["/packages/app-aco/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"react-dnd-html5-backend","version":"16.0.1","files":["/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"react-dom","version":"18.2.0","files":["/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-cognito-authenticator/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-i18n/package.json","/packages/app-i18n-content/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-plugin-admin-welcome-screen/package.json","/packages/app-record-locking/package.json","/packages/app-security/package.json","/packages/app-security-access-management/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme-manager/package.json","/packages/app-trash-bin/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/app-websockets/package.json","/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/packages/lexical-editor/package.json","/packages/lexical-editor-actions/package.json","/packages/lexical-editor-pb-element/package.json","/packages/project-utils/package.json","/packages/react-composition/package.json","/packages/react-router/package.json","/packages/ui-composer/package.json","/apps/admin/package.json","/apps/website/package.json"]},{"name":"react-draggable","version":"4.4.6","files":["/packages/app-admin/package.json"]},{"name":"react-google-recaptcha","version":"1.1.0","files":["/packages/app-form-builder/package.json"]},{"name":"react-hamburger-menu","version":"1.2.1","files":["/packages/cwp-template-aws/template/common/extensions/theme/package.json","/extensions/theme/package.json"]},{"name":"react-helmet","version":"6.1.0","files":["/packages/app-admin-auth0/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-headless-cms/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-security-access-management/package.json","/packages/app-website/package.json"]},{"name":"react-hotkeyz","version":"1.0.4","files":["/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-rmwc/package.json","/packages/app-file-manager/package.json","/packages/app-form-builder/package.json","/packages/app-headless-cms/package.json"]},{"name":"react-images","version":"0.5.19","files":["/packages/app-page-builder/package.json"]},{"name":"react-in-viewport","version":"1.0.0-alpha.30","files":["/packages/app-page-builder/package.json"]},{"name":"react-lazy-load","version":"3.1.14","files":["/packages/app-file-manager/package.json"]},{"name":"react-loading-skeleton","version":"3.1.0","files":["/packages/ui/package.json"]},{"name":"react-refresh","version":"0.11.0","files":["/packages/project-utils/package.json"]},{"name":"react-resizable","version":"3.0.5","files":["/packages/app-admin/package.json"]},{"name":"react-resizable-panels","version":"2.0.19","files":["/packages/app-admin/package.json"]},{"name":"react-router-dom","version":"6.3.0","files":["/packages/react-router/package.json"]},{"name":"react-sortable","version":"2.0.0","files":["/packages/app-page-builder/package.json"]},{"name":"react-spinner-material","version":"1.1.4","files":["/packages/app-apw/package.json","/packages/ui/package.json"]},{"name":"react-style-object-to-css","version":"1.1.2","files":["/packages/lexical-theme/package.json"]},{"name":"react-transition-group","version":"4.4.5","files":["/packages/app-admin/package.json","/packages/app-admin-rmwc/package.json","/packages/ui/package.json"]},{"name":"react-virtualized","version":"9.22.5","files":["/packages/app-admin/package.json","/packages/app-headless-cms/package.json","/packages/app-page-builder/package.json"]},{"name":"read-json-sync","version":"2.0.1","files":["/packages/project-utils/package.json"]},{"name":"recoil","version":"0.7.7","files":["/packages/app-page-builder/package.json"]},{"name":"reflect-metadata","version":"0.2.2","files":["/packages/di-container/package.json","/packages/ioc/package.json"]},{"name":"regenerator-runtime","version":"0.13.11","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/apps/admin/package.json","/apps/website/package.json"]},{"name":"replace-in-path","version":"1.1.0","files":["/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json"]},{"name":"reset-css","version":"5.0.1","files":["/packages/app-admin/package.json","/packages/app-website/package.json"]},{"name":"resolve","version":"1.22.8","files":["/packages/project-utils/package.json"]},{"name":"resolve-url-loader","version":"5.0.0","files":["/packages/project-utils/package.json"]},{"name":"rimraf","version":"6.0.1","files":["/packages/create-webiny-project/package.json","/packages/project-utils/package.json"]},{"name":"sanitize-filename","version":"1.6.3","files":["/packages/api-file-manager-s3/package.json"]},{"name":"sanitize-html","version":"2.12.1","files":["/packages/react-rich-text-renderer/package.json"]},{"name":"sass","version":"1.44.0","files":["/packages/project-utils/package.json"]},{"name":"sass-loader","version":"12.3.0","files":["/packages/project-utils/package.json"]},{"name":"scheduler","version":"0.19.1","files":["/packages/project-utils/package.json"]},{"name":"semver","version":"7.6.3","files":["/packages/api-headless-cms/package.json","/packages/api-sync-system/package.json","/packages/cli/package.json","/packages/cli-plugin-dependencies/package.json","/packages/create-webiny-project/package.json","/packages/data-migration/package.json","/packages/pulumi-sdk/package.json","/packages/system-requirements/package.json"]},{"name":"serialize-error","version":"8.0.0","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"sharp","version":"0.32.6","files":["/packages/api-file-manager-s3/package.json"]},{"name":"short-hash","version":"1.0.0","files":["/packages/i18n/package.json"]},{"name":"slugify","version":"1.6.6","files":["/packages/api-form-builder/package.json","/packages/api-headless-cms/package.json","/packages/app-aco/package.json","/packages/app-dynamic-pages/package.json","/packages/app-page-builder/package.json"]},{"name":"source-map-loader","version":"1.1.3","files":["/packages/project-utils/package.json"]},{"name":"source-map-support","version":"0.5.21","files":["/packages/project-utils/package.json"]},{"name":"srcset","version":"4.0.0","files":["/packages/api-prerendering-service/package.json","/packages/aws-helpers/package.json"]},{"name":"store","version":"2.0.12","files":["/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-rmwc/package.json","/packages/app-page-builder/package.json","/packages/app-tenancy/package.json"]},{"name":"stream","version":"0.0.3","files":["/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json"]},{"name":"strip-ansi","version":"6.0.1","files":["/packages/telemetry/package.json"]},{"name":"style-loader","version":"3.3.1","files":["/packages/project-utils/package.json"]},{"name":"swiper","version":"9.3.2","files":["/packages/app-page-builder/package.json"]},{"name":"tar","version":"6.2.1","files":["/packages/pulumi-sdk/package.json"]},{"name":"terminal-link","version":"2.1.1","files":["/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json"]},{"name":"terser-webpack-plugin","version":"5.3.10","files":["/packages/project-utils/package.json"]},{"name":"theme","version":"1.0.0","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/apps/admin/package.json","/apps/website/package.json"]},{"name":"timeago-react","version":"3.0.6","files":["/packages/ui/package.json"]},{"name":"ts-checker-rspack-plugin","version":"1.0.3","files":["/packages/project-utils/package.json"]},{"name":"ts-invariant","version":"0.10.3","files":["/packages/app/package.json"]},{"name":"ts-morph","version":"11.0.0","files":["/packages/cli/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json"]},{"name":"ts-patch","version":"3.3.0","files":["/packages/project-utils/package.json"]},{"name":"tslib","version":"2.8.1","files":["/packages/cwp-template-aws/template/common/apps/admin/package.json","/apps/admin/package.json"]},{"name":"type-fest","version":"4.14.0","files":["/packages/api-websockets/package.json","/packages/db/package.json"]},{"name":"typescript","version":"5.3.3","files":["/packages/cli/package.json","/packages/project-utils/package.json"]},{"name":"unicode-emoji-json","version":"0.4.0","files":["/packages/app-admin/package.json"]},{"name":"uniqid","version":"5.4.0","files":["/packages/api-headless-cms-import-export/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/app-page-builder/package.json","/packages/cli/package.json","/packages/plugins/package.json"]},{"name":"unzipper","version":"0.12.3","files":["/packages/api-headless-cms-import-export/package.json"]},{"name":"url","version":"0.11.4","files":["/packages/project-utils/package.json"]},{"name":"url-loader","version":"4.1.1","files":["/packages/project-utils/package.json"]},{"name":"use-deep-compare-effect","version":"1.8.1","files":["/packages/app-headless-cms/package.json"]},{"name":"utf-8-validate","version":"5.0.2","files":["/packages/project-utils/package.json"]},{"name":"uuid","version":"9.0.1","files":["/packages/create-webiny-project/package.json","/packages/global-config/package.json"]},{"name":"validate-npm-package-name","version":"3.0.0","files":["/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json","/packages/create-webiny-project/package.json"]},{"name":"vm-browserify","version":"1.1.2","files":["/packages/project-utils/package.json"]},{"name":"warning","version":"4.0.2","files":["/packages/app/package.json"]},{"name":"webpack","version":"5.97.0","files":["/packages/project-utils/package.json","/packages/serverless-cms-aws/package.json"]},{"name":"webpack-dev-server","version":"4.15.2","files":["/packages/project-utils/package.json"]},{"name":"webpack-manifest-plugin","version":"5.0.0","files":["/packages/project-utils/package.json"]},{"name":"webpackbar","version":"7.0.0","files":["/packages/project-utils/package.json"]},{"name":"write-json-file","version":"4.3.0","files":["/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json","/packages/create-webiny-project/package.json","/packages/cwp-template-aws/package.json","/packages/global-config/package.json","/scripts/buildPackages/package.json","/scripts/prepublishOnly/package.json"]},{"name":"wts-client","version":"1.0.1","files":["/packages/telemetry/package.json"]},{"name":"yargs","version":"17.7.2","files":["/packages/cli/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/create-webiny-project/package.json","/packages/i18n/package.json","/scripts/buildPackages/package.json"]},{"name":"yauzl","version":"2.10.0","files":["/packages/api-page-builder-import-export/package.json"]},{"name":"yesno","version":"0.4.0","files":["/packages/create-webiny-project/package.json"]},{"name":"zod","version":"3.23.8","files":["/packages/api-admin-users/package.json","/packages/api-apw/package.json","/packages/api-file-manager/package.json","/packages/api-form-builder/package.json","/packages/api-headless-cms/package.json","/packages/api-headless-cms-import-export/package.json","/packages/api-headless-cms-tasks/package.json","/packages/api-log/package.json","/packages/api-mailer/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-security/package.json","/packages/api-sync-system/package.json","/packages/api-websockets/package.json","/packages/app-aco/package.json","/packages/app-file-manager/package.json","/packages/pulumi-aws/package.json","/packages/tasks/package.json"]}],"devDependencies":[{"name":"@4tw/cypress-drag-drop","version":"1.4.0","files":["/cypress-tests/package.json"]},{"name":"@babel/cli","version":"7.27.2","files":["/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@babel/code-frame","version":"7.27.1","files":["/package.json"]},{"name":"@babel/compat-data","version":"7.27.5","files":["/package.json"]},{"name":"@babel/core","version":"7.27.4","files":["/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@babel/helper-define-polyfill-provider","version":"0.6.4","files":["/package.json"]},{"name":"@babel/helper-environment-visitor","version":"7.24.7","files":["/package.json"]},{"name":"@babel/parser","version":"7.27.5","files":["/package.json"]},{"name":"@babel/plugin-proposal-class-properties","version":"7.18.6","files":["/package.json"]},{"name":"@babel/plugin-proposal-object-rest-spread","version":"7.20.7","files":["/package.json"]},{"name":"@babel/plugin-proposal-throw-expressions","version":"7.27.1","files":["/package.json"]},{"name":"@babel/plugin-syntax-object-rest-spread","version":"7.8.3","files":["/package.json"]},{"name":"@babel/plugin-transform-modules-commonjs","version":"7.27.1","files":["/package.json"]},{"name":"@babel/plugin-transform-runtime","version":"7.27.4","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@babel/preset-env","version":"7.27.2","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@babel/preset-react","version":"7.27.1","files":["/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json"]},{"name":"@babel/preset-typescript","version":"7.27.1","files":["/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@babel/register","version":"7.27.1","files":["/package.json","/packages/i18n/package.json"]},{"name":"@babel/runtime","version":"7.27.4","files":["/package.json"]},{"name":"@babel/template","version":"7.27.2","files":["/package.json"]},{"name":"@babel/traverse","version":"7.27.4","files":["/package.json"]},{"name":"@babel/types","version":"7.27.3","files":["/package.json"]},{"name":"@commitlint/cli","version":"11.0.0","files":["/package.json"]},{"name":"@commitlint/config-conventional","version":"11.0.0","files":["/package.json"]},{"name":"@elastic/elasticsearch","version":"7.12.0","files":["/packages/api-headless-cms-ddb-es/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/project-utils/package.json"]},{"name":"@emotion/babel-plugin","version":"11.11.0","files":["/packages/app-admin/package.json","/packages/app-admin-rmwc/package.json","/packages/app-apw/package.json","/packages/app-dynamic-pages/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-i18n-content/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-security/package.json","/packages/app-security-access-management/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme/package.json","/packages/app-theme-manager/package.json","/packages/theme/package.json","/packages/ui/package.json"]},{"name":"@emotion/react","version":"11.10.8","files":["/packages/react-rich-text-lexical-renderer/package.json"]},{"name":"@faker-js/faker","version":"9.3.0","files":["/packages/api-headless-cms-es-tasks/package.json","/packages/api-sync-system/package.json"]},{"name":"@grpc/grpc-js","version":"1.11.1","files":["/package.json"]},{"name":"@lexical/code","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/hashtag","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/headless","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/history","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/html","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/list","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/mark","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/overflow","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/react","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/rich-text","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/selection","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/text","version":"0.23.1","files":["/package.json"]},{"name":"@lexical/utils","version":"0.23.1","files":["/package.json"]},{"name":"@material-design-icons/svg","version":"0.14.13","files":["/packages/app-audit-logs/package.json"]},{"name":"@material-symbols/svg-400","version":"0.4.1","files":["/packages/app-audit-logs/package.json"]},{"name":"@octokit/rest","version":"20.0.2","files":["/package.json"]},{"name":"@svgr/webpack","version":"6.1.1","files":["/packages/app-file-manager/package.json"]},{"name":"@testing-library/cypress","version":"10.0.0","files":["/cypress-tests/package.json"]},{"name":"@testing-library/react","version":"15.0.7","files":["/packages/form/package.json","/packages/react-composition/package.json","/packages/react-properties/package.json","/packages/react-rich-text-lexical-renderer/package.json","/packages/ui/package.json"]},{"name":"@testing-library/user-event","version":"14.5.2","files":["/packages/form/package.json"]},{"name":"@types/accept-language-parser","version":"1.5.3","files":["/packages/api-i18n/package.json"]},{"name":"@types/accounting","version":"0.4.2","files":["/packages/i18n/package.json"]},{"name":"@types/adm-zip","version":"0.5.5","files":["/packages/api-headless-cms-import-export/package.json"]},{"name":"@types/aos","version":"3.0.4","files":["/packages/app-page-builder/package.json"]},{"name":"@types/archiver","version":"5.3.1","files":["/packages/api-page-builder-import-export/package.json"]},{"name":"@types/babel__code-frame","version":"7.0.6","files":["/packages/api-headless-cms/package.json"]},{"name":"@types/bytes","version":"3.1.4","files":["/packages/app-admin/package.json"]},{"name":"@types/center-align","version":"1.0.0","files":["/packages/data-migration/package.json"]},{"name":"@types/crypto-js","version":"4.2.2","files":["/packages/api-mailer/package.json"]},{"name":"@types/extract-zip","version":"1.6.2","files":["/packages/api-page-builder/package.json"]},{"name":"@types/facepaint","version":"1.2.2","files":["/packages/app-page-builder-elements/package.json"]},{"name":"@types/folder-hash","version":"4.0.4","files":["/scripts/buildPackages/package.json"]},{"name":"@types/fs-extra","version":"11.0.4","files":["/package.json"]},{"name":"@types/graphlib","version":"2.1.12","files":["/packages/app-admin/package.json"]},{"name":"@types/gtag.js","version":"0.0.20","files":["/packages/app-form-builder/package.json"]},{"name":"@types/hoist-non-react-statics","version":"3.3.5","files":["/package.json"]},{"name":"@types/humanize-duration","version":"3.27.4","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"@types/inquirer","version":"8.2.10","files":["/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-extensions/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json"]},{"name":"@types/invariant","version":"2.2.35","files":["/packages/form/package.json"]},{"name":"@types/is-hotkey","version":"0.1.10","files":["/packages/app-admin/package.json","/packages/app-page-builder/package.json"]},{"name":"@types/is-number","version":"7.0.5","files":["/packages/db-dynamodb/package.json"]},{"name":"@types/jest","version":"29.5.14","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@types/jsdom","version":"21.1.6","files":["/packages/lexical-converter/package.json"]},{"name":"@types/json2csv","version":"4.5.1","files":["/packages/api-form-builder/package.json","/packages/app-form-builder/package.json"]},{"name":"@types/jsonpack","version":"1.1.6","files":["/packages/api-headless-cms-ddb/package.json","/packages/api-headless-cms-ddb-es/package.json"]},{"name":"@types/jsonwebtoken","version":"9.0.2","files":["/packages/api-admin-users/package.json","/packages/api-cognito-authenticator/package.json","/packages/api-security/package.json","/packages/api-security-auth0/package.json","/packages/api-security-cognito/package.json"]},{"name":"@types/jwk-to-pem","version":"2.0.1","files":["/packages/api-cognito-authenticator/package.json","/packages/api-security-auth0/package.json"]},{"name":"@types/listr","version":"0.14.9","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"@types/lodash","version":"4.17.13","files":["/packages/api-sync-system/package.json","/packages/app/package.json","/packages/app-cognito-authenticator/package.json","/packages/form/package.json","/packages/i18n/package.json","/packages/pulumi/package.json","/packages/pulumi-sdk/package.json","/packages/validation/package.json"]},{"name":"@types/md5","version":"2.3.2","files":["/packages/api-admin-users/package.json"]},{"name":"@types/ncp","version":"2.0.4","files":["/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-extensions/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json"]},{"name":"@types/node","version":"20.17.10","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@types/node-fetch","version":"2.6.1","files":["/packages/api-cognito-authenticator/package.json","/packages/api-file-manager-s3/package.json","/packages/api-form-builder/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-security-auth0/package.json","/packages/api-security-okta/package.json"]},{"name":"@types/node-notifier","version":"8.0.5","files":["/packages/cli-plugin-deploy-pulumi/package.json"]},{"name":"@types/nodemailer","version":"6.4.17","files":["/packages/api-mailer/package.json"]},{"name":"@types/nprogress","version":"0.2.0","files":["/packages/ui/package.json"]},{"name":"@types/object-hash","version":"2.2.1","files":["/packages/api-prerendering-service/package.json"]},{"name":"@types/pako","version":"2.0.3","files":["/packages/app-page-builder/package.json"]},{"name":"@types/platform","version":"1.3.4","files":["/packages/app-page-builder/package.json"]},{"name":"@types/pluralize","version":"0.0.29","files":["/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-extensions/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json"]},{"name":"@types/prettier","version":"2.7.3","files":["/package.json"]},{"name":"@types/react","version":"18.2.79","files":["/package.json","/packages/app-aco/package.json","/packages/app-audit-logs/package.json","/packages/app-headless-cms-common/package.json","/packages/app-mailer/package.json","/packages/app-page-builder-elements/package.json","/packages/app-theme/package.json","/packages/app-trash-bin/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json","/packages/theme/package.json"]},{"name":"@types/react-color","version":"2.17.11","files":["/packages/lexical-editor-actions/package.json","/packages/ui/package.json"]},{"name":"@types/react-custom-scrollbars","version":"4.0.10","files":["/packages/ui/package.json"]},{"name":"@types/react-dom","version":"18.2.25","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@types/react-google-recaptcha","version":"1.1.2","files":["/packages/app-form-builder/package.json"]},{"name":"@types/react-hamburger-menu","version":"0.0.4","files":["/packages/cwp-template-aws/template/common/extensions/theme/package.json","/extensions/theme/package.json"]},{"name":"@types/react-helmet","version":"6.1.11","files":["/packages/app-admin-rmwc/package.json","/packages/app-security-access-management/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/apps/website/package.json"]},{"name":"@types/react-images","version":"0.5.3","files":["/packages/app-page-builder/package.json"]},{"name":"@types/react-resizable","version":"3.0.8","files":["/packages/app-admin/package.json"]},{"name":"@types/react-transition-group","version":"4.4.4","files":["/packages/ui/package.json"]},{"name":"@types/react-virtualized","version":"9.21.16","files":["/packages/app-page-builder/package.json"]},{"name":"@types/resize-observer-browser","version":"0.1.4","files":["/packages/app-page-builder/package.json"]},{"name":"@types/rimraf","version":"3.0.2","files":["/packages/api-page-builder/package.json"]},{"name":"@types/sanitize-html","version":"2.9.0","files":["/packages/react-rich-text-renderer/package.json"]},{"name":"@types/semver","version":"7.3.4","files":["/packages/data-migration/package.json"]},{"name":"@types/store","version":"2.0.2","files":["/packages/app-admin/package.json","/packages/app-page-builder/package.json"]},{"name":"@types/uniqid","version":"5.3.2","files":["/packages/feature-flags/package.json","/packages/plugins/package.json"]},{"name":"@types/unzipper","version":"0.10.10","files":["/packages/api-headless-cms-import-export/package.json"]},{"name":"@types/validate-npm-package-name","version":"3.0.3","files":["/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-extensions/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-workspaces/package.json"]},{"name":"@types/warning","version":"3.0.0","files":["/packages/app/package.json"]},{"name":"@types/yargs","version":"17.0.8","files":["/scripts/buildPackages/package.json"]},{"name":"@types/yauzl","version":"2.9.2","files":["/packages/api-page-builder-import-export/package.json"]},{"name":"@typescript-eslint/eslint-plugin","version":"6.21.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@typescript-eslint/parser","version":"6.21.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"adio","version":"1.0.1","files":["/package.json"]},{"name":"adm-zip","version":"0.5.14","files":["/packages/api-headless-cms-import-export/package.json"]},{"name":"amazon-cognito-identity-js","version":"4.5.3","files":["/cypress-tests/package.json"]},{"name":"apollo-client","version":"2.6.10","files":["/packages/app-aco/package.json","/packages/app-trash-bin/package.json"]},{"name":"apollo-graphql","version":"0.9.5","files":["/packages/api-admin-settings/package.json","/packages/api-headless-cms/package.json"]},{"name":"apollo-link","version":"1.2.14","files":["/packages/app-aco/package.json","/packages/app-trash-bin/package.json"]},{"name":"aws-sdk-client-mock","version":"4.1.0","files":["/packages/api-headless-cms-import-export/package.json"]},{"name":"axios","version":"1.8.2","files":["/package.json"]},{"name":"babel-jest","version":"29.7.0","files":["/package.json"]},{"name":"babel-loader","version":"9.2.1","files":["/package.json","/packages/ui/package.json"]},{"name":"babel-plugin-dynamic-import-node","version":"2.3.3","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"babel-plugin-macros","version":"3.1.0","files":["/package.json"]},{"name":"babel-plugin-module-resolver","version":"5.0.2","files":["/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"babel-plugin-named-asset-import","version":"1.0.0-next.3e165448","files":["/packages/app-admin-rmwc/package.json","/packages/app-serverless-cms/package.json","/packages/app-theme-manager/package.json"]},{"name":"bytes","version":"3.1.2","files":["/packages/api-page-builder/package.json"]},{"name":"chalk","version":"4.1.2","files":["/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json","/packages/pulumi-aws/package.json"]},{"name":"cross-env","version":"5.2.1","files":["/package.json","/packages/cwp-template-aws/template/common/apps/admin/package.json","/packages/cwp-template-aws/template/common/apps/website/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json","/apps/admin/package.json","/apps/website/package.json"]},{"name":"cross-spawn","version":"6.0.6","files":["/package.json"]},{"name":"csvtojson","version":"2.0.10","files":["/packages/api-form-builder/package.json","/packages/api-form-builder-so-ddb/package.json","/packages/api-form-builder-so-ddb-es/package.json"]},{"name":"cypress","version":"13.16.0","files":["/cypress-tests/package.json"]},{"name":"cypress-image-snapshot","version":"4.0.1","files":["/cypress-tests/package.json"]},{"name":"cypress-mailosaur","version":"2.7.0","files":["/cypress-tests/package.json"]},{"name":"cypress-wait-until","version":"1.7.1","files":["/cypress-tests/package.json"]},{"name":"deepmerge","version":"4.3.1","files":["/package.json"]},{"name":"del","version":"6.0.0","files":["/cypress-tests/package.json"]},{"name":"dotenv","version":"8.2.0","files":["/packages/cwp-template-aws/package.json"]},{"name":"elastic-ts","version":"0.12.0","files":["/packages/migrations/package.json"]},{"name":"elliptic","version":"6.6.1","files":["/package.json"]},{"name":"env-ci","version":"2.0.1","files":["/package.json"]},{"name":"eslint","version":"8.57.1","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-config-standard","version":"16.0.3","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-import-resolver-babel-module","version":"5.3.2","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-plugin-import","version":"2.27.5","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-plugin-jest","version":"25.7.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-plugin-lodash","version":"7.4.0","files":["/package.json"]},{"name":"eslint-plugin-node","version":"11.1.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-plugin-promise","version":"5.2.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-plugin-react","version":"7.32.2","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"eslint-plugin-standard","version":"5.0.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"execa","version":"5.1.1","files":["/package.json","/packages/app-audit-logs/package.json","/packages/app-page-builder/package.json","/packages/app-page-builder-elements/package.json","/packages/app-theme/package.json","/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json","/packages/theme/package.json","/packages/ui/package.json"]},{"name":"fast-glob","version":"3.2.7","files":["/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json"]},{"name":"find-up","version":"5.0.0","files":["/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json"]},{"name":"folder-hash","version":"4.0.4","files":["/package.json"]},{"name":"fs-extra","version":"11.2.0","files":["/package.json","/packages/api-form-builder/package.json"]},{"name":"get-stream","version":"3.0.0","files":["/package.json"]},{"name":"get-yarn-workspaces","version":"1.0.2","files":["/package.json"]},{"name":"git-cz","version":"1.7.1","files":["/package.json"]},{"name":"github-actions-wac","version":"1.4.1","files":["/package.json"]},{"name":"glob","version":"7.2.3","files":["/package.json","/packages/i18n/package.json"]},{"name":"graphql","version":"15.9.0","files":["/package.json","/packages/api-aco/package.json","/packages/api-apw/package.json","/packages/api-audit-logs/package.json","/packages/api-file-manager-aco/package.json","/packages/api-headless-cms/package.json","/packages/api-headless-cms-aco/package.json","/packages/api-headless-cms-bulk-actions/package.json","/packages/api-headless-cms-import-export/package.json","/packages/api-mailer/package.json","/packages/api-page-builder-aco/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/api-record-locking/package.json","/packages/api-serverless-cms/package.json","/packages/api-websockets/package.json"]},{"name":"graphql-request","version":"3.7.0","files":["/cypress-tests/package.json","/apps/api/graphql/package.json"]},{"name":"husky","version":"4.2.5","files":["/package.json"]},{"name":"identity-obj-proxy","version":"3.0.0","files":["/packages/react-rich-text-lexical-renderer/package.json"]},{"name":"inquirer","version":"8.2.6","files":["/package.json"]},{"name":"inquirer-autocomplete-prompt","version":"1.0.1","files":["/package.json"]},{"name":"inquirer-checkbox-plus-prompt","version":"1.0.1","files":["/package.json"]},{"name":"inquirer-maxlength-input-prompt","version":"1.0.0","files":["/package.json"]},{"name":"jest","version":"29.7.0","files":["/package.json","/packages/api-admin-settings/package.json","/packages/api-admin-users-so-ddb/package.json","/packages/api-apw/package.json","/packages/api-apw-scheduler-so-ddb/package.json","/packages/api-file-manager/package.json","/packages/api-file-manager-ddb/package.json","/packages/api-form-builder/package.json","/packages/api-form-builder-so-ddb/package.json","/packages/api-form-builder-so-ddb-es/package.json","/packages/api-headless-cms/package.json","/packages/api-headless-cms-ddb/package.json","/packages/api-headless-cms-ddb-es/package.json","/packages/api-i18n/package.json","/packages/api-i18n-ddb/package.json","/packages/api-log/package.json","/packages/api-mailer/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-page-builder-import-export-so-ddb/package.json","/packages/api-page-builder-so-ddb/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/api-security-so-ddb/package.json","/packages/api-sync-system/package.json","/packages/api-tenancy/package.json","/packages/api-tenancy-so-ddb/package.json","/packages/api-tenant-manager/package.json","/packages/api-theme-manager/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json","/packages/data-migration/package.json","/packages/db-dynamodb/package.json","/packages/handler-client/package.json","/packages/handler-graphql/package.json","/packages/validation/package.json"]},{"name":"jest-dynalite","version":"3.6.1","files":["/packages/api-admin-settings/package.json","/packages/api-admin-users-so-ddb/package.json","/packages/api-apw-scheduler-so-ddb/package.json","/packages/api-authentication/package.json","/packages/api-file-manager-ddb/package.json","/packages/api-form-builder/package.json","/packages/api-form-builder-so-ddb/package.json","/packages/api-form-builder-so-ddb-es/package.json","/packages/api-headless-cms-ddb/package.json","/packages/api-headless-cms-ddb-es/package.json","/packages/api-i18n-ddb/package.json","/packages/api-log/package.json","/packages/api-mailer/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-page-builder-import-export-so-ddb/package.json","/packages/api-page-builder-so-ddb/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/api-prerendering-service-so-ddb/package.json","/packages/api-security-so-ddb/package.json","/packages/api-sync-system/package.json","/packages/api-tenancy/package.json","/packages/api-tenancy-so-ddb/package.json","/packages/api-tenant-manager/package.json","/packages/api-wcp/package.json","/packages/data-migration/package.json","/packages/db-dynamodb/package.json","/packages/migrations/package.json","/packages/project-utils/package.json"]},{"name":"jest-environment-jsdom","version":"29.7.0","files":["/package.json"]},{"name":"jest-extended","version":"4.0.2","files":["/package.json"]},{"name":"jest-mock-console","version":"2.0.0","files":["/packages/data-migration/package.json","/packages/handler-graphql/package.json"]},{"name":"jsdom","version":"25.0.1","files":["/packages/lexical-converter/package.json"]},{"name":"jsonpack","version":"1.1.5","files":["/packages/api-file-manager-ddb/package.json"]},{"name":"lerna","version":"8.1.2","files":["/package.json"]},{"name":"lexical","version":"0.23.1","files":["/package.json"]},{"name":"lint-staged","version":"15.3.0","files":["/package.json"]},{"name":"listr","version":"0.14.3","files":["/package.json"]},{"name":"listr2","version":"5.0.8","files":["/packages/project-utils/package.json"]},{"name":"load-json-file","version":"6.2.0","files":["/package.json","/packages/project-utils/package.json"]},{"name":"lodash","version":"4.17.21","files":["/package.json","/cypress-tests/package.json"]},{"name":"longest","version":"2.0.1","files":["/package.json"]},{"name":"md5","version":"2.3.0","files":["/packages/api-security-cognito/package.json"]},{"name":"merge","version":"2.1.1","files":["/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"micromatch","version":"4.0.8","files":["/package.json"]},{"name":"mime","version":"3.0.0","files":["/packages/pulumi-aws/package.json"]},{"name":"minimatch","version":"5.1.6","files":["/package.json"]},{"name":"mobx","version":"6.9.0","files":["/packages/form/package.json"]},{"name":"mobx-react-lite","version":"3.4.3","files":["/packages/form/package.json"]},{"name":"monaco-editor","version":"0.52.2","files":["/packages/app-admin/package.json"]},{"name":"nanoid","version":"3.3.8","files":["/package.json","/cypress-tests/package.json"]},{"name":"ncp","version":"2.0.0","files":["/packages/ui/package.json"]},{"name":"node-fetch","version":"2.6.7","files":["/package.json","/cypress-tests/package.json"]},{"name":"pino","version":"8.21.0","files":["/packages/logger/package.json","/packages/project-utils/package.json"]},{"name":"pino-pretty","version":"9.4.0","files":["/packages/project-utils/package.json"]},{"name":"pm2","version":"5.4.3","files":["/package.json"]},{"name":"prettier","version":"2.8.8","files":["/package.json","/packages/api-aco/package.json","/packages/api-admin-settings/package.json","/packages/api-apw/package.json","/packages/api-headless-cms/package.json","/packages/api-headless-cms-ddb-es/package.json","/packages/api-page-builder/package.json","/packages/api-prerendering-service/package.json","/packages/api-prerendering-service-so-ddb/package.json","/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json","/packages/react-properties/package.json","/packages/react-rich-text-lexical-renderer/package.json"]},{"name":"raw-loader","version":"4.0.2","files":["/packages/ui/package.json"]},{"name":"react","version":"18.2.0","files":["/packages/lexical-nodes/package.json"]},{"name":"rimraf","version":"6.0.1","files":["/packages/api/package.json","/packages/api-aco/package.json","/packages/api-admin-settings/package.json","/packages/api-admin-users/package.json","/packages/api-admin-users-so-ddb/package.json","/packages/api-apw/package.json","/packages/api-apw-scheduler-so-ddb/package.json","/packages/api-authentication/package.json","/packages/api-authentication-cognito/package.json","/packages/api-background-tasks-ddb/package.json","/packages/api-background-tasks-es/package.json","/packages/api-background-tasks-os/package.json","/packages/api-cognito-authenticator/package.json","/packages/api-elasticsearch/package.json","/packages/api-elasticsearch-tasks/package.json","/packages/api-file-manager/package.json","/packages/api-file-manager-ddb/package.json","/packages/api-file-manager-s3/package.json","/packages/api-form-builder/package.json","/packages/api-form-builder-so-ddb/package.json","/packages/api-form-builder-so-ddb-es/package.json","/packages/api-headless-cms/package.json","/packages/api-headless-cms-ddb-es/package.json","/packages/api-i18n/package.json","/packages/api-i18n-content/package.json","/packages/api-i18n-ddb/package.json","/packages/api-log/package.json","/packages/api-mailer/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-page-builder-import-export-so-ddb/package.json","/packages/api-page-builder-so-ddb/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/api-prerendering-service/package.json","/packages/api-prerendering-service-aws/package.json","/packages/api-prerendering-service-so-ddb/package.json","/packages/api-record-locking/package.json","/packages/api-security/package.json","/packages/api-security-auth0/package.json","/packages/api-security-cognito/package.json","/packages/api-security-okta/package.json","/packages/api-security-so-ddb/package.json","/packages/api-serverless-cms/package.json","/packages/api-sync-system/package.json","/packages/api-tenancy/package.json","/packages/api-tenancy-so-ddb/package.json","/packages/api-tenant-manager/package.json","/packages/api-theme-manager/package.json","/packages/api-wcp/package.json","/packages/api-websockets/package.json","/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-cognito-authenticator/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-file-manager-s3/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-i18n-content/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-page-builder-elements/package.json","/packages/app-plugin-admin-welcome-screen/package.json","/packages/app-record-locking/package.json","/packages/app-security/package.json","/packages/app-security-access-management/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme/package.json","/packages/app-theme-manager/package.json","/packages/app-trash-bin/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/app-websockets/package.json","/packages/aws-sdk/package.json","/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-extensions/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json","/packages/cli-plugin-scaffold-workspaces/package.json","/packages/data-migration/package.json","/packages/db/package.json","/packages/db-dynamodb/package.json","/packages/error/package.json","/packages/feature-flags/package.json","/packages/form/package.json","/packages/handler/package.json","/packages/handler-aws/package.json","/packages/handler-client/package.json","/packages/handler-db/package.json","/packages/handler-graphql/package.json","/packages/i18n/package.json","/packages/i18n-react/package.json","/packages/logger/package.json","/packages/plugins/package.json","/packages/pubsub/package.json","/packages/pulumi/package.json","/packages/pulumi-aws/package.json","/packages/pulumi-sdk/package.json","/packages/react-rich-text-renderer/package.json","/packages/react-router/package.json","/packages/tasks/package.json","/packages/theme/package.json","/packages/ui/package.json","/packages/ui-composer/package.json","/packages/utils/package.json","/packages/validation/package.json","/packages/wcp/package.json"]},{"name":"semver","version":"7.6.3","files":["/package.json"]},{"name":"source-map-explorer","version":"2.5.3","files":["/apps/website/package.json"]},{"name":"ts-expect","version":"1.3.0","files":["/package.json"]},{"name":"ts-jest","version":"29.1.5","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"ts-jest-resolver","version":"2.0.1","files":["/package.json"]},{"name":"ts-node","version":"10.9.2","files":["/package.json","/scripts/buildPackages/package.json","/scripts/prepublishOnly/package.json"]},{"name":"ttypescript","version":"1.5.15","files":["/packages/api-file-manager-aco/package.json","/packages/app-dynamic-pages/package.json"]},{"name":"type-fest","version":"4.14.0","files":["/package.json","/packages/api-elasticsearch-tasks/package.json","/packages/api-record-locking/package.json","/packages/cli-plugin-dependencies/package.json","/packages/tasks/package.json","/scripts/prepublishOnly/package.json"]},{"name":"typescript","version":"5.3.3","files":["/package.json","/packages/api/package.json","/packages/api-aco/package.json","/packages/api-admin-settings/package.json","/packages/api-admin-users/package.json","/packages/api-admin-users-so-ddb/package.json","/packages/api-apw/package.json","/packages/api-apw-scheduler-so-ddb/package.json","/packages/api-audit-logs/package.json","/packages/api-authentication/package.json","/packages/api-authentication-cognito/package.json","/packages/api-background-tasks-ddb/package.json","/packages/api-background-tasks-es/package.json","/packages/api-background-tasks-os/package.json","/packages/api-cognito-authenticator/package.json","/packages/api-dynamodb-to-elasticsearch/package.json","/packages/api-elasticsearch/package.json","/packages/api-elasticsearch-tasks/package.json","/packages/api-file-manager/package.json","/packages/api-file-manager-aco/package.json","/packages/api-file-manager-ddb/package.json","/packages/api-file-manager-s3/package.json","/packages/api-form-builder/package.json","/packages/api-form-builder-so-ddb/package.json","/packages/api-form-builder-so-ddb-es/package.json","/packages/api-headless-cms/package.json","/packages/api-headless-cms-aco/package.json","/packages/api-headless-cms-bulk-actions/package.json","/packages/api-headless-cms-ddb/package.json","/packages/api-headless-cms-ddb-es/package.json","/packages/api-headless-cms-es-tasks/package.json","/packages/api-headless-cms-import-export/package.json","/packages/api-headless-cms-tasks/package.json","/packages/api-headless-cms-tasks-ddb-es/package.json","/packages/api-i18n/package.json","/packages/api-i18n-content/package.json","/packages/api-i18n-ddb/package.json","/packages/api-log/package.json","/packages/api-mailer/package.json","/packages/api-page-builder/package.json","/packages/api-page-builder-aco/package.json","/packages/api-page-builder-import-export/package.json","/packages/api-page-builder-import-export-so-ddb/package.json","/packages/api-page-builder-so-ddb/package.json","/packages/api-page-builder-so-ddb-es/package.json","/packages/api-prerendering-service/package.json","/packages/api-prerendering-service-aws/package.json","/packages/api-prerendering-service-so-ddb/package.json","/packages/api-record-locking/package.json","/packages/api-security/package.json","/packages/api-security-auth0/package.json","/packages/api-security-cognito/package.json","/packages/api-security-okta/package.json","/packages/api-security-so-ddb/package.json","/packages/api-serverless-cms/package.json","/packages/api-sync-system/package.json","/packages/api-tenancy/package.json","/packages/api-tenancy-so-ddb/package.json","/packages/api-tenant-manager/package.json","/packages/api-theme-manager/package.json","/packages/api-wcp/package.json","/packages/api-websockets/package.json","/packages/app/package.json","/packages/app-aco/package.json","/packages/app-admin/package.json","/packages/app-admin-auth0/package.json","/packages/app-admin-cognito/package.json","/packages/app-admin-okta/package.json","/packages/app-admin-rmwc/package.json","/packages/app-admin-users-cognito/package.json","/packages/app-apw/package.json","/packages/app-audit-logs/package.json","/packages/app-cognito-authenticator/package.json","/packages/app-dynamic-pages/package.json","/packages/app-file-manager/package.json","/packages/app-file-manager-s3/package.json","/packages/app-form-builder/package.json","/packages/app-graphql-playground/package.json","/packages/app-headless-cms/package.json","/packages/app-headless-cms-common/package.json","/packages/app-i18n/package.json","/packages/app-i18n-content/package.json","/packages/app-mailer/package.json","/packages/app-page-builder/package.json","/packages/app-page-builder-elements/package.json","/packages/app-plugin-admin-welcome-screen/package.json","/packages/app-record-locking/package.json","/packages/app-security/package.json","/packages/app-security-access-management/package.json","/packages/app-serverless-cms/package.json","/packages/app-tenancy/package.json","/packages/app-tenant-manager/package.json","/packages/app-theme/package.json","/packages/app-theme-manager/package.json","/packages/app-trash-bin/package.json","/packages/app-utils/package.json","/packages/app-wcp/package.json","/packages/app-website/package.json","/packages/app-websockets/package.json","/packages/aws-sdk/package.json","/packages/cli-plugin-dependencies/package.json","/packages/cli-plugin-deploy-pulumi/package.json","/packages/cli-plugin-extensions/package.json","/packages/cli-plugin-scaffold/package.json","/packages/cli-plugin-scaffold-admin-app-module/package.json","/packages/cli-plugin-scaffold-ci/package.json","/packages/cli-plugin-scaffold-extensions/package.json","/packages/cli-plugin-scaffold-graphql-service/package.json","/packages/cli-plugin-scaffold-react-component/package.json","/packages/cli-plugin-scaffold-react-component/template/package.json","/packages/cli-plugin-scaffold-workspaces/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json","/packages/data-migration/package.json","/packages/db/package.json","/packages/db-dynamodb/package.json","/packages/di-container/package.json","/packages/error/package.json","/packages/feature-flags/package.json","/packages/form/package.json","/packages/handler/package.json","/packages/handler-aws/package.json","/packages/handler-client/package.json","/packages/handler-db/package.json","/packages/handler-graphql/package.json","/packages/i18n/package.json","/packages/i18n-react/package.json","/packages/ioc/package.json","/packages/logger/package.json","/packages/migrations/package.json","/packages/plugins/package.json","/packages/pubsub/package.json","/packages/pulumi/package.json","/packages/pulumi-aws/package.json","/packages/pulumi-sdk/package.json","/packages/react-composition/package.json","/packages/react-rich-text-renderer/package.json","/packages/react-router/package.json","/packages/serverless-cms-aws/package.json","/packages/shared-aco/package.json","/packages/tasks/package.json","/packages/theme/package.json","/packages/ui/package.json","/packages/ui-composer/package.json","/packages/utils/package.json","/packages/validation/package.json","/packages/wcp/package.json","/cypress-tests/package.json"]},{"name":"typescript-transform-paths","version":"3.5.3","files":["/package.json"]},{"name":"uniqid","version":"5.4.0","files":["/cypress-tests/package.json"]},{"name":"verdaccio","version":"6.0.5","files":["/package.json"]},{"name":"write-json-file","version":"4.3.0","files":["/package.json","/packages/api-headless-cms/package.json"]},{"name":"yargs","version":"17.7.2","files":["/package.json","/packages/project-utils/package.json"]},{"name":"zod","version":"3.23.8","files":["/packages/ioc/package.json"]}],"peerDependencies":[{"name":"@editorjs/editorjs","version":"2.26.5","files":["/packages/app-page-builder-elements/package.json"]},{"name":"aos","version":"2.3.4","files":["/packages/app-page-builder-elements/package.json"]},{"name":"minimatch","version":"5.1.6","files":["/packages/ui/package.json"]},{"name":"react","version":"18.2.0","files":["/packages/app-audit-logs/package.json","/packages/app-page-builder-elements/package.json","/packages/app-theme/package.json","/packages/form/package.json","/packages/i18n/package.json","/packages/i18n-react/package.json","/packages/react-router/package.json","/packages/theme/package.json","/packages/ui/package.json"]},{"name":"react-columned","version":"1.1.3","files":["/packages/app-page-builder-elements/package.json"]},{"name":"react-dom","version":"18.2.0","files":["/packages/ui/package.json"]},{"name":"react-google-recaptcha","version":"1.1.0","files":["/packages/app-page-builder-elements/package.json"]},{"name":"react-images","version":"0.5.19","files":["/packages/app-page-builder-elements/package.json"]},{"name":"swiper","version":"9.3.2","files":["/packages/app-page-builder-elements/package.json"]},{"name":"zod","version":"3.23.8","files":["/packages/utils/package.json"]}],"resolutions":[{"name":"@emotion/react","version":"11.10.8","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@grpc/grpc-js","version":"1.11.1","files":["/package.json"]},{"name":"@octokit/rest","version":"20.0.2","files":["/package.json"]},{"name":"@types/react","version":"18.2.79","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"@types/react-dom","version":"18.2.25","files":["/package.json"]},{"name":"@types/webpack","version":"5.28.0","files":["/package.json"]},{"name":"postcss","version":"8.4.35","files":["/package.json"]},{"name":"react","version":"18.2.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"react-dom","version":"18.2.0","files":["/package.json","/packages/cwp-template-aws/template/ddb-es/dependencies.json","/packages/cwp-template-aws/template/ddb-os/dependencies.json","/packages/cwp-template-aws/template/ddb/dependencies.json"]},{"name":"semver","version":"7.6.3","files":["/package.json"]},{"name":"systeminformation","version":"5.23.18","files":["/package.json"]},{"name":"tar","version":"6.2.1","files":["/package.json"]}],"references":[{"name":"@babel/cli","versions":[{"version":"7.27.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/code-frame","versions":[{"version":"7.27.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]}]}]},{"name":"@babel/compat-data","versions":[{"version":"7.27.5","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@babel/core","versions":[{"version":"7.27.4","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/helper-define-polyfill-provider","versions":[{"version":"0.6.4","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@babel/helper-environment-visitor","versions":[{"version":"7.24.7","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@babel/parser","versions":[{"version":"7.27.5","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@babel/plugin-proposal-class-properties","versions":[{"version":"7.18.6","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/plugin-proposal-object-rest-spread","versions":[{"version":"7.20.7","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/plugin-proposal-throw-expressions","versions":[{"version":"7.27.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/plugin-syntax-object-rest-spread","versions":[{"version":"7.8.3","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/plugin-transform-modules-commonjs","versions":[{"version":"7.27.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@babel/plugin-transform-runtime","versions":[{"version":"7.27.4","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"@babel/preset-env","versions":[{"version":"7.27.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/preset-react","versions":[{"version":"7.27.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/preset-typescript","versions":[{"version":"7.27.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/register","versions":[{"version":"7.27.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/i18n/package.json","types":["devDependencies"]}]}]},{"name":"@babel/runtime","versions":[{"version":"7.27.4","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@babel/template","versions":[{"version":"7.27.2","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@babel/traverse","versions":[{"version":"7.27.4","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@babel/types","versions":[{"version":"7.27.3","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@commitlint/cli","versions":[{"version":"11.0.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@commitlint/config-conventional","versions":[{"version":"11.0.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@grpc/grpc-js","versions":[{"version":"1.11.1","files":[{"file":"/package.json","types":["devDependencies","resolutions"]}]}]},{"name":"@lexical/code","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/hashtag","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/headless","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-converter/package.json","types":["dependencies"]}]}]},{"name":"@lexical/history","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/html","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-converter/package.json","types":["dependencies"]}]}]},{"name":"@lexical/list","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/mark","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/overflow","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/react","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/rich-text","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/selection","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-actions/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@lexical/text","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]}]}]},{"name":"@lexical/utils","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-pb-element/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"@octokit/rest","versions":[{"version":"20.0.2","files":[{"file":"/package.json","types":["devDependencies","resolutions"]}]}]},{"name":"@types/fs-extra","versions":[{"version":"11.0.4","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@types/hoist-non-react-statics","versions":[{"version":"3.3.5","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@types/jest","versions":[{"version":"29.5.14","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"@types/node","versions":[{"version":"20.17.10","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"@types/prettier","versions":[{"version":"2.7.3","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"@types/react","versions":[{"version":"18.2.79","files":[{"file":"/package.json","types":["devDependencies","resolutions"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["devDependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["devDependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme/package.json","types":["devDependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies","resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies","resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies","resolutions"]},{"file":"/packages/react-composition/package.json","types":["dependencies"]},{"file":"/packages/react-properties/package.json","types":["dependencies"]},{"file":"/packages/react-rich-text-lexical-renderer/package.json","types":["dependencies"]},{"file":"/packages/react-rich-text-renderer/package.json","types":["dependencies"]},{"file":"/packages/theme/package.json","types":["devDependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"@types/react-dom","versions":[{"version":"18.2.25","files":[{"file":"/package.json","types":["devDependencies","resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"@typescript-eslint/eslint-plugin","versions":[{"version":"6.21.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"@typescript-eslint/parser","versions":[{"version":"6.21.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"adio","versions":[{"version":"1.0.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"axios","versions":[{"version":"1.8.2","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"babel-jest","versions":[{"version":"29.7.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"babel-loader","versions":[{"version":"9.2.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"babel-plugin-dynamic-import-node","versions":[{"version":"2.3.3","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"babel-plugin-macros","versions":[{"version":"3.1.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"babel-plugin-module-resolver","versions":[{"version":"5.0.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"chalk","versions":[{"version":"4.1.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/aws-layers/package.json","types":["dependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies","devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-workspaces/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/data-migration/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["devDependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]},{"file":"/packages/system-requirements/package.json","types":["dependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["dependencies"]}]}]},{"name":"cross-env","versions":[{"version":"5.2.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/apps/admin/package.json","types":["devDependencies"]},{"file":"/apps/website/package.json","types":["devDependencies"]}]}]},{"name":"cross-spawn","versions":[{"version":"6.0.6","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"deepmerge","versions":[{"version":"4.3.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"elliptic","versions":[{"version":"6.6.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"env-ci","versions":[{"version":"2.0.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"eslint","versions":[{"version":"8.57.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"eslint-config-standard","versions":[{"version":"16.0.3","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"eslint-import-resolver-babel-module","versions":[{"version":"5.3.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"eslint-plugin-import","versions":[{"version":"2.27.5","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"eslint-plugin-jest","versions":[{"version":"25.7.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"eslint-plugin-lodash","versions":[{"version":"7.4.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"eslint-plugin-node","versions":[{"version":"11.1.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"eslint-plugin-promise","versions":[{"version":"5.2.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"eslint-plugin-react","versions":[{"version":"7.32.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"eslint-plugin-standard","versions":[{"version":"5.0.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"execa","versions":[{"version":"5.1.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["devDependencies"]},{"file":"/packages/app-theme/package.json","types":["devDependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies","devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-workspaces/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]},{"file":"/packages/system-requirements/package.json","types":["dependencies"]},{"file":"/packages/theme/package.json","types":["devDependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]}]}]},{"name":"folder-hash","versions":[{"version":"4.0.4","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]}]}]},{"name":"fs-extra","versions":[{"version":"11.2.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["dependencies"]}]}]},{"name":"get-stream","versions":[{"version":"3.0.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"get-yarn-workspaces","versions":[{"version":"1.0.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["dependencies"]}]}]},{"name":"git-cz","versions":[{"version":"1.7.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"github-actions-wac","versions":[{"version":"1.4.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"glob","versions":[{"version":"7.2.3","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/i18n/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"graphql","versions":[{"version":"15.9.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-apw/package.json","types":["devDependencies"]},{"file":"/packages/api-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies","devDependencies"]},{"file":"/packages/api-headless-cms-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-bulk-actions/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-content/package.json","types":["dependencies"]},{"file":"/packages/api-mailer/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-record-locking/package.json","types":["devDependencies"]},{"file":"/packages/api-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-websockets/package.json","types":["devDependencies"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/extensions/theme/package.json","types":["dependencies"]},{"file":"/packages/handler-graphql/package.json","types":["dependencies"]},{"file":"/packages/react-router/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]},{"file":"/extensions/theme/package.json","types":["dependencies"]}]}]},{"name":"husky","versions":[{"version":"4.2.5","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"inquirer","versions":[{"version":"8.2.6","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]}]}]},{"name":"inquirer-autocomplete-prompt","versions":[{"version":"1.0.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"inquirer-checkbox-plus-prompt","versions":[{"version":"1.0.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"inquirer-maxlength-input-prompt","versions":[{"version":"1.0.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"jest","versions":[{"version":"29.7.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-settings/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-users-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-apw/package.json","types":["devDependencies"]},{"file":"/packages/api-apw-scheduler-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-log/package.json","types":["devDependencies"]},{"file":"/packages/api-mailer/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-security-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-sync-system/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-theme-manager/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/data-migration/package.json","types":["devDependencies"]},{"file":"/packages/db-dynamodb/package.json","types":["devDependencies"]},{"file":"/packages/handler-client/package.json","types":["devDependencies"]},{"file":"/packages/handler-graphql/package.json","types":["devDependencies"]},{"file":"/packages/validation/package.json","types":["devDependencies"]}]}]},{"name":"jest-environment-jsdom","versions":[{"version":"29.7.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"jest-extended","versions":[{"version":"4.0.2","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"lerna","versions":[{"version":"8.1.2","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"lexical","versions":[{"version":"0.23.1","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/lexical-converter/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]},{"file":"/packages/lexical-theme/package.json","types":["dependencies"]}]}]},{"name":"lint-staged","versions":[{"version":"15.3.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"listr","versions":[{"version":"0.14.3","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]}]}]},{"name":"load-json-file","versions":[{"version":"6.2.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/global-config/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["devDependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["dependencies"]}]}]},{"name":"lodash","versions":[{"version":"4.17.21","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-aco/package.json","types":["dependencies"]},{"file":"/packages/api-admin-users/package.json","types":["dependencies"]},{"file":"/packages/api-apw/package.json","types":["dependencies"]},{"file":"/packages/api-file-manager/package.json","types":["dependencies"]},{"file":"/packages/api-form-builder/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-ddb/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["dependencies"]},{"file":"/packages/api-mailer/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-aco/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["dependencies"]},{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]},{"file":"/packages/api-prerendering-service-aws/package.json","types":["dependencies"]},{"file":"/packages/api-sync-system/package.json","types":["dependencies"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["dependencies"]},{"file":"/packages/app-cognito-authenticator/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/db-dynamodb/package.json","types":["dependencies"]},{"file":"/packages/form/package.json","types":["dependencies"]},{"file":"/packages/i18n/package.json","types":["dependencies"]},{"file":"/packages/i18n-react/package.json","types":["dependencies"]},{"file":"/packages/migrations/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/pulumi/package.json","types":["dependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["dependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]},{"file":"/packages/tasks/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]},{"file":"/packages/validation/package.json","types":["dependencies"]},{"file":"/cypress-tests/package.json","types":["devDependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["dependencies"]}]}]},{"name":"longest","versions":[{"version":"2.0.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"micromatch","versions":[{"version":"4.0.8","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"minimatch","versions":[{"version":"5.1.6","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-security/package.json","types":["dependencies"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-security/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/data-migration/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["peerDependencies"]}]}]},{"name":"nanoid","versions":[{"version":"3.3.8","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/react-properties/package.json","types":["dependencies"]},{"file":"/packages/utils/package.json","types":["dependencies"]},{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"node-fetch","versions":[{"version":"2.6.7","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-cognito-authenticator/package.json","types":["dependencies"]},{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/api-form-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["dependencies"]},{"file":"/packages/api-security-okta/package.json","types":["dependencies"]},{"file":"/packages/api-wcp/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["dependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]},{"file":"/packages/wcp/package.json","types":["dependencies"]},{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"pm2","versions":[{"version":"5.4.3","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"prettier","versions":[{"version":"2.8.8","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-settings/package.json","types":["devDependencies"]},{"file":"/packages/api-apw/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/react-properties/package.json","types":["devDependencies"]},{"file":"/packages/react-rich-text-lexical-renderer/package.json","types":["devDependencies"]}]}]},{"name":"semver","versions":[{"version":"7.6.3","files":[{"file":"/package.json","types":["devDependencies","resolutions"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/api-sync-system/package.json","types":["dependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/data-migration/package.json","types":["dependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]},{"file":"/packages/system-requirements/package.json","types":["dependencies"]}]}]},{"name":"ts-expect","versions":[{"version":"1.3.0","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"ts-jest","versions":[{"version":"29.1.5","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"ts-jest-resolver","versions":[{"version":"2.0.1","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"ts-node","versions":[{"version":"10.9.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/scripts/buildPackages/package.json","types":["devDependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["devDependencies"]}]}]},{"name":"type-fest","versions":[{"version":"4.14.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-elasticsearch-tasks/package.json","types":["devDependencies"]},{"file":"/packages/api-record-locking/package.json","types":["devDependencies"]},{"file":"/packages/api-websockets/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["devDependencies"]},{"file":"/packages/db/package.json","types":["dependencies"]},{"file":"/packages/tasks/package.json","types":["devDependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["devDependencies"]}]}]},{"name":"typescript","versions":[{"version":"5.3.3","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api/package.json","types":["devDependencies"]},{"file":"/packages/api-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-settings/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-users/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-users-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-apw/package.json","types":["devDependencies"]},{"file":"/packages/api-apw-scheduler-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/api-authentication/package.json","types":["devDependencies"]},{"file":"/packages/api-authentication-cognito/package.json","types":["devDependencies"]},{"file":"/packages/api-background-tasks-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-background-tasks-es/package.json","types":["devDependencies"]},{"file":"/packages/api-background-tasks-os/package.json","types":["devDependencies"]},{"file":"/packages/api-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/api-dynamodb-to-elasticsearch/package.json","types":["devDependencies"]},{"file":"/packages/api-elasticsearch/package.json","types":["devDependencies"]},{"file":"/packages/api-elasticsearch-tasks/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-s3/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-bulk-actions/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-es-tasks/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-tasks/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-tasks-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-content/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-log/package.json","types":["devDependencies"]},{"file":"/packages/api-mailer/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service-aws/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-record-locking/package.json","types":["devDependencies"]},{"file":"/packages/api-security/package.json","types":["devDependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["devDependencies"]},{"file":"/packages/api-security-cognito/package.json","types":["devDependencies"]},{"file":"/packages/api-security-okta/package.json","types":["devDependencies"]},{"file":"/packages/api-security-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-sync-system/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-theme-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-wcp/package.json","types":["devDependencies"]},{"file":"/packages/api-websockets/package.json","types":["devDependencies"]},{"file":"/packages/app/package.json","types":["devDependencies"]},{"file":"/packages/app-aco/package.json","types":["devDependencies"]},{"file":"/packages/app-admin/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["devDependencies"]},{"file":"/packages/app-apw/package.json","types":["devDependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/app-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["devDependencies"]},{"file":"/packages/app-file-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-file-manager-s3/package.json","types":["devDependencies"]},{"file":"/packages/app-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n-content/package.json","types":["devDependencies"]},{"file":"/packages/app-mailer/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["devDependencies"]},{"file":"/packages/app-plugin-admin-welcome-screen/package.json","types":["devDependencies"]},{"file":"/packages/app-record-locking/package.json","types":["devDependencies"]},{"file":"/packages/app-security/package.json","types":["devDependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["devDependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-theme/package.json","types":["devDependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["devDependencies"]},{"file":"/packages/app-utils/package.json","types":["devDependencies"]},{"file":"/packages/app-wcp/package.json","types":["devDependencies"]},{"file":"/packages/app-website/package.json","types":["devDependencies"]},{"file":"/packages/app-websockets/package.json","types":["devDependencies"]},{"file":"/packages/aws-sdk/package.json","types":["devDependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/data-migration/package.json","types":["devDependencies"]},{"file":"/packages/db/package.json","types":["devDependencies"]},{"file":"/packages/db-dynamodb/package.json","types":["devDependencies"]},{"file":"/packages/di-container/package.json","types":["devDependencies"]},{"file":"/packages/error/package.json","types":["devDependencies"]},{"file":"/packages/feature-flags/package.json","types":["devDependencies"]},{"file":"/packages/form/package.json","types":["devDependencies"]},{"file":"/packages/handler/package.json","types":["devDependencies"]},{"file":"/packages/handler-aws/package.json","types":["devDependencies"]},{"file":"/packages/handler-client/package.json","types":["devDependencies"]},{"file":"/packages/handler-db/package.json","types":["devDependencies"]},{"file":"/packages/handler-graphql/package.json","types":["devDependencies"]},{"file":"/packages/i18n/package.json","types":["devDependencies"]},{"file":"/packages/i18n-react/package.json","types":["devDependencies"]},{"file":"/packages/ioc/package.json","types":["devDependencies"]},{"file":"/packages/logger/package.json","types":["devDependencies"]},{"file":"/packages/migrations/package.json","types":["devDependencies"]},{"file":"/packages/plugins/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/pubsub/package.json","types":["devDependencies"]},{"file":"/packages/pulumi/package.json","types":["devDependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["devDependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["devDependencies"]},{"file":"/packages/react-composition/package.json","types":["devDependencies"]},{"file":"/packages/react-rich-text-renderer/package.json","types":["devDependencies"]},{"file":"/packages/react-router/package.json","types":["devDependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["devDependencies"]},{"file":"/packages/shared-aco/package.json","types":["devDependencies"]},{"file":"/packages/tasks/package.json","types":["devDependencies"]},{"file":"/packages/theme/package.json","types":["devDependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]},{"file":"/packages/ui-composer/package.json","types":["devDependencies"]},{"file":"/packages/utils/package.json","types":["devDependencies"]},{"file":"/packages/validation/package.json","types":["devDependencies"]},{"file":"/packages/wcp/package.json","types":["devDependencies"]},{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"typescript-transform-paths","versions":[{"version":"3.5.3","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"verdaccio","versions":[{"version":"6.0.5","files":[{"file":"/package.json","types":["devDependencies"]}]}]},{"name":"write-json-file","versions":[{"version":"4.3.0","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/global-config/package.json","types":["dependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["dependencies"]}]}]},{"name":"yargs","versions":[{"version":"17.7.2","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/i18n/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["devDependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]}]}]},{"name":"systeminformation","versions":[{"version":"5.23.18","files":[{"file":"/package.json","types":["resolutions"]}]}]},{"name":"@emotion/react","versions":[{"version":"11.10.8","files":[{"file":"/package.json","types":["resolutions"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["dependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/extensions/theme/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["resolutions"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-theme/package.json","types":["dependencies"]},{"file":"/packages/react-rich-text-lexical-renderer/package.json","types":["devDependencies"]},{"file":"/packages/theme/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]},{"file":"/extensions/theme/package.json","types":["dependencies"]}]}]},{"name":"@types/webpack","versions":[{"version":"5.28.0","files":[{"file":"/package.json","types":["resolutions"]}]}]},{"name":"react","versions":[{"version":"18.2.0","files":[{"file":"/package.json","types":["resolutions"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["peerDependencies"]},{"file":"/packages/app-cognito-authenticator/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-i18n-content/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["peerDependencies"]},{"file":"/packages/app-plugin-admin-welcome-screen/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-security/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme/package.json","types":["peerDependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/app-websockets/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/templates/admin/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/templates/pbElement/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/templates/website/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/extensions/theme/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["resolutions"]},{"file":"/packages/form/package.json","types":["peerDependencies"]},{"file":"/packages/i18n/package.json","types":["peerDependencies"]},{"file":"/packages/i18n-react/package.json","types":["peerDependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-actions/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-pb-element/package.json","types":["dependencies"]},{"file":"/packages/lexical-nodes/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/react-composition/package.json","types":["dependencies"]},{"file":"/packages/react-properties/package.json","types":["dependencies"]},{"file":"/packages/react-rich-text-lexical-renderer/package.json","types":["dependencies"]},{"file":"/packages/react-rich-text-renderer/package.json","types":["dependencies"]},{"file":"/packages/react-router/package.json","types":["dependencies","peerDependencies"]},{"file":"/packages/theme/package.json","types":["peerDependencies"]},{"file":"/packages/ui/package.json","types":["peerDependencies"]},{"file":"/packages/ui-composer/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]},{"file":"/extensions/theme/package.json","types":["dependencies"]}]}]},{"name":"react-dom","versions":[{"version":"18.2.0","files":[{"file":"/package.json","types":["resolutions"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-cognito-authenticator/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-i18n-content/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-plugin-admin-welcome-screen/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-security/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/app-websockets/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["resolutions"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["resolutions"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-actions/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-pb-element/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/react-composition/package.json","types":["dependencies"]},{"file":"/packages/react-router/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["peerDependencies"]},{"file":"/packages/ui-composer/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"tar","versions":[{"version":"6.2.1","files":[{"file":"/package.json","types":["resolutions"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]}]}]},{"name":"postcss","versions":[{"version":"8.4.35","files":[{"file":"/package.json","types":["resolutions"]}]}]},{"name":"rimraf","versions":[{"version":"6.0.1","files":[{"file":"/packages/api/package.json","types":["devDependencies"]},{"file":"/packages/api-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-settings/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-users/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-users-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-apw/package.json","types":["devDependencies"]},{"file":"/packages/api-apw-scheduler-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-authentication/package.json","types":["devDependencies"]},{"file":"/packages/api-authentication-cognito/package.json","types":["devDependencies"]},{"file":"/packages/api-background-tasks-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-background-tasks-es/package.json","types":["devDependencies"]},{"file":"/packages/api-background-tasks-os/package.json","types":["devDependencies"]},{"file":"/packages/api-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/api-elasticsearch/package.json","types":["devDependencies"]},{"file":"/packages/api-elasticsearch-tasks/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-s3/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-content/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-log/package.json","types":["devDependencies"]},{"file":"/packages/api-mailer/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service-aws/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-record-locking/package.json","types":["devDependencies"]},{"file":"/packages/api-security/package.json","types":["devDependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["devDependencies"]},{"file":"/packages/api-security-cognito/package.json","types":["devDependencies"]},{"file":"/packages/api-security-okta/package.json","types":["devDependencies"]},{"file":"/packages/api-security-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-sync-system/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-theme-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-wcp/package.json","types":["devDependencies"]},{"file":"/packages/api-websockets/package.json","types":["devDependencies"]},{"file":"/packages/app/package.json","types":["devDependencies"]},{"file":"/packages/app-aco/package.json","types":["devDependencies"]},{"file":"/packages/app-admin/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["devDependencies"]},{"file":"/packages/app-apw/package.json","types":["devDependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/app-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["devDependencies"]},{"file":"/packages/app-file-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-file-manager-s3/package.json","types":["devDependencies"]},{"file":"/packages/app-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n-content/package.json","types":["devDependencies"]},{"file":"/packages/app-mailer/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["devDependencies"]},{"file":"/packages/app-plugin-admin-welcome-screen/package.json","types":["devDependencies"]},{"file":"/packages/app-record-locking/package.json","types":["devDependencies"]},{"file":"/packages/app-security/package.json","types":["devDependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["devDependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-theme/package.json","types":["devDependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["devDependencies"]},{"file":"/packages/app-wcp/package.json","types":["devDependencies"]},{"file":"/packages/app-website/package.json","types":["devDependencies"]},{"file":"/packages/app-websockets/package.json","types":["devDependencies"]},{"file":"/packages/aws-sdk/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["devDependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/data-migration/package.json","types":["devDependencies"]},{"file":"/packages/db/package.json","types":["devDependencies"]},{"file":"/packages/db-dynamodb/package.json","types":["devDependencies"]},{"file":"/packages/error/package.json","types":["devDependencies"]},{"file":"/packages/feature-flags/package.json","types":["devDependencies"]},{"file":"/packages/form/package.json","types":["devDependencies"]},{"file":"/packages/handler/package.json","types":["devDependencies"]},{"file":"/packages/handler-aws/package.json","types":["devDependencies"]},{"file":"/packages/handler-client/package.json","types":["devDependencies"]},{"file":"/packages/handler-db/package.json","types":["devDependencies"]},{"file":"/packages/handler-graphql/package.json","types":["devDependencies"]},{"file":"/packages/i18n/package.json","types":["devDependencies"]},{"file":"/packages/i18n-react/package.json","types":["devDependencies"]},{"file":"/packages/logger/package.json","types":["devDependencies"]},{"file":"/packages/plugins/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/pubsub/package.json","types":["devDependencies"]},{"file":"/packages/pulumi/package.json","types":["devDependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["devDependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["devDependencies"]},{"file":"/packages/react-rich-text-renderer/package.json","types":["devDependencies"]},{"file":"/packages/react-router/package.json","types":["devDependencies"]},{"file":"/packages/tasks/package.json","types":["devDependencies"]},{"file":"/packages/theme/package.json","types":["devDependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]},{"file":"/packages/ui-composer/package.json","types":["devDependencies"]},{"file":"/packages/utils/package.json","types":["devDependencies"]},{"file":"/packages/validation/package.json","types":["devDependencies"]},{"file":"/packages/wcp/package.json","types":["devDependencies"]}]}]},{"name":"apollo-graphql","versions":[{"version":"0.9.5","files":[{"file":"/packages/api-admin-settings/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["devDependencies"]}]}]},{"name":"jest-dynalite","versions":[{"version":"3.6.1","files":[{"file":"/packages/api-admin-settings/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-users-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-apw-scheduler-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-authentication/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-log/package.json","types":["devDependencies"]},{"file":"/packages/api-mailer/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-security-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-sync-system/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-wcp/package.json","types":["devDependencies"]},{"file":"/packages/data-migration/package.json","types":["devDependencies"]},{"file":"/packages/db-dynamodb/package.json","types":["devDependencies"]},{"file":"/packages/migrations/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["devDependencies"]}]}]},{"name":"dataloader","versions":[{"version":"2.2.2","files":[{"file":"/packages/api-admin-users/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-ddb/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-so-ddb/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["dependencies"]},{"file":"/packages/api-tenancy/package.json","types":["dependencies"]}]}]},{"name":"md5","versions":[{"version":"2.3.0","files":[{"file":"/packages/api-admin-users/package.json","types":["dependencies"]},{"file":"/packages/api-security-cognito/package.json","types":["devDependencies"]}]}]},{"name":"zod","versions":[{"version":"3.23.8","files":[{"file":"/packages/api-admin-users/package.json","types":["dependencies"]},{"file":"/packages/api-apw/package.json","types":["dependencies"]},{"file":"/packages/api-file-manager/package.json","types":["dependencies"]},{"file":"/packages/api-form-builder/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-tasks/package.json","types":["dependencies"]},{"file":"/packages/api-log/package.json","types":["dependencies"]},{"file":"/packages/api-mailer/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-security/package.json","types":["dependencies"]},{"file":"/packages/api-sync-system/package.json","types":["dependencies"]},{"file":"/packages/api-websockets/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/ioc/package.json","types":["devDependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["dependencies"]},{"file":"/packages/tasks/package.json","types":["dependencies"]},{"file":"/packages/utils/package.json","types":["peerDependencies"]}]}]},{"name":"@types/jsonwebtoken","versions":[{"version":"9.0.2","files":[{"file":"/packages/api-admin-users/package.json","types":["devDependencies"]},{"file":"/packages/api-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/api-security/package.json","types":["devDependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["devDependencies"]},{"file":"/packages/api-security-cognito/package.json","types":["devDependencies"]}]}]},{"name":"@types/md5","versions":[{"version":"2.3.2","files":[{"file":"/packages/api-admin-users/package.json","types":["devDependencies"]}]}]},{"name":"dayjs","versions":[{"version":"1.11.13","files":[{"file":"/packages/api-apw/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]}]}]},{"name":"jsonwebtoken","versions":[{"version":"9.0.1","files":[{"file":"/packages/api-cognito-authenticator/package.json","types":["dependencies"]},{"file":"/packages/api-security/package.json","types":["dependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["dependencies"]},{"file":"/packages/api-security-okta/package.json","types":["dependencies"]}]}]},{"name":"jwk-to-pem","versions":[{"version":"2.0.1","files":[{"file":"/packages/api-cognito-authenticator/package.json","types":["dependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["dependencies"]},{"file":"/packages/api-security-okta/package.json","types":["dependencies"]}]}]},{"name":"@types/jwk-to-pem","versions":[{"version":"2.0.1","files":[{"file":"/packages/api-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["devDependencies"]}]}]},{"name":"@types/node-fetch","versions":[{"version":"2.6.1","files":[{"file":"/packages/api-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-s3/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["devDependencies"]},{"file":"/packages/api-security-okta/package.json","types":["devDependencies"]}]}]},{"name":"p-retry","versions":[{"version":"4.6.2","files":[{"file":"/packages/api-dynamodb-to-elasticsearch/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/utils/package.json","types":["dependencies"]}]}]},{"name":"@elastic/elasticsearch","versions":[{"version":"7.12.0","files":[{"file":"/packages/api-elasticsearch/package.json","types":["dependencies"]},{"file":"/packages/api-form-builder-so-ddb-es/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/data-migration/package.json","types":["dependencies"]},{"file":"/packages/migrations/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["devDependencies"]}]}]},{"name":"elastic-ts","versions":[{"version":"0.12.0","files":[{"file":"/packages/api-elasticsearch/package.json","types":["dependencies"]},{"file":"/packages/api-form-builder-so-ddb-es/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["dependencies"]},{"file":"/packages/migrations/package.json","types":["devDependencies"]}]}]},{"name":"cache-control-parser","versions":[{"version":"2.0.6","files":[{"file":"/packages/api-file-manager/package.json","types":["dependencies"]}]}]},{"name":"object-hash","versions":[{"version":"3.0.0","files":[{"file":"/packages/api-file-manager/package.json","types":["dependencies"]},{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]}]}]},{"name":"ttypescript","versions":[{"version":"1.5.15","files":[{"file":"/packages/api-file-manager-aco/package.json","types":["devDependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["devDependencies"]}]}]},{"name":"jsonpack","versions":[{"version":"1.1.5","files":[{"file":"/packages/api-file-manager-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/utils/package.json","types":["dependencies"]}]}]},{"name":"form-data","versions":[{"version":"4.0.0","files":[{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["dependencies"]}]}]},{"name":"mime","versions":[{"version":"3.0.0","files":[{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["devDependencies"]}]}]},{"name":"p-map","versions":[{"version":"4.0.0","files":[{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-workspaces/package.json","types":["dependencies"]}]}]},{"name":"p-reduce","versions":[{"version":"2.1.0","files":[{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]}]}]},{"name":"sanitize-filename","versions":[{"version":"1.6.3","files":[{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]}]}]},{"name":"sharp","versions":[{"version":"0.32.6","files":[{"file":"/packages/api-file-manager-s3/package.json","types":["dependencies"]}]}]},{"name":"date-fns","versions":[{"version":"2.22.1","files":[{"file":"/packages/api-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["dependencies"]},{"file":"/packages/db-dynamodb/package.json","types":["dependencies"]}]}]},{"name":"json2csv","versions":[{"version":"4.5.4","files":[{"file":"/packages/api-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]}]}]},{"name":"slugify","versions":[{"version":"1.6.6","files":[{"file":"/packages/api-form-builder/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"@types/json2csv","versions":[{"version":"4.5.1","files":[{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-form-builder/package.json","types":["devDependencies"]}]}]},{"name":"csvtojson","versions":[{"version":"2.0.10","files":[{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb-es/package.json","types":["devDependencies"]}]}]},{"name":"@graphql-tools/merge","versions":[{"version":"9.0.24","files":[{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/handler-graphql/package.json","types":["dependencies"]}]}]},{"name":"@graphql-tools/schema","versions":[{"version":"10.0.23","files":[{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/handler-graphql/package.json","types":["dependencies"]}]}]},{"name":"dot-prop","versions":[{"version":"6.0.1","files":[{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/api-headless-cms-ddb/package.json","types":["dependencies"]},{"file":"/packages/db-dynamodb/package.json","types":["dependencies"]}]}]},{"name":"graphql-tag","versions":[{"version":"2.12.6","files":[{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager-s3/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/handler-graphql/package.json","types":["dependencies"]}]}]},{"name":"jsdom","versions":[{"version":"25.0.1","files":[{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/lexical-converter/package.json","types":["devDependencies"]}]}]},{"name":"pluralize","versions":[{"version":"8.0.0","files":[{"file":"/packages/api-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]}]}]},{"name":"@types/babel__code-frame","versions":[{"version":"7.0.6","files":[{"file":"/packages/api-headless-cms/package.json","types":["devDependencies"]}]}]},{"name":"@types/jsonpack","versions":[{"version":"1.1.6","files":[{"file":"/packages/api-headless-cms-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["devDependencies"]}]}]},{"name":"@faker-js/faker","versions":[{"version":"9.3.0","files":[{"file":"/packages/api-headless-cms-es-tasks/package.json","types":["devDependencies"]},{"file":"/packages/api-sync-system/package.json","types":["devDependencies"]}]}]},{"name":"@smithy/node-http-handler","versions":[{"version":"2.1.6","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]}]}]},{"name":"archiver","versions":[{"version":"7.0.1","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]}]}]},{"name":"bytes","versions":[{"version":"3.1.2","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]}]}]},{"name":"uniqid","versions":[{"version":"5.4.0","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/plugins/package.json","types":["dependencies"]},{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"unzipper","versions":[{"version":"0.12.3","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["dependencies"]}]}]},{"name":"@types/adm-zip","versions":[{"version":"0.5.5","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["devDependencies"]}]}]},{"name":"@types/unzipper","versions":[{"version":"0.10.10","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["devDependencies"]}]}]},{"name":"adm-zip","versions":[{"version":"0.5.14","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["devDependencies"]}]}]},{"name":"aws-sdk-client-mock","versions":[{"version":"4.1.0","files":[{"file":"/packages/api-headless-cms-import-export/package.json","types":["devDependencies"]}]}]},{"name":"accept-language-parser","versions":[{"version":"1.5.0","files":[{"file":"/packages/api-i18n/package.json","types":["dependencies"]}]}]},{"name":"i18n-locales","versions":[{"version":"0.0.5","files":[{"file":"/packages/api-i18n/package.json","types":["dependencies"]}]}]},{"name":"@types/accept-language-parser","versions":[{"version":"1.5.3","files":[{"file":"/packages/api-i18n/package.json","types":["devDependencies"]}]}]},{"name":"crypto-js","versions":[{"version":"4.2.0","files":[{"file":"/packages/api-mailer/package.json","types":["dependencies"]}]}]},{"name":"nodemailer","versions":[{"version":"6.9.16","files":[{"file":"/packages/api-mailer/package.json","types":["dependencies"]}]}]},{"name":"@types/crypto-js","versions":[{"version":"4.2.2","files":[{"file":"/packages/api-mailer/package.json","types":["devDependencies"]}]}]},{"name":"@types/nodemailer","versions":[{"version":"6.4.17","files":[{"file":"/packages/api-mailer/package.json","types":["devDependencies"]}]}]},{"name":"extract-zip","versions":[{"version":"1.6.7","files":[{"file":"/packages/api-page-builder/package.json","types":["dependencies"]}]}]},{"name":"stream","versions":[{"version":"0.0.3","files":[{"file":"/packages/api-page-builder/package.json","types":["dependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]}]}]},{"name":"@types/extract-zip","versions":[{"version":"1.6.2","files":[{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/rimraf","versions":[{"version":"3.0.2","files":[{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"dot-prop-immutable","versions":[{"version":"2.1.1","files":[{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"yauzl","versions":[{"version":"2.10.0","files":[{"file":"/packages/api-page-builder-import-export/package.json","types":["dependencies"]}]}]},{"name":"@types/archiver","versions":[{"version":"5.3.1","files":[{"file":"/packages/api-page-builder-import-export/package.json","types":["devDependencies"]}]}]},{"name":"@types/yauzl","versions":[{"version":"2.9.2","files":[{"file":"/packages/api-page-builder-import-export/package.json","types":["devDependencies"]}]}]},{"name":"@sparticuz/chromium","versions":[{"version":"131.0.1","files":[{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]}]}]},{"name":"posthtml","versions":[{"version":"0.15.0","files":[{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]}]}]},{"name":"posthtml-noopener","versions":[{"version":"1.0.5","files":[{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]}]}]},{"name":"posthtml-plugin-link-preload","versions":[{"version":"1.0.0","files":[{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]}]}]},{"name":"puppeteer-core","versions":[{"version":"23.11.1","files":[{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]}]}]},{"name":"srcset","versions":[{"version":"4.0.0","files":[{"file":"/packages/api-prerendering-service/package.json","types":["dependencies"]},{"file":"/packages/aws-helpers/package.json","types":["dependencies"]}]}]},{"name":"@types/object-hash","versions":[{"version":"2.2.1","files":[{"file":"/packages/api-prerendering-service/package.json","types":["devDependencies"]}]}]},{"name":"deep-equal","versions":[{"version":"2.2.3","files":[{"file":"/packages/api-security/package.json","types":["dependencies"]},{"file":"/packages/api-security-cognito/package.json","types":["dependencies"]},{"file":"/packages/tasks/package.json","types":["dependencies"]}]}]},{"name":"@types/lodash","versions":[{"version":"4.17.13","files":[{"file":"/packages/api-sync-system/package.json","types":["devDependencies"]},{"file":"/packages/app/package.json","types":["devDependencies"]},{"file":"/packages/app-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/form/package.json","types":["devDependencies"]},{"file":"/packages/i18n/package.json","types":["devDependencies"]},{"file":"/packages/pulumi/package.json","types":["devDependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["devDependencies"]},{"file":"/packages/validation/package.json","types":["devDependencies"]}]}]},{"name":"@apollo/react-hooks","versions":[{"version":"3.1.5","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/extensions/theme/package.json","types":["dependencies"]},{"file":"/extensions/theme/package.json","types":["dependencies"]}]}]},{"name":"@emotion/styled","versions":[{"version":"11.10.6","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/extensions/theme/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-actions/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-pb-element/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]},{"file":"/extensions/theme/package.json","types":["dependencies"]}]}]},{"name":"apollo-cache","versions":[{"version":"1.3.5","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]}]}]},{"name":"apollo-cache-inmemory","versions":[{"version":"1.6.6","files":[{"file":"/packages/app/package.json","types":["dependencies"]}]}]},{"name":"apollo-client","versions":[{"version":"2.6.10","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["devDependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["devDependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/packages/react-router/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"apollo-link","versions":[{"version":"1.2.14","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-aco/package.json","types":["devDependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["devDependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"apollo-link-context","versions":[{"version":"1.0.20","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]}]}]},{"name":"apollo-link-error","versions":[{"version":"1.1.13","files":[{"file":"/packages/app/package.json","types":["dependencies"]}]}]},{"name":"apollo-link-http-common","versions":[{"version":"0.2.16","files":[{"file":"/packages/app/package.json","types":["dependencies"]}]}]},{"name":"apollo-utilities","versions":[{"version":"1.3.4","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/app-wcp/package.json","types":["dependencies"]}]}]},{"name":"boolean","versions":[{"version":"3.2.0","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/handler-graphql/package.json","types":["dependencies"]}]}]},{"name":"invariant","versions":[{"version":"2.2.4","files":[{"file":"/packages/app/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]}]}]},{"name":"ts-invariant","versions":[{"version":"0.10.3","files":[{"file":"/packages/app/package.json","types":["dependencies"]}]}]},{"name":"warning","versions":[{"version":"4.0.2","files":[{"file":"/packages/app/package.json","types":["dependencies"]}]}]},{"name":"@types/warning","versions":[{"version":"3.0.0","files":[{"file":"/packages/app/package.json","types":["devDependencies"]}]}]},{"name":"@material-design-icons/svg","versions":[{"version":"0.14.13","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-record-locking/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-pb-element/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@material-symbols/svg-400","versions":[{"version":"0.4.1","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]}]}]},{"name":"@minoru/react-dnd-treeview","versions":[{"version":"3.2.1","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]}]}]},{"name":"mobx","versions":[{"version":"6.9.0","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/app-utils/package.json","types":["dependencies"]},{"file":"/packages/form/package.json","types":["devDependencies"]}]}]},{"name":"mobx-react-lite","versions":[{"version":"3.4.3","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["dependencies"]},{"file":"/packages/form/package.json","types":["devDependencies"]}]}]},{"name":"pako","versions":[{"version":"2.1.0","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"react-dnd","versions":[{"version":"16.0.1","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"react-hotkeyz","versions":[{"version":"1.0.4","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]}]}]},{"name":"store","versions":[{"version":"2.0.12","files":[{"file":"/packages/app-aco/package.json","types":["dependencies"]},{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-tenancy/package.json","types":["dependencies"]}]}]},{"name":"@apollo/react-components","versions":[{"version":"3.1.5","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"@editorjs/editorjs","versions":[{"version":"2.26.5","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["peerDependencies"]},{"file":"/packages/react-rich-text-renderer/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@iconify/json","versions":[{"version":"2.2.142","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]}]},{"name":"@monaco-editor/react","versions":[{"version":"4.7.0","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]}]},{"name":"@svgr/webpack","versions":[{"version":"6.1.1","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@types/mime","versions":[{"version":"2.0.3","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]}]},{"name":"classnames","versions":[{"version":"2.5.1","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/react-rich-text-renderer/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"downshift","versions":[{"version":"3.1.2","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]},{"version":"2.1.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"emotion","versions":[{"version":"10.0.27","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["dependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-i18n-content/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-actions/package.json","types":["dependencies"]},{"file":"/packages/lexical-theme/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"graphlib","versions":[{"version":"2.1.8","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-workspaces/package.json","types":["dependencies"]}]}]},{"name":"is-hotkey","versions":[{"version":"0.2.0","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"prop-types","versions":[{"version":"15.8.1","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-i18n/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["dependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]}]}]},{"name":"react-draggable","versions":[{"version":"4.4.6","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]}]},{"name":"react-resizable","versions":[{"version":"3.0.5","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]}]},{"name":"react-resizable-panels","versions":[{"version":"2.0.19","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]}]},{"name":"react-transition-group","versions":[{"version":"4.4.5","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"react-virtualized","versions":[{"version":"9.22.5","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"reset-css","versions":[{"version":"5.0.1","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]}]}]},{"name":"unicode-emoji-json","versions":[{"version":"0.4.0","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]}]},{"name":"@emotion/babel-plugin","versions":[{"version":"11.11.0","files":[{"file":"/packages/app-admin/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["devDependencies"]},{"file":"/packages/app-apw/package.json","types":["devDependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["devDependencies"]},{"file":"/packages/app-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n-content/package.json","types":["devDependencies"]},{"file":"/packages/app-mailer/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-security/package.json","types":["devDependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["devDependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-theme/package.json","types":["devDependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["devDependencies"]},{"file":"/packages/theme/package.json","types":["devDependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"@types/bytes","versions":[{"version":"3.1.4","files":[{"file":"/packages/app-admin/package.json","types":["devDependencies"]}]}]},{"name":"@types/graphlib","versions":[{"version":"2.1.12","files":[{"file":"/packages/app-admin/package.json","types":["devDependencies"]}]}]},{"name":"@types/is-hotkey","versions":[{"version":"0.1.10","files":[{"file":"/packages/app-admin/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/react-resizable","versions":[{"version":"3.0.8","files":[{"file":"/packages/app-admin/package.json","types":["devDependencies"]}]}]},{"name":"@types/store","versions":[{"version":"2.0.2","files":[{"file":"/packages/app-admin/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"monaco-editor","versions":[{"version":"0.52.2","files":[{"file":"/packages/app-admin/package.json","types":["devDependencies"]}]}]},{"name":"@auth0/auth0-react","versions":[{"version":"2.2.4","files":[{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]}]}]},{"name":"react-helmet","versions":[{"version":"6.1.0","files":[{"file":"/packages/app-admin-auth0/package.json","types":["dependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-mailer/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]}]}]},{"name":"@aws-amplify/auth","versions":[{"version":"5.6.15","files":[{"file":"/packages/app-admin-cognito/package.json","types":["dependencies"]},{"file":"/packages/app-cognito-authenticator/package.json","types":["dependencies"]}]}]},{"name":"@okta/okta-auth-js","versions":[{"version":"5.3.1","files":[{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]}]}]},{"name":"@okta/okta-react","versions":[{"version":"6.1.0","files":[{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]}]}]},{"name":"@okta/okta-signin-widget","versions":[{"version":"5.9.4","files":[{"file":"/packages/app-admin-okta/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/base","versions":[{"version":"14.3.5","files":[{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/provider","versions":[{"version":"14.3.5","files":[{"file":"/packages/app-admin-rmwc/package.json","types":["dependencies"]}]}]},{"name":"@types/react-helmet","versions":[{"version":"6.1.11","files":[{"file":"/packages/app-admin-rmwc/package.json","types":["devDependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["devDependencies"]},{"file":"/apps/website/package.json","types":["devDependencies"]}]}]},{"name":"babel-plugin-named-asset-import","versions":[{"version":"1.0.0-next.3e165448","files":[{"file":"/packages/app-admin-rmwc/package.json","types":["devDependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["devDependencies"]}]}]},{"name":"@emotion/is-prop-valid","versions":[{"version":"1.1.1","files":[{"file":"/packages/app-apw/package.json","types":["dependencies"]}]}]},{"name":"react-spinner-material","versions":[{"version":"1.1.4","files":[{"file":"/packages/app-apw/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@fortawesome/fontawesome-svg-core","versions":[{"version":"1.3.0","files":[{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"@fortawesome/react-fontawesome","versions":[{"version":"0.1.17","files":[{"file":"/packages/app-dynamic-pages/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"@apollo/react-common","versions":[{"version":"3.1.4","files":[{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"dataurl-to-blob","versions":[{"version":"0.0.1","files":[{"file":"/packages/app-file-manager/package.json","types":["dependencies"]}]}]},{"name":"react-butterfiles","versions":[{"version":"1.3.3","files":[{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"react-custom-scrollbars","versions":[{"version":"4.2.1","files":[{"file":"/packages/app-file-manager/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"react-lazy-load","versions":[{"version":"3.1.14","files":[{"file":"/packages/app-file-manager/package.json","types":["dependencies"]}]}]},{"name":"@dnd-kit/core","versions":[{"version":"6.1.0","files":[{"file":"/packages/app-form-builder/package.json","types":["dependencies"]}]}]},{"name":"@dnd-kit/sortable","versions":[{"version":"8.0.0","files":[{"file":"/packages/app-form-builder/package.json","types":["dependencies"]}]}]},{"name":"@dnd-kit/utilities","versions":[{"version":"3.2.2","files":[{"file":"/packages/app-form-builder/package.json","types":["dependencies"]}]}]},{"name":"dnd-core","versions":[{"version":"16.0.1","files":[{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"history","versions":[{"version":"5.3.0","files":[{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/react-router/package.json","types":["dependencies"]}]}]},{"name":"react-dnd-html5-backend","versions":[{"version":"16.0.1","files":[{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"react-google-recaptcha","versions":[{"version":"1.1.0","files":[{"file":"/packages/app-form-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["peerDependencies"]}]}]},{"name":"@types/gtag.js","versions":[{"version":"0.0.20","files":[{"file":"/packages/app-form-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/react-google-recaptcha","versions":[{"version":"1.1.2","files":[{"file":"/packages/app-form-builder/package.json","types":["devDependencies"]}]}]},{"name":"load-script","versions":[{"version":"1.0.0","files":[{"file":"/packages/app-graphql-playground/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@fortawesome/fontawesome-common-types","versions":[{"version":"0.3.0","files":[{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"@fortawesome/free-brands-svg-icons","versions":[{"version":"6.0.0","files":[{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"@fortawesome/free-regular-svg-icons","versions":[{"version":"6.0.0","files":[{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"@fortawesome/free-solid-svg-icons","versions":[{"version":"6.0.0","files":[{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"raw.macro","versions":[{"version":"0.4.2","files":[{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]}]}]},{"name":"use-deep-compare-effect","versions":[{"version":"1.8.1","files":[{"file":"/packages/app-headless-cms/package.json","types":["dependencies"]}]}]},{"name":"@types/medium-editor","versions":[{"version":"5.0.3","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"aos","versions":[{"version":"2.3.4","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["peerDependencies"]}]}]},{"name":"dnd-kit-sortable-tree","versions":[{"version":"0.1.73","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"medium-editor","versions":[{"version":"5.23.3","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"platform","versions":[{"version":"1.3.5","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"react-color","versions":[{"version":"2.19.3","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/lexical-editor-actions/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"react-images","versions":[{"version":"0.5.19","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["peerDependencies"]}]}]},{"name":"react-in-viewport","versions":[{"version":"1.0.0-alpha.30","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"react-sortable","versions":[{"version":"2.0.0","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"recoil","versions":[{"version":"0.7.7","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]}]}]},{"name":"swiper","versions":[{"version":"9.3.2","files":[{"file":"/packages/app-page-builder/package.json","types":["dependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["peerDependencies"]}]}]},{"name":"@types/aos","versions":[{"version":"3.0.4","files":[{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/pako","versions":[{"version":"2.0.3","files":[{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/platform","versions":[{"version":"1.3.4","files":[{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/react-images","versions":[{"version":"0.5.3","files":[{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/react-virtualized","versions":[{"version":"9.21.16","files":[{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"@types/resize-observer-browser","versions":[{"version":"0.1.4","files":[{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]}]}]},{"name":"facepaint","versions":[{"version":"1.2.1","files":[{"file":"/packages/app-page-builder-elements/package.json","types":["dependencies"]}]}]},{"name":"@types/facepaint","versions":[{"version":"1.2.2","files":[{"file":"/packages/app-page-builder-elements/package.json","types":["devDependencies"]}]}]},{"name":"react-columned","versions":[{"version":"1.1.3","files":[{"file":"/packages/app-page-builder-elements/package.json","types":["peerDependencies"]},{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"crypto-hash","versions":[{"version":"3.0.0","files":[{"file":"/packages/app-record-locking/package.json","types":["dependencies"]}]}]},{"name":"apollo-link-batch-http","versions":[{"version":"1.2.14","files":[{"file":"/packages/app-serverless-cms/package.json","types":["dependencies"]},{"file":"/packages/app-website/package.json","types":["dependencies"]}]}]},{"name":"@emotion/cache","versions":[{"version":"11.10.5","files":[{"file":"/packages/app-website/package.json","types":["dependencies"]}]}]},{"name":"lz-string","versions":[{"version":"1.5.0","files":[{"file":"/packages/app-website/package.json","types":["dependencies"]}]}]},{"name":"@types/aws-lambda","versions":[{"version":"8.10.145","files":[{"file":"/packages/aws-helpers/package.json","types":["dependencies"]},{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"cheerio","versions":[{"version":"1.0.0-rc.10","files":[{"file":"/packages/aws-helpers/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-apigatewaymanagementapi","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-cloudfront","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-cloudwatch-events","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-cloudwatch-logs","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-cognito-identity-provider","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-dynamodb","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-dynamodb-streams","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-eventbridge","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-iam","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-iot","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-lambda","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-s3","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-sfn","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-sqs","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/client-sts","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/credential-providers","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/lib-dynamodb","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/lib-storage","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/s3-presigned-post","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/s3-request-presigner","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"@aws-sdk/util-dynamodb","versions":[{"version":"3.821.0","files":[{"file":"/packages/aws-sdk/package.json","types":["dependencies"]}]}]},{"name":"camelcase","versions":[{"version":"6.3.0","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"ci-info","versions":[{"version":"4.1.0","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/telemetry/package.json","types":["dependencies"]}]}]},{"name":"dotenv","versions":[{"version":"8.2.0","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["devDependencies"]}]}]},{"name":"fast-glob","versions":[{"version":"3.2.7","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies","devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]}]}]},{"name":"find-up","versions":[{"version":"5.0.0","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/pulumi/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]},{"file":"/scripts/prepublishOnly/package.json","types":["dependencies"]}]}]},{"name":"graphql-request","versions":[{"version":"3.7.0","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/cypress-tests/package.json","types":["devDependencies"]},{"file":"/apps/api/graphql/package.json","types":["devDependencies"]}]}]},{"name":"ncp","versions":[{"version":"2.0.0","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"open","versions":[{"version":"8.4.2","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]}]}]},{"name":"pirates","versions":[{"version":"4.0.6","files":[{"file":"/packages/cli/package.json","types":["dependencies"]}]}]},{"name":"ts-morph","versions":[{"version":"11.0.0","files":[{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]}]}]},{"name":"exit-hook","versions":[{"version":"4.0.0","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]}]}]},{"name":"humanize-duration","versions":[{"version":"3.32.1","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]}]}]},{"name":"log-update","versions":[{"version":"4.0.0","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]}]}]},{"name":"mqtt","versions":[{"version":"5.10.3","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]}]}]},{"name":"node-notifier","versions":[{"version":"10.0.1","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]}]}]},{"name":"ora","versions":[{"version":"4.1.1","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]}]}]},{"name":"replace-in-path","versions":[{"version":"1.1.0","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["dependencies"]}]}]},{"name":"serialize-error","versions":[{"version":"8.0.0","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["dependencies"]}]}]},{"name":"@types/humanize-duration","versions":[{"version":"3.27.4","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["devDependencies"]}]}]},{"name":"@types/listr","versions":[{"version":"0.14.9","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["devDependencies"]}]}]},{"name":"@types/node-notifier","versions":[{"version":"8.0.5","files":[{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["devDependencies"]}]}]},{"name":"case","versions":[{"version":"1.6.3","files":[{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["dependencies"]}]}]},{"name":"validate-npm-package-name","versions":[{"version":"3.0.0","files":[{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["dependencies"]},{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]}]}]},{"name":"@types/inquirer","versions":[{"version":"8.2.10","files":[{"file":"/packages/cli-plugin-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["devDependencies"]}]}]},{"name":"terminal-link","versions":[{"version":"2.1.1","files":[{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["dependencies"]}]}]},{"name":"@types/ncp","versions":[{"version":"2.0.4","files":[{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["devDependencies"]}]}]},{"name":"@types/pluralize","versions":[{"version":"0.0.29","files":[{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["devDependencies"]}]}]},{"name":"js-base64","versions":[{"version":"3.7.7","files":[{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["dependencies"]}]}]},{"name":"octokit","versions":[{"version":"3.1.2","files":[{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["dependencies"]}]}]},{"name":"@types/validate-npm-package-name","versions":[{"version":"3.0.3","files":[{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["devDependencies"]}]}]},{"name":"indent-string","versions":[{"version":"5.0.0","files":[{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["dependencies"]}]}]},{"name":"archy","versions":[{"version":"1.0.0","files":[{"file":"/packages/cli-plugin-workspaces/package.json","types":["dependencies"]}]}]},{"name":"color","versions":[{"version":"4.2.3","files":[{"file":"/packages/cli-plugin-workspaces/package.json","types":["dependencies"]}]}]},{"name":"multimatch","versions":[{"version":"5.0.0","files":[{"file":"/packages/cli-plugin-workspaces/package.json","types":["dependencies"]}]}]},{"name":"js-yaml","versions":[{"version":"3.14.1","files":[{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]}]}]},{"name":"os","versions":[{"version":"0.1.1","files":[{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]}]}]},{"name":"uuid","versions":[{"version":"9.0.1","files":[{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]},{"file":"/packages/global-config/package.json","types":["dependencies"]}]}]},{"name":"yesno","versions":[{"version":"0.4.0","files":[{"file":"/packages/create-webiny-project/package.json","types":["dependencies"]}]}]},{"name":"@editorjs/delimiter","versions":[{"version":"1.4.2","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]}]}]},{"name":"@editorjs/list","versions":[{"version":"1.10.0","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]}]}]},{"name":"@editorjs/quote","versions":[{"version":"2.7.2","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]}]}]},{"name":"@editorjs/underline","versions":[{"version":"1.2.1","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]}]}]},{"name":"core-js","versions":[{"version":"3.39.0","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"cross-fetch","versions":[{"version":"3.1.5","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"regenerator-runtime","versions":[{"version":"0.13.11","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"theme","versions":[{"version":"1.0.0","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/packages/cwp-template-aws/template/common/apps/website/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/website/package.json","types":["dependencies"]}]}]},{"name":"tslib","versions":[{"version":"2.8.1","files":[{"file":"/packages/cwp-template-aws/template/common/apps/admin/package.json","types":["dependencies"]},{"file":"/apps/admin/package.json","types":["dependencies"]}]}]},{"name":"react-hamburger-menu","versions":[{"version":"1.2.1","files":[{"file":"/packages/cwp-template-aws/template/common/extensions/theme/package.json","types":["dependencies"]},{"file":"/extensions/theme/package.json","types":["dependencies"]}]}]},{"name":"@types/react-hamburger-menu","versions":[{"version":"0.0.4","files":[{"file":"/packages/cwp-template-aws/template/common/extensions/theme/package.json","types":["devDependencies"]},{"file":"/extensions/theme/package.json","types":["devDependencies"]}]}]},{"name":"merge","versions":[{"version":"2.1.1","files":[{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]}]}]},{"name":"center-align","versions":[{"version":"1.0.1","files":[{"file":"/packages/data-migration/package.json","types":["dependencies"]}]}]},{"name":"pino-pretty","versions":[{"version":"9.4.0","files":[{"file":"/packages/data-migration/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["devDependencies"]}]}]},{"name":"@types/center-align","versions":[{"version":"1.0.0","files":[{"file":"/packages/data-migration/package.json","types":["devDependencies"]}]}]},{"name":"@types/semver","versions":[{"version":"7.3.4","files":[{"file":"/packages/data-migration/package.json","types":["devDependencies"]}]}]},{"name":"jest-mock-console","versions":[{"version":"2.0.0","files":[{"file":"/packages/data-migration/package.json","types":["devDependencies"]},{"file":"/packages/handler-graphql/package.json","types":["devDependencies"]}]}]},{"name":"dynamodb-toolbox","versions":[{"version":"0.9.2","files":[{"file":"/packages/db-dynamodb/package.json","types":["dependencies"]}]}]},{"name":"fuse.js","versions":[{"version":"7.0.0","files":[{"file":"/packages/db-dynamodb/package.json","types":["dependencies"]}]}]},{"name":"@types/is-number","versions":[{"version":"7.0.5","files":[{"file":"/packages/db-dynamodb/package.json","types":["devDependencies"]}]}]},{"name":"reflect-metadata","versions":[{"version":"0.2.2","files":[{"file":"/packages/di-container/package.json","types":["dependencies"]},{"file":"/packages/ioc/package.json","types":["dependencies"]}]}]},{"name":"@types/uniqid","versions":[{"version":"5.3.2","files":[{"file":"/packages/feature-flags/package.json","types":["devDependencies"]},{"file":"/packages/plugins/package.json","types":["devDependencies"]}]}]},{"name":"@testing-library/react","versions":[{"version":"15.0.7","files":[{"file":"/packages/form/package.json","types":["devDependencies"]},{"file":"/packages/react-composition/package.json","types":["devDependencies"]},{"file":"/packages/react-properties/package.json","types":["devDependencies"]},{"file":"/packages/react-rich-text-lexical-renderer/package.json","types":["devDependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"@testing-library/user-event","versions":[{"version":"14.5.2","files":[{"file":"/packages/form/package.json","types":["devDependencies"]}]}]},{"name":"@types/invariant","versions":[{"version":"2.2.35","files":[{"file":"/packages/form/package.json","types":["devDependencies"]}]}]},{"name":"@fastify/compress","versions":[{"version":"7.0.3","files":[{"file":"/packages/handler/package.json","types":["dependencies"]}]}]},{"name":"@fastify/cookie","versions":[{"version":"9.4.0","files":[{"file":"/packages/handler/package.json","types":["dependencies"]}]}]},{"name":"fastify","versions":[{"version":"4.29.1","files":[{"file":"/packages/handler/package.json","types":["dependencies"]},{"file":"/packages/handler-aws/package.json","types":["dependencies"]}]}]},{"name":"@fastify/aws-lambda","versions":[{"version":"4.1.0","files":[{"file":"/packages/handler-aws/package.json","types":["dependencies"]}]}]},{"name":"@graphql-tools/resolvers-composition","versions":[{"version":"7.0.18","files":[{"file":"/packages/handler-graphql/package.json","types":["dependencies"]}]}]},{"name":"@graphql-tools/utils","versions":[{"version":"10.8.6","files":[{"file":"/packages/handler-graphql/package.json","types":["dependencies"]}]}]},{"name":"graphql-scalars","versions":[{"version":"1.12.0","files":[{"file":"/packages/handler-graphql/package.json","types":["dependencies"]}]}]},{"name":"accounting","versions":[{"version":"0.4.1","files":[{"file":"/packages/i18n/package.json","types":["dependencies"]}]}]},{"name":"fecha","versions":[{"version":"2.3.3","files":[{"file":"/packages/i18n/package.json","types":["dependencies"]}]}]},{"name":"short-hash","versions":[{"version":"1.0.0","files":[{"file":"/packages/i18n/package.json","types":["dependencies"]}]}]},{"name":"@types/accounting","versions":[{"version":"0.4.2","files":[{"file":"/packages/i18n/package.json","types":["devDependencies"]}]}]},{"name":"inversify","versions":[{"version":"6.1.6","files":[{"file":"/packages/ioc/package.json","types":["dependencies"]}]}]},{"name":"@types/jsdom","versions":[{"version":"21.1.6","files":[{"file":"/packages/lexical-converter/package.json","types":["devDependencies"]}]}]},{"name":"@types/react-color","versions":[{"version":"2.17.11","files":[{"file":"/packages/lexical-editor-actions/package.json","types":["devDependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"@types/prismjs","versions":[{"version":"1.26.4","files":[{"file":"/packages/lexical-nodes/package.json","types":["dependencies"]}]}]},{"name":"react-style-object-to-css","versions":[{"version":"1.1.2","files":[{"file":"/packages/lexical-theme/package.json","types":["dependencies"]}]}]},{"name":"pino","versions":[{"version":"8.21.0","files":[{"file":"/packages/logger/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["devDependencies"]}]}]},{"name":"@pmmmwh/react-refresh-webpack-plugin","versions":[{"version":"0.5.15","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@rspack/core","versions":[{"version":"1.3.13","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@rspack/dev-server","versions":[{"version":"1.1.3","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@rspack/plugin-react-refresh","versions":[{"version":"1.4.3","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@swc/plugin-emotion","versions":[{"version":"9.0.4","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"@types/webpack-env","versions":[{"version":"1.18.5","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"assert-browserify","versions":[{"version":"2.0.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"buffer","versions":[{"version":"6.0.3","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"bufferutil","versions":[{"version":"4.0.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"case-sensitive-paths-webpack-plugin","versions":[{"version":"2.4.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"crypto-browserify","versions":[{"version":"3.12.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"css-loader","versions":[{"version":"6.10.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"css-minimizer-webpack-plugin","versions":[{"version":"7.0.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"eslint-config-react-app","versions":[{"version":"6.0.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"eslint-webpack-plugin","versions":[{"version":"4.2.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"file-loader","versions":[{"version":"6.2.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"fork-ts-checker-webpack-plugin","versions":[{"version":"9.0.2","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"html-webpack-plugin","versions":[{"version":"5.6.3","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"mini-css-extract-plugin","versions":[{"version":"2.4.5","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"null-loader","versions":[{"version":"4.0.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"os-browserify","versions":[{"version":"0.3.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"path-browserify","versions":[{"version":"1.0.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"postcss-flexbugs-fixes","versions":[{"version":"5.0.2","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"postcss-loader","versions":[{"version":"6.2.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"postcss-normalize","versions":[{"version":"10.0.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"postcss-preset-env","versions":[{"version":"9.4.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"process","versions":[{"version":"0.11.10","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"raw-loader","versions":[{"version":"4.0.2","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"react-dev-utils","versions":[{"version":"12.0.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"react-refresh","versions":[{"version":"0.11.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"read-json-sync","versions":[{"version":"2.0.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"resolve","versions":[{"version":"1.22.8","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"resolve-url-loader","versions":[{"version":"5.0.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"sass","versions":[{"version":"1.44.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"sass-loader","versions":[{"version":"12.3.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"scheduler","versions":[{"version":"0.19.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"source-map-loader","versions":[{"version":"1.1.3","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"source-map-support","versions":[{"version":"0.5.21","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"style-loader","versions":[{"version":"3.3.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"terser-webpack-plugin","versions":[{"version":"5.3.10","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"ts-checker-rspack-plugin","versions":[{"version":"1.0.3","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"ts-patch","versions":[{"version":"3.3.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"url","versions":[{"version":"0.11.4","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"url-loader","versions":[{"version":"4.1.1","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"utf-8-validate","versions":[{"version":"5.0.2","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"vm-browserify","versions":[{"version":"1.1.2","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"webpack","versions":[{"version":"5.97.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]}]}]},{"name":"webpack-dev-server","versions":[{"version":"4.15.2","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"webpack-manifest-plugin","versions":[{"version":"5.0.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"webpackbar","versions":[{"version":"7.0.0","files":[{"file":"/packages/project-utils/package.json","types":["dependencies"]}]}]},{"name":"listr2","versions":[{"version":"5.0.8","files":[{"file":"/packages/project-utils/package.json","types":["devDependencies"]},{"file":"/scripts/buildPackages/package.json","types":["dependencies"]}]}]},{"name":"@pulumi/pulumi","versions":[{"version":"3.147.0","files":[{"file":"/packages/pulumi/package.json","types":["dependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["dependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]}]}]},{"name":"@pulumi/aws","versions":[{"version":"6.67.0","files":[{"file":"/packages/pulumi-aws/package.json","types":["dependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["dependencies"]}]}]},{"name":"@pulumi/random","versions":[{"version":"4.17.0","files":[{"file":"/packages/pulumi-aws/package.json","types":["dependencies"]}]}]},{"name":"decompress","versions":[{"version":"4.2.1","files":[{"file":"/packages/pulumi-sdk/package.json","types":["dependencies"]}]}]},{"name":"identity-obj-proxy","versions":[{"version":"3.0.0","files":[{"file":"/packages/react-rich-text-lexical-renderer/package.json","types":["devDependencies"]}]}]},{"name":"sanitize-html","versions":[{"version":"2.12.1","files":[{"file":"/packages/react-rich-text-renderer/package.json","types":["dependencies"]}]}]},{"name":"@types/sanitize-html","versions":[{"version":"2.9.0","files":[{"file":"/packages/react-rich-text-renderer/package.json","types":["devDependencies"]}]}]},{"name":"react-router-dom","versions":[{"version":"6.3.0","files":[{"file":"/packages/react-router/package.json","types":["dependencies"]}]}]},{"name":"cli-table3","versions":[{"version":"0.6.5","files":[{"file":"/packages/system-requirements/package.json","types":["dependencies"]}]}]},{"name":"object-merge-advanced","versions":[{"version":"12.1.0","files":[{"file":"/packages/tasks/package.json","types":["dependencies"]}]}]},{"name":"object-sizeof","versions":[{"version":"2.6.4","files":[{"file":"/packages/tasks/package.json","types":["dependencies"]}]}]},{"name":"jsesc","versions":[{"version":"3.0.2","files":[{"file":"/packages/telemetry/package.json","types":["dependencies"]}]}]},{"name":"strip-ansi","versions":[{"version":"6.0.1","files":[{"file":"/packages/telemetry/package.json","types":["dependencies"]}]}]},{"name":"wts-client","versions":[{"version":"1.0.1","files":[{"file":"/packages/telemetry/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/button","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/checkbox","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/chip","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/data-table","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/dialog","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/drawer","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/elevation","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/fab","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/grid","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/icon-button","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/list","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/menu","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/radio","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/ripple","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/select","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/slider","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/snackbar","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/switch","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/tabs","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/textfield","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/top-app-bar","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/touch-target","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@rmwc/typography","versions":[{"version":"14.3.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@tanstack/react-table","versions":[{"version":"8.5.22","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"brace","versions":[{"version":"0.11.1","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"cropperjs","versions":[{"version":"1.4.3","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"keycode","versions":[{"version":"2.2.0","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"material-components-web","versions":[{"version":"14.0.0","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"nprogress","versions":[{"version":"0.2.0","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"nuka-carousel","versions":[{"version":"4.7.1","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"rc-tooltip","versions":[{"version":"5.3.1","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"react-ace","versions":[{"version":"6.1.4","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"react-loading-skeleton","versions":[{"version":"3.1.0","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"timeago-react","versions":[{"version":"3.0.6","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"@types/nprogress","versions":[{"version":"0.2.0","files":[{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"@types/react-custom-scrollbars","versions":[{"version":"4.0.10","files":[{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"@types/react-transition-group","versions":[{"version":"4.4.4","files":[{"file":"/packages/ui/package.json","types":["devDependencies"]}]}]},{"name":"p-wait-for","versions":[{"version":"4.1.0","files":[{"file":"/packages/ui-composer/package.json","types":["dependencies"]}]}]},{"name":"mdbid","versions":[{"version":"1.0.0","files":[{"file":"/packages/utils/package.json","types":["dependencies"]}]}]},{"name":"nanoid-dictionary","versions":[{"version":"4.3.0","files":[{"file":"/packages/utils/package.json","types":["dependencies"]}]}]},{"name":"isnumeric","versions":[{"version":"0.3.3","files":[{"file":"/packages/validation/package.json","types":["dependencies"]}]}]},{"name":"@4tw/cypress-drag-drop","versions":[{"version":"1.4.0","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"@testing-library/cypress","versions":[{"version":"10.0.0","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"amazon-cognito-identity-js","versions":[{"version":"4.5.3","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"cypress","versions":[{"version":"13.16.0","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"cypress-image-snapshot","versions":[{"version":"4.0.1","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"cypress-mailosaur","versions":[{"version":"2.7.0","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"cypress-wait-until","versions":[{"version":"1.7.1","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"del","versions":[{"version":"6.0.0","files":[{"file":"/cypress-tests/package.json","types":["devDependencies"]}]}]},{"name":"source-map-explorer","versions":[{"version":"2.5.3","files":[{"file":"/apps/website/package.json","types":["devDependencies"]}]}]},{"name":"@types/folder-hash","versions":[{"version":"4.0.4","files":[{"file":"/scripts/buildPackages/package.json","types":["devDependencies"]}]}]},{"name":"@types/yargs","versions":[{"version":"17.0.8","files":[{"file":"/scripts/buildPackages/package.json","types":["devDependencies"]}]}]}]} diff --git a/packages/handler/src/PreHandler/IPreHandler.ts b/packages/handler/src/PreHandler/IPreHandler.ts index 476100dfef4..10e1e85c5d4 100644 --- a/packages/handler/src/PreHandler/IPreHandler.ts +++ b/packages/handler/src/PreHandler/IPreHandler.ts @@ -1,4 +1,5 @@ import type { FastifyReply, FastifyRequest } from "fastify"; +import type { Context } from "~/types"; export enum Action { CONTINUE = "continue", @@ -6,5 +7,9 @@ export enum Action { } export interface IPreHandler { - execute(request: FastifyRequest, reply: FastifyReply): Promise | Action; + execute( + request: FastifyRequest, + reply: FastifyReply, + context: Context + ): Promise | Action; } diff --git a/packages/handler/src/PreHandler/IfNotOptionsRequest.ts b/packages/handler/src/PreHandler/IfNotOptionsRequest.ts index 4699ca1e3e3..227692dd3bd 100644 --- a/packages/handler/src/PreHandler/IfNotOptionsRequest.ts +++ b/packages/handler/src/PreHandler/IfNotOptionsRequest.ts @@ -1,5 +1,6 @@ import type { FastifyReply, FastifyRequest } from "fastify"; import { Action, IPreHandler } from "./IPreHandler"; +import type { Context } from "~/types"; export class IfNotOptionsRequest implements IPreHandler { private readonly handlers: IPreHandler[]; @@ -8,14 +9,14 @@ export class IfNotOptionsRequest implements IPreHandler { this.handlers = handlers; } - async execute(request: FastifyRequest, reply: FastifyReply): Promise { + async execute(request: FastifyRequest, reply: FastifyReply, context: Context): Promise { const isOptionsRequest = request.method === "OPTIONS"; if (isOptionsRequest) { return Action.CONTINUE; } for (const handler of this.handlers) { - const action = await handler.execute(request, reply); + const action = await handler.execute(request, reply, context); if (action === Action.DONE) { return Action.DONE; } diff --git a/packages/handler/src/PreHandler/IfOptionsRequest.ts b/packages/handler/src/PreHandler/IfOptionsRequest.ts index af939777b41..4b748f7d07d 100644 --- a/packages/handler/src/PreHandler/IfOptionsRequest.ts +++ b/packages/handler/src/PreHandler/IfOptionsRequest.ts @@ -1,5 +1,6 @@ import type { FastifyReply, FastifyRequest } from "fastify"; import { Action, IPreHandler } from "./IPreHandler"; +import type { Context } from "~/types"; export class IfOptionsRequest implements IPreHandler { private readonly handlers: IPreHandler[]; @@ -8,14 +9,14 @@ export class IfOptionsRequest implements IPreHandler { this.handlers = handlers; } - async execute(request: FastifyRequest, reply: FastifyReply): Promise { + async execute(request: FastifyRequest, reply: FastifyReply, context: Context): Promise { const isOptionsRequest = request.method === "OPTIONS"; if (!isOptionsRequest) { return Action.CONTINUE; } for (const handler of this.handlers) { - const action = await handler.execute(request, reply); + const action = await handler.execute(request, reply, context); if (action === Action.DONE) { return Action.DONE; } diff --git a/packages/handler/src/PreHandler/PreHandler.ts b/packages/handler/src/PreHandler/PreHandler.ts index dda2b1ba9de..55ae6707ff5 100644 --- a/packages/handler/src/PreHandler/PreHandler.ts +++ b/packages/handler/src/PreHandler/PreHandler.ts @@ -1,5 +1,6 @@ import { FastifyReply, FastifyRequest } from "fastify"; import { Action, IPreHandler } from "~/PreHandler/IPreHandler"; +import type { Context } from "~/types"; export class PreHandler implements IPreHandler { private readonly handlers: IPreHandler[]; @@ -8,9 +9,9 @@ export class PreHandler implements IPreHandler { this.handlers = handlers; } - async execute(request: FastifyRequest, reply: FastifyReply): Promise { + async execute(request: FastifyRequest, reply: FastifyReply, context: Context): Promise { for (const handler of this.handlers) { - const action = await handler.execute(request, reply); + const action = await handler.execute(request, reply, context); if (action === Action.DONE) { return Action.DONE; } diff --git a/packages/handler/src/PreHandler/ProcessHandlerOnRequestPlugins.ts b/packages/handler/src/PreHandler/ProcessHandlerOnRequestPlugins.ts index bcbef49f114..348c4be96e3 100644 --- a/packages/handler/src/PreHandler/ProcessHandlerOnRequestPlugins.ts +++ b/packages/handler/src/PreHandler/ProcessHandlerOnRequestPlugins.ts @@ -1,7 +1,9 @@ import type { FastifyReply, FastifyRequest } from "fastify"; -import { Action, IPreHandler } from "~/PreHandler/IPreHandler"; +import type { IPreHandler } from "~/PreHandler/IPreHandler"; +import { Action } from "~/PreHandler/IPreHandler"; import { HandlerOnRequestPlugin } from "~/plugins/HandlerOnRequestPlugin"; import { stringifyError } from "~/stringifyError"; +import type { Context } from "~/types"; export class ProcessHandlerOnRequestPlugins implements IPreHandler { private readonly plugins: HandlerOnRequestPlugin[]; @@ -10,12 +12,12 @@ export class ProcessHandlerOnRequestPlugins implements IPreHandler { this.plugins = plugins; } - async execute(request: FastifyRequest, reply: FastifyReply): Promise { + async execute(request: FastifyRequest, reply: FastifyReply, context: Context): Promise { let name: string | undefined; try { for (const plugin of this.plugins) { name = plugin.name; - const result = await plugin.exec(request, reply); + const result = await plugin.exec(request, reply, context); if (result === false) { return Action.DONE; } diff --git a/packages/handler/src/fastify.ts b/packages/handler/src/fastify.ts index 9a32ed8d5f1..a175ff9ff75 100644 --- a/packages/handler/src/fastify.ts +++ b/packages/handler/src/fastify.ts @@ -32,6 +32,8 @@ import { IfNotOptionsRequest } from "./PreHandler/IfNotOptionsRequest"; import { ProcessBeforeHandlerPlugins } from "./PreHandler/ProcessBeforeHandlerPlugins"; import { IfOptionsRequest } from "./PreHandler/IfOptionsRequest"; import { SendEarlyOptionsResponse } from "./PreHandler/SendEarlyOptionsResponse"; +import { OnRequestResponsePlugin } from "~/plugins/OnRequestResponsePlugin.js"; +import { OnRequestTimeoutPlugin } from "~/plugins/OnRequestTimeoutPlugin.js"; const modifyResponseHeaders = (app: FastifyInstance, request: Request, reply: Reply) => { const modifyHeaders = app.webiny.plugins.byType( @@ -298,7 +300,7 @@ export const createHandler = (params: CreateHandlerParams) => { new IfOptionsRequest([new SendEarlyOptionsResponse(modifyHeadersPlugins)]) ]); - await preHandler.execute(request, reply); + await preHandler.execute(request, reply, app.webiny); }); app.addHook("preSerialization", async (_, __, payload) => { @@ -406,11 +408,23 @@ export const createHandler = (params: CreateHandlerParams) => { /** * We need to output the benchmark results at the end of the request in both response and timeout cases */ - app.addHook("onResponse", async () => { + app.addHook("onResponse", async (request, reply) => { + const plugins = app.webiny.plugins.byType( + OnRequestResponsePlugin.type + ); + for (const plugin of plugins) { + await plugin.exec(request, reply); + } await context.benchmark.output(); }); - app.addHook("onTimeout", async () => { + app.addHook("onTimeout", async (request, reply) => { + const plugins = app.webiny.plugins.byType( + OnRequestTimeoutPlugin.type + ); + for (const plugin of plugins) { + await plugin.exec(request, reply); + } await context.benchmark.output(); }); diff --git a/packages/handler/src/index.ts b/packages/handler/src/index.ts index 9c3bf3c49fd..0da54b6b77b 100644 --- a/packages/handler/src/index.ts +++ b/packages/handler/src/index.ts @@ -12,4 +12,6 @@ export * from "~/plugins/HandlerResultPlugin"; export * from "~/plugins/HandlerOnRequestPlugin"; export * from "~/plugins/ModifyFastifyPlugin"; export * from "~/plugins/ModifyResponseHeadersPlugin"; +export * from "~/plugins/OnRequestResponsePlugin.js"; +export * from "~/plugins/OnRequestTimeoutPlugin.js"; export * from "./ResponseHeaders"; diff --git a/packages/handler/src/plugins/HandlerOnRequestPlugin.ts b/packages/handler/src/plugins/HandlerOnRequestPlugin.ts index 27a246fb8a7..17d7197dccb 100644 --- a/packages/handler/src/plugins/HandlerOnRequestPlugin.ts +++ b/packages/handler/src/plugins/HandlerOnRequestPlugin.ts @@ -1,5 +1,6 @@ +import type { Context } from "~/types"; import { Plugin } from "@webiny/plugins"; -import { FastifyReply, FastifyRequest } from "fastify"; +import type { FastifyReply, FastifyRequest } from "fastify"; /** * If the execution of the callable returns false, no more plugins will be executed after the given one. @@ -8,28 +9,35 @@ import { FastifyReply, FastifyRequest } from "fastify"; * This way users can prevent stopping of the request on our built-in OPTIONS request. */ export type HandlerOnRequestPluginCallableResponse = false | undefined | null | void; -interface HandlerOnRequestPluginCallable { - (request: FastifyRequest, reply: FastifyReply): Promise; +interface HandlerOnRequestPluginCallable { + ( + request: FastifyRequest, + reply: FastifyReply, + context: C + ): Promise; } -export class HandlerOnRequestPlugin extends Plugin { +export class HandlerOnRequestPlugin extends Plugin { public static override type = "handler.event.onRequest"; - private readonly cb: HandlerOnRequestPluginCallable; + private readonly cb: HandlerOnRequestPluginCallable; - public constructor(cb: HandlerOnRequestPluginCallable) { + public constructor(cb: HandlerOnRequestPluginCallable) { super(); this.cb = cb; } public async exec( request: FastifyRequest, - reply: FastifyReply + reply: FastifyReply, + context: C ): Promise { - return this.cb(request, reply); + return this.cb(request, reply, context); } } -export const createHandlerOnRequest = (cb: HandlerOnRequestPluginCallable) => { - return new HandlerOnRequestPlugin(cb); +export const createHandlerOnRequest = ( + cb: HandlerOnRequestPluginCallable +) => { + return new HandlerOnRequestPlugin(cb); }; diff --git a/packages/handler/src/plugins/OnRequestResponsePlugin.ts b/packages/handler/src/plugins/OnRequestResponsePlugin.ts new file mode 100644 index 00000000000..0c1607dee4f --- /dev/null +++ b/packages/handler/src/plugins/OnRequestResponsePlugin.ts @@ -0,0 +1,25 @@ +import { Plugin } from "@webiny/plugins"; +import type { Reply as FastifyReply, Request as FastifyRequest } from "~/types.js"; + +export interface IOnRequestResponsePluginCallable { + (request: FastifyRequest, reply: FastifyReply): Promise; +} + +export class OnRequestResponsePlugin extends Plugin { + public static override type: string = "handler.onRequestResponse"; + + private readonly cb: IOnRequestResponsePluginCallable; + + public constructor(cb: IOnRequestResponsePluginCallable) { + super(); + this.cb = cb; + } + + public async exec(request: FastifyRequest, reply: FastifyReply): Promise { + return this.cb(request, reply); + } +} + +export const createOnRequestResponse = (cb: IOnRequestResponsePluginCallable) => { + return new OnRequestResponsePlugin(cb); +}; diff --git a/packages/handler/src/plugins/OnRequestTimeoutPlugin.ts b/packages/handler/src/plugins/OnRequestTimeoutPlugin.ts new file mode 100644 index 00000000000..08475d40b0e --- /dev/null +++ b/packages/handler/src/plugins/OnRequestTimeoutPlugin.ts @@ -0,0 +1,25 @@ +import { Plugin } from "@webiny/plugins"; +import type { Reply as FastifyReply, Request as FastifyRequest } from "~/types.js"; + +export interface IOnRequestTimeoutPluginCallable { + (request: FastifyRequest, reply: FastifyReply): Promise; +} + +export class OnRequestTimeoutPlugin extends Plugin { + public static override type: string = "handler.onRequestTimeout"; + + private readonly cb: IOnRequestTimeoutPluginCallable; + + public constructor(cb: IOnRequestTimeoutPluginCallable) { + super(); + this.cb = cb; + } + + public async exec(request: FastifyRequest, reply: FastifyReply): Promise { + return this.cb(request, reply); + } +} + +export const createOnRequestTimeout = (cb: IOnRequestTimeoutPluginCallable) => { + return new OnRequestTimeoutPlugin(cb); +}; diff --git a/packages/pulumi-aws/src/apps/api/ApiFileManager.ts b/packages/pulumi-aws/src/apps/api/ApiFileManager.ts index 0a88d1b697c..2b6d94b7001 100644 --- a/packages/pulumi-aws/src/apps/api/ApiFileManager.ts +++ b/packages/pulumi-aws/src/apps/api/ApiFileManager.ts @@ -109,6 +109,12 @@ export const ApiFileManager = createAppModule({ }; return { + roles: { + manage: role + }, + policies: { + manage: policy + }, functions, bucketNotification }; diff --git a/packages/pulumi-aws/src/apps/api/ApiOutput.ts b/packages/pulumi-aws/src/apps/api/ApiOutput.ts index 24747eb9f1c..63a84788c3d 100644 --- a/packages/pulumi-aws/src/apps/api/ApiOutput.ts +++ b/packages/pulumi-aws/src/apps/api/ApiOutput.ts @@ -21,6 +21,7 @@ export const ApiOutput = createAppModule({ apiDomain: output["apiDomain"], apiUrl: output["apiUrl"], graphqlLambdaRole: output["graphqlLambdaRole"], + graphqlLambdaRoleName: output["graphqlLambdaRoleName"], apwSchedulerEventRule: output["apwSchedulerEventRule"], apwSchedulerEventTargetId: output["apwSchedulerEventTargetId"], apwSchedulerExecuteAction: output["apwSchedulerExecuteAction"], @@ -30,7 +31,16 @@ export const ApiOutput = createAppModule({ cognitoUserPoolPasswordPolicy: output["cognitoUserPoolPasswordPolicy"], dynamoDbTable: output["dynamoDbTable"], region: output["region"], - websocketApiUrl: output["websocketApiUrl"] + websocketApiId: output["websocketApiId"], + websocketApiUrl: output["websocketApiUrl"], + migrationLambdaArn: output["migrationLambdaArn"], + graphqlLambdaName: output["graphqlLambdaName"], + backgroundTaskLambdaArn: output["backgroundTaskLambdaArn"], + backgroundTaskStepFunctionArn: output["backgroundTaskStepFunctionArn"], + fileManagerManageLambdaArn: output["fileManagerManageLambdaArn"], + fileManagerManageLambdaRole: output["fileManagerManageLambdaRole"], + fileManagerManageLambdaRoleName: output["fileManagerManageLambdaRoleName"], + fileManagerDownloadLambdaArn: output["fileManagerDownloadLambdaArn"] }; }); } diff --git a/packages/pulumi-aws/src/apps/api/createApiPulumiApp.ts b/packages/pulumi-aws/src/apps/api/createApiPulumiApp.ts index 838983e5f7f..a13cde8cfe3 100644 --- a/packages/pulumi-aws/src/apps/api/createApiPulumiApp.ts +++ b/packages/pulumi-aws/src/apps/api/createApiPulumiApp.ts @@ -1,5 +1,10 @@ import * as aws from "@pulumi/aws"; -import { createPulumiApp, PulumiAppParam, PulumiAppParamCallback } from "@webiny/pulumi"; +import { + createPulumiApp, + type PulumiApp, + PulumiAppParam, + PulumiAppParamCallback +} from "@webiny/pulumi"; import { ApiApwScheduler, ApiBackgroundTask, @@ -26,6 +31,8 @@ import { getEnvVariableWebinyVariant } from "~/env/variant"; import { getEnvVariableWebinyEnv } from "~/env/env"; import { getEnvVariableWebinyProjectName } from "~/env/projectName"; import { getEnvVariableAwsRegion } from "~/env/awsRegion"; +import { attachSyncSystem } from "../syncSystem/api/index.js"; +import type { WithServiceManifest } from "~/utils/withServiceManifest.js"; export type ApiPulumiApp = ReturnType; @@ -87,7 +94,7 @@ export const createApiPulumiApp = (projectAppParams: CreateApiPulumiAppParams = name: "api", path: "apps/api", config: projectAppParams, - program: async app => { + program: async (app: PulumiApp & WithServiceManifest) => { let searchEngineParams: | CreateCorePulumiAppParams["openSearch"] | CreateCorePulumiAppParams["elasticSearch"] @@ -272,8 +279,13 @@ export const createApiPulumiApp = (projectAppParams: CreateApiPulumiAppParams = migrationLambdaArn: migration.function.output.arn, graphqlLambdaName: graphql.functions.graphql.output.name, graphqlLambdaRole: graphql.role.output.arn, + graphqlLambdaRoleName: graphql.role.output.name, backgroundTaskLambdaArn: backgroundTask.backgroundTask.output.arn, backgroundTaskStepFunctionArn: backgroundTask.stepFunction.output.arn, + fileManagerManageLambdaArn: fileManager.functions.manage.output.arn, + fileManagerManageLambdaRole: fileManager.roles.manage.output.arn, + fileManagerManageLambdaRoleName: fileManager.roles.manage.output.name, + fileManagerDownloadLambdaArn: fileManager.functions.download.output.arn, websocketApiId: websocket.websocketApi.output.id, websocketApiUrl: websocket.websocketApiUrl }); @@ -297,6 +309,14 @@ export const createApiPulumiApp = (projectAppParams: CreateApiPulumiAppParams = } }); }); + /** + * We need to attach the Sync System if it exists. + */ + attachSyncSystem({ + app, + core, + env: app.params.run.env + }); tagResources({ WbyProjectName: getEnvVariableWebinyProjectName(), diff --git a/packages/pulumi-aws/src/apps/blueGreen/createBlueGreenPulumiApp.ts b/packages/pulumi-aws/src/apps/blueGreen/createBlueGreenPulumiApp.ts index 112c941b3d0..23ec8a212cc 100644 --- a/packages/pulumi-aws/src/apps/blueGreen/createBlueGreenPulumiApp.ts +++ b/packages/pulumi-aws/src/apps/blueGreen/createBlueGreenPulumiApp.ts @@ -33,6 +33,14 @@ export interface OpenSearchConfig { sharedIndexes: boolean; } +export interface IDeploymentsCallableParams { + env: string; +} + +export interface IDeploymentsCallable { + (params: IDeploymentsCallableParams): [IBlueGreenDeployment, IBlueGreenDeployment]; +} + export interface CreateBlueGreenPulumiAppParams { /** * Secures against deleting database by accident. @@ -79,7 +87,7 @@ export interface CreateBlueGreenPulumiAppParams { * Available deployments for the Blue / Green switch. * They will be validated before deploy. */ - deployments: () => [IBlueGreenDeployment, IBlueGreenDeployment]; + deployments: IDeploymentsCallable; /** * Attach domains to the Blue/Green CloudFront. */ @@ -95,7 +103,7 @@ export function createBlueGreenPulumiApp(projectAppParams: CreateBlueGreenPulumi const productionEnvironments = app.params.create.productionEnvironments || DEFAULT_PROD_ENV_NAMES; - const deployments = validateDeployments(projectAppParams.deployments()); + const deployments = validateDeployments(projectAppParams.deployments(app.params.run)); const applicationsDomains = await getApplicationDomains({ stacks: deployments @@ -105,7 +113,7 @@ export function createBlueGreenPulumiApp(projectAppParams: CreateBlueGreenPulumi input: applicationsDomains }); - const attachedDomains = projectAppParams.domains(); + const attachedDomains = projectAppParams.domains(app.params.run); const domains = resolveDomains({ attachedDomains, diff --git a/packages/pulumi-aws/src/apps/blueGreen/types.ts b/packages/pulumi-aws/src/apps/blueGreen/types.ts index b7ed29aa2ee..6048192ccc6 100644 --- a/packages/pulumi-aws/src/apps/blueGreen/types.ts +++ b/packages/pulumi-aws/src/apps/blueGreen/types.ts @@ -47,8 +47,12 @@ export interface IAttachedDomains { domains?: IAttachedDomainsTypes; } +export interface IAttachDomainsCallableParams { + env: string; +} + export interface IAttachDomainsCallable { - (): IAttachedDomains; + (params: IAttachDomainsCallableParams): IAttachedDomains; } export type IAttachedDomainKey = keyof IAttachedDomainsTypes; diff --git a/packages/pulumi-aws/src/apps/common/CoreOutput.ts b/packages/pulumi-aws/src/apps/common/CoreOutput.ts index ed9f6081f42..a72a4d7f0fb 100644 --- a/packages/pulumi-aws/src/apps/common/CoreOutput.ts +++ b/packages/pulumi-aws/src/apps/common/CoreOutput.ts @@ -19,6 +19,7 @@ export const CoreOutput = createAppModule({ return { fileManagerBucketId: output["fileManagerBucketId"], + fileManagerBucketArn: output["fileManagerBucketArn"], primaryDynamodbTableArn: output["primaryDynamodbTableArn"], primaryDynamodbTableName: output["primaryDynamodbTableName"], primaryDynamodbTableHashKey: output["primaryDynamodbTableHashKey"], diff --git a/packages/pulumi-aws/src/apps/core/createCorePulumiApp.ts b/packages/pulumi-aws/src/apps/core/createCorePulumiApp.ts index 2687d4592b8..5f98f1eb075 100644 --- a/packages/pulumi-aws/src/apps/core/createCorePulumiApp.ts +++ b/packages/pulumi-aws/src/apps/core/createCorePulumiApp.ts @@ -172,7 +172,7 @@ export function createCorePulumiApp(projectAppParams: CreateCorePulumiAppParams // Setup file core bucket const { bucket: fileManagerBucket } = app.addModule(CoreFileManger, { protect }); - let elasticSearch; + let elasticSearch = undefined; if (searchEngineType === "openSearch") { elasticSearch = app.addModule(OpenSearch, { protect }); } else if (searchEngineType === "elasticSearch") { @@ -189,6 +189,7 @@ export function createCorePulumiApp(projectAppParams: CreateCorePulumiAppParams deploymentId: deploymentId.hex, region: aws.config.region, fileManagerBucketId: fileManagerBucket.output.id, + fileManagerBucketArn: fileManagerBucket.output.arn, primaryDynamodbTableArn: dynamoDbTable.output.arn, primaryDynamodbTableName: dynamoDbTable.output.name, primaryDynamodbTableHashKey: dynamoDbTable.output.hashKey, diff --git a/packages/pulumi-aws/src/apps/lambdaUtils.ts b/packages/pulumi-aws/src/apps/lambdaUtils.ts index fab63b840f1..fd1d2f2627b 100644 --- a/packages/pulumi-aws/src/apps/lambdaUtils.ts +++ b/packages/pulumi-aws/src/apps/lambdaUtils.ts @@ -1,18 +1,17 @@ import * as pulumi from "@pulumi/pulumi"; import * as aws from "@pulumi/aws"; import { PulumiApp } from "@webiny/pulumi"; +import { VpcConfig } from "./common"; export * from "../utils/lambdaEnvVariables"; -import { VpcConfig } from "./common"; - interface LambdaRoleParams { name: string; policy?: pulumi.Output; executionRole?: pulumi.Input; } -export function createLambdaRole(app: PulumiApp, params: LambdaRoleParams) { +const createLambdaRoleWithoutExecution = (app: PulumiApp, params: LambdaRoleParams) => { const role = app.addResource(aws.iam.Role, { name: params.name, config: { @@ -52,6 +51,11 @@ export function createLambdaRole(app: PulumiApp, params: LambdaRoleParams) { } }); } + return role; +}; + +export function createLambdaRole(app: PulumiApp, params: LambdaRoleParams) { + const role = createLambdaRoleWithoutExecution(app, params); // Add default execution role. const vpc = app.getModule(VpcConfig); @@ -70,3 +74,17 @@ export function createLambdaRole(app: PulumiApp, params: LambdaRoleParams) { return role; } + +export const createLambdaRoleWithoutVpc = (app: PulumiApp, params: LambdaRoleParams) => { + const role = createLambdaRoleWithoutExecution(app, params); + + app.addResource(aws.iam.RolePolicyAttachment, { + name: `${params.name}-default-execution-role`, + config: { + role: role.output, + policyArn: aws.iam.ManagedPolicy.AWSLambdaBasicExecutionRole + } + }); + + return role; +}; diff --git a/packages/pulumi-aws/src/apps/syncSystem/SyncSystemDynamo.ts b/packages/pulumi-aws/src/apps/syncSystem/SyncSystemDynamoDb.ts similarity index 77% rename from packages/pulumi-aws/src/apps/syncSystem/SyncSystemDynamo.ts rename to packages/pulumi-aws/src/apps/syncSystem/SyncSystemDynamoDb.ts index ecf332d480e..14747058f51 100644 --- a/packages/pulumi-aws/src/apps/syncSystem/SyncSystemDynamo.ts +++ b/packages/pulumi-aws/src/apps/syncSystem/SyncSystemDynamoDb.ts @@ -1,13 +1,14 @@ import * as aws from "@pulumi/aws"; import { createAppModule, PulumiApp, PulumiAppModule } from "@webiny/pulumi"; +import { createSyncResourceName } from "~/apps/syncSystem/createSyncResourceName.js"; -export type SyncSystemDynamo = PulumiAppModule; +export type SyncSystemDynamoDb = PulumiAppModule; -export const SyncSystemDynamo = createAppModule({ +export const SyncSystemDynamoDb = createAppModule({ name: "SyncSystemDynamoDb", - config(app: PulumiApp, params: { protect: boolean }) { + config(app: PulumiApp) { return app.addResource(aws.dynamodb.Table, { - name: "sync-table", + name: createSyncResourceName("table"), config: { attributes: [ { name: "PK", type: "S" }, @@ -21,7 +22,6 @@ export const SyncSystemDynamo = createAppModule({ hashKey: "PK", rangeKey: "SK", globalSecondaryIndexes: [ - // TODO possibly add more indexes here { name: "GSI1", hashKey: "GSI1_PK", @@ -35,9 +35,6 @@ export const SyncSystemDynamo = createAppModule({ projectionType: "ALL" } ] - }, - opts: { - protect: params.protect } }); } diff --git a/packages/pulumi-aws/src/apps/syncSystem/SyncSystemEventBus.ts b/packages/pulumi-aws/src/apps/syncSystem/SyncSystemEventBus.ts new file mode 100644 index 00000000000..3b290a748a8 --- /dev/null +++ b/packages/pulumi-aws/src/apps/syncSystem/SyncSystemEventBus.ts @@ -0,0 +1,88 @@ +import * as aws from "@pulumi/aws"; +import type { PulumiApp } from "@webiny/pulumi"; +import { createAppModule } from "@webiny/pulumi"; +import { createSyncResourceName } from "./createSyncResourceName.js"; +import type { EventBusArgs } from "@pulumi/aws/cloudwatch/eventBus.js"; +import { SyncSystemSQS } from "~/apps/syncSystem/SyncSystemSQS.js"; +import type { EventRuleArgs } from "@pulumi/aws/cloudwatch/eventRule.js"; +import type { EventTargetArgs } from "@pulumi/aws/cloudwatch/eventTarget.js"; + +export const SyncSystemEventBus = createAppModule({ + name: "SyncSystemEventBus", + config: (app: PulumiApp) => { + const sqs = app.getModule(SyncSystemSQS); + + const eventBusName = createSyncResourceName("eventBus"); + + const config: EventBusArgs = { + name: eventBusName, + description: "Connect deployed systems to Sync SQS" + }; + const eventBus = app.addResource(aws.cloudwatch.EventBus, { + name: eventBusName, + config + }); + + const eventBusRuleConfig: EventRuleArgs = { + eventBusName: eventBus.output.arn, + eventPattern: JSON.stringify({ + "detail-type": ["synchronization-input"] + }) + }; + + const eventBusRule = app.addResource(aws.cloudwatch.EventRule, { + name: createSyncResourceName("eventBusRule"), + config: eventBusRuleConfig + }); + + const eventBusTargetConfig: EventTargetArgs = { + rule: eventBusRule.output.name, + eventBusName: eventBus.output.name, + arn: sqs.output.arn, + sqsTarget: { + messageGroupId: "default" + } + // TODO add dead letter queue + // deadLetterConfig: { + // arn: deadLetterQueue.output.arn + // } + }; + + const eventBusTarget = app.addResource(aws.cloudwatch.EventTarget, { + name: createSyncResourceName("eventBusEventTarget"), + config: eventBusTargetConfig + }); + + const eventBusPolicy = app.addResource(aws.sqs.QueuePolicy, { + name: createSyncResourceName("queuePolicy"), + config: { + queueUrl: sqs.output.id, + policy: sqs.output.arn.apply(arn => { + return JSON.stringify({ + Version: "2012-10-17", + Statement: [ + { + Effect: "Allow", + Principal: aws.iam.Principals.EventsPrincipal, + Action: "sqs:SendMessage", + Resource: arn, + Condition: { + ArnEquals: { + "aws:SourceArn": eventBusRule.output.arn + } + } + } + ] + }); + }) + } + }); + + return { + eventBus, + eventBusRule, + eventBusTarget, + eventBusPolicy + }; + } +}); diff --git a/packages/pulumi-aws/src/apps/syncSystem/SyncSystemLambda.ts b/packages/pulumi-aws/src/apps/syncSystem/SyncSystemLambda.ts index f3fcb7137be..7b7b4ed17d6 100644 --- a/packages/pulumi-aws/src/apps/syncSystem/SyncSystemLambda.ts +++ b/packages/pulumi-aws/src/apps/syncSystem/SyncSystemLambda.ts @@ -1,183 +1,65 @@ import path from "path"; -import * as pulumi from "@pulumi/pulumi"; import * as aws from "@pulumi/aws"; -import { createAppModule, PulumiApp, PulumiAppModule } from "@webiny/pulumi"; -import { createLambdaRole, getCommonLambdaEnvVariables } from "../lambdaUtils"; -import { VpcConfig } from "~/apps"; -import { getAwsAccountId, getAwsRegion } from "../awsUtils"; -import { LAMBDA_RUNTIME } from "~/constants"; -import { SyncSystemDynamo } from "./SyncSystemDynamo"; - -export interface SyncSystemLambdaParams { - protect: boolean; - config: Record; -} +import type { PulumiApp, PulumiAppModule } from "@webiny/pulumi"; +import { createAppModule } from "@webiny/pulumi"; +import { createLambdaRoleWithoutVpc } from "../lambdaUtils.js"; +import { LAMBDA_RUNTIME } from "~/constants.js"; +import { createSyncSystemInputLambdaPolicy } from "./lambda/createSyncSystemInputLambdaPolicy.js"; +import { createSyncResourceName } from "./createSyncResourceName.js"; +import { createAssetArchive } from "~/utils/createAssetArchive.js"; +import { SyncSystemSQS } from "./SyncSystemSQS.js"; export type SyncSystemLambda = PulumiAppModule; export const SyncSystemLambda = createAppModule({ name: "SyncSystemLambda", - // eslint-disable-next-line - config(app: PulumiApp, _: SyncSystemLambdaParams) { - const policy = createSyncSystemLambdaPolicy({ - app, - // TODO - get bucket ids and dynamodb tables from the FileManager app - primary: { - fileManagerBucketId: "primaryFileManagerBucketId", - dynamoDbTableArn: "" - }, - secondary: { - fileManagerBucketId: "secondaryFileManagerBucketId", - dynamoDbTableArn: "" - } + config(app: PulumiApp) { + const sqs = app.getModule(SyncSystemSQS); + + const roleName = createSyncResourceName("input-lambda-role"); + const policy = createSyncSystemInputLambdaPolicy({ + name: `${roleName}-policy`, + app }); - const role = createLambdaRole(app, { - name: "sync-system-lambda-role", + const role = createLambdaRoleWithoutVpc(app, { + name: roleName, policy: policy.output }); - const syncSystemLambda = app.addResource(aws.lambda.Function, { - name: "sync-system-lambda", + const lambda = app.addResource(aws.lambda.Function, { + name: createSyncResourceName("lambda"), config: { runtime: LAMBDA_RUNTIME, handler: "handler.handler", role: role.output.arn, timeout: 900, - memorySize: 1024, - code: new pulumi.asset.AssetArchive({ - ".": new pulumi.asset.FileArchive( - path.join(app.paths.workspace, "transfer/build") - ) - }), + memorySize: 512, + code: createAssetArchive(path.join(app.paths.workspace, "resolver/build")), environment: { - variables: getCommonLambdaEnvVariables().apply(value => ({ - ...value, + variables: { + DEBUG: String(process.env.DEBUG), + PULUMI_APPS: "true", AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1" - })) - }, - vpcConfig: app.getModule(VpcConfig).functionVpcConfig + } + } + } + }); + + const eventSourceMapping = app.addResource(aws.lambda.EventSourceMapping, { + name: createSyncResourceName("sqs-to-lambda"), + config: { + eventSourceArn: sqs.output.arn, + functionName: lambda.output.arn, + batchSize: 10 + // maximumBatchingWindowInSeconds: 2 } }); return { role, policy, - functions: { - syncSystem: syncSystemLambda - } + lambda, + eventSourceMapping }; } }); - -interface ICreateSyncSystemLambdaPolicyParamsType { - fileManagerBucketId: string; - dynamoDbTableArn: string; -} - -interface ICreateSyncSystemLambdaPolicyParams { - app: PulumiApp; - primary: ICreateSyncSystemLambdaPolicyParamsType; - secondary: ICreateSyncSystemLambdaPolicyParamsType; -} - -function createSyncSystemLambdaPolicy(params: ICreateSyncSystemLambdaPolicyParams) { - const { app, primary, secondary } = params; - const dynamoDbTable = app.getModule(SyncSystemDynamo); - const awsAccountId = getAwsAccountId(app); - const awsRegion = getAwsRegion(app); - - const policy: aws.iam.PolicyDocument = { - Version: "2012-10-17", - Statement: [ - { - Sid: "PermissionForDynamodb", - Effect: "Allow", - Action: [ - "dynamodb:BatchGetItem", - "dynamodb:BatchWriteItem", - "dynamodb:ConditionCheckItem", - "dynamodb:CreateBackup", - "dynamodb:CreateTable", - "dynamodb:CreateTableReplica", - "dynamodb:DeleteBackup", - "dynamodb:DeleteItem", - "dynamodb:DeleteTable", - "dynamodb:DeleteTableReplica", - "dynamodb:DescribeBackup", - "dynamodb:DescribeContinuousBackups", - "dynamodb:DescribeContributorInsights", - "dynamodb:DescribeExport", - "dynamodb:DescribeKinesisStreamingDestination", - "dynamodb:DescribeLimits", - "dynamodb:DescribeReservedCapacity", - "dynamodb:DescribeReservedCapacityOfferings", - "dynamodb:DescribeStream", - "dynamodb:DescribeTable", - "dynamodb:DescribeTableReplicaAutoScaling", - "dynamodb:DescribeTimeToLive", - "dynamodb:DisableKinesisStreamingDestination", - "dynamodb:EnableKinesisStreamingDestination", - "dynamodb:ExportTableToPointInTime", - "dynamodb:GetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:ListBackups", - "dynamodb:ListContributorInsights", - "dynamodb:ListExports", - "dynamodb:ListStreams", - "dynamodb:ListTables", - "dynamodb:ListTagsOfResource", - "dynamodb:PartiQLDelete", - "dynamodb:PartiQLInsert", - "dynamodb:PartiQLSelect", - "dynamodb:PartiQLUpdate", - "dynamodb:PurchaseReservedCapacityOfferings", - "dynamodb:PutItem", - "dynamodb:Query", - "dynamodb:RestoreTableFromBackup", - "dynamodb:RestoreTableToPointInTime", - "dynamodb:Scan", - "dynamodb:UpdateContinuousBackups", - "dynamodb:UpdateContributorInsights", - "dynamodb:UpdateItem", - "dynamodb:UpdateTable", - "dynamodb:UpdateTableReplicaAutoScaling", - "dynamodb:UpdateTimeToLive" - ], - Resource: [`${dynamoDbTable.output.arn}`, `${dynamoDbTable.output.arn}/*`] - }, - { - Sid: "PermissionForS3", - Effect: "Allow", - Action: [ - "s3:ListBucket", - "s3:GetObjectAcl", - "s3:DeleteObject", - "s3:PutObjectAcl", - "s3:PutObject", - "s3:GetObject" - ], - Resource: [ - pulumi.interpolate`arn:aws:s3:::${primary.fileManagerBucketId}`, - pulumi.interpolate`arn:aws:s3:::${primary.fileManagerBucketId}/*`, - pulumi.interpolate`arn:aws:s3:::${secondary.fileManagerBucketId}`, - pulumi.interpolate`arn:aws:s3:::${secondary.fileManagerBucketId}/*` - ] - }, - { - Sid: "PermissionForLambda", - Effect: "Allow", - Action: ["lambda:InvokeFunction"], - Resource: pulumi.interpolate`arn:aws:lambda:${awsRegion}:${awsAccountId}:function:*` - } - ] - }; - - return app.addResource(aws.iam.Policy, { - name: "SyncSystemLambdaPolicy", - config: { - description: "This policy enables access to Dynamodb, S3 and Lambda.", - policy - } - }); -} diff --git a/packages/pulumi-aws/src/apps/syncSystem/SyncSystemOutput.ts b/packages/pulumi-aws/src/apps/syncSystem/SyncSystemOutput.ts new file mode 100644 index 00000000000..be18d07183c --- /dev/null +++ b/packages/pulumi-aws/src/apps/syncSystem/SyncSystemOutput.ts @@ -0,0 +1,23 @@ +import { createAppModule, PulumiAppModule } from "@webiny/pulumi"; +import { getSyncSystemOutput } from "~/apps/syncSystem/getSyncSystemOutput.js"; + +export type SyncSystemOutput = PulumiAppModule; + +export const SyncSystemOutput = createAppModule({ + name: "SyncSystemOutput", + config(app) { + return app.addHandler(async () => { + const output = getSyncSystemOutput({ + env: app.params.run.env + }); + + const keys = Object.keys(output || {}); + + if (keys.length === 0) { + console.log("Sync System application is not deployed."); + return null; + } + return output; + }); + } +}); diff --git a/packages/pulumi-aws/src/apps/syncSystem/SyncSystemSQS.ts b/packages/pulumi-aws/src/apps/syncSystem/SyncSystemSQS.ts index c4d8890e810..400a2683aa6 100644 --- a/packages/pulumi-aws/src/apps/syncSystem/SyncSystemSQS.ts +++ b/packages/pulumi-aws/src/apps/syncSystem/SyncSystemSQS.ts @@ -2,36 +2,44 @@ import * as aws from "@pulumi/aws"; import type { QueueArgs } from "@pulumi/aws/sqs"; import type { PulumiApp } from "@webiny/pulumi"; import { createAppModule } from "@webiny/pulumi"; - -export interface ISyncSystemSQSParams { - protect: boolean; -} +import { createSyncResourceName } from "./createSyncResourceName.js"; export const SyncSystemSQS = createAppModule({ name: "SyncSystemSQS", - config: (app: PulumiApp, params: ISyncSystemSQSParams) => { + config: (app: PulumiApp) => { const config: QueueArgs = { delaySeconds: 0, + /** + * 5 minutes should be enough for the message to be processed. + */ visibilityTimeoutSeconds: 900, fifoQueue: true, receiveWaitTimeSeconds: 0, + deduplicationScope: "queue", /** * The maximum message size is 256 KB. - * Is it enough? If not, we can use S3 to store the message and only store the reference in the queue. + * Chunks are billed in 64KB increments, so let's keep the message size below that. */ - maxMessageSize: 262144, // max + maxMessageSize: 60 * 1024, // KB /** * How log do we keep the message in the queue? - * Something is very wrong if the message is not processed within 4 days... :/ */ - messageRetentionSeconds: 345600 // default - 4 days + messageRetentionSeconds: 4 /* days */ * 24 * 60 * 60, + /** + * No need to encrypt the message as nothing outside the system can actually read it. + */ + sqsManagedSseEnabled: false, + /** + * We want to make sure that no message is sent more than once. + * + * TODO: determine if the criteria by which will we create a hash for the ID. + * TODO: must set "MessageDeduplicationId" property when creating the message. + */ + contentBasedDeduplication: true }; return app.addResource(aws.sqs.Queue, { - name: "sync-sqs", - config, - opts: { - protect: params.protect - } + name: createSyncResourceName("sqs"), + config }); } }); diff --git a/packages/pulumi-aws/src/apps/syncSystem/addTableItems.ts b/packages/pulumi-aws/src/apps/syncSystem/addTableItems.ts deleted file mode 100644 index 8b3d1c3bfea..00000000000 --- a/packages/pulumi-aws/src/apps/syncSystem/addTableItems.ts +++ /dev/null @@ -1,60 +0,0 @@ -import * as aws from "@pulumi/aws"; -import * as pulumi from "@pulumi/pulumi"; -import type { PulumiApp } from "@webiny/pulumi"; -import type { SyncSystemDynamo } from "./SyncSystemDynamo"; - -export interface IAddTableItemsParams { - app: PulumiApp; - table: SyncSystemDynamo; - items: Record>; -} - -export const addTableItems = (params: IAddTableItemsParams): void => { - const { app, table, items } = params; - /** - * Store some settings in the table. - */ - app.addResource(aws.dynamodb.TableItem, { - name: "syncSystemSettings", - config: { - tableName: table.output.arn, - hashKey: table.output.hashKey, - rangeKey: pulumi.output(table.output.rangeKey).apply(key => key || "SK"), - item: pulumi.interpolate`{ - ${buildTableItems({ - PK: "syncSystem#SETTINGS", - SK: "default", - ...items - })} - }` - } - }); -}; - -const getTableItemType = (value: unknown) => { - if (value === null || value === undefined) { - return "S"; - } - switch (typeof value) { - case "string": - return "S"; - case "number": - return "N"; - case "object": - return "M"; - default: - throw new Error(`Unsupported type: ${typeof value}`); - } -}; - -const buildTableItems = ( - items: Record> -): string => { - return Object.keys(items) - .reduce((output, key) => { - const value = items[key]; - output.push(`"${key}": {"${getTableItemType(value)}": "${value}"}`); - return output; - }, []) - .join(","); -}; diff --git a/packages/pulumi-aws/src/apps/syncSystem/api/addServiceManifest.ts b/packages/pulumi-aws/src/apps/syncSystem/api/addServiceManifest.ts new file mode 100644 index 00000000000..acc0db4408f --- /dev/null +++ b/packages/pulumi-aws/src/apps/syncSystem/api/addServiceManifest.ts @@ -0,0 +1,23 @@ +import type { PulumiApp } from "@webiny/pulumi"; +import type { IGetSyncSystemOutputResult } from "~/apps/syncSystem/types.js"; +import type { WithServiceManifest } from "~/utils/withServiceManifest.js"; + +export interface IAddServiceManifestParams { + app: PulumiApp & WithServiceManifest; + syncSystem: IGetSyncSystemOutputResult; +} + +export const addServiceManifest = (params: IAddServiceManifestParams) => { + const { app, syncSystem } = params; + + app.addHandler(() => { + app.addServiceManifest({ + name: "sync", + manifest: { + eventBusArn: syncSystem.eventBusArn, + eventBusName: syncSystem.eventBusName, + region: syncSystem.region + } + }); + }); +}; diff --git a/packages/pulumi-aws/src/apps/syncSystem/api/attachDynamoDbPermissions.ts b/packages/pulumi-aws/src/apps/syncSystem/api/attachDynamoDbPermissions.ts new file mode 100644 index 00000000000..a267def5a94 --- /dev/null +++ b/packages/pulumi-aws/src/apps/syncSystem/api/attachDynamoDbPermissions.ts @@ -0,0 +1,108 @@ +/** + * We need to attach Sync System Lambda policy to access DynamoDB in the Webiny system. + */ +import * as aws from "@pulumi/aws"; +import type { PulumiApp } from "@webiny/pulumi"; +import type { IGetSyncSystemOutputResult } from "~/apps/syncSystem/types.js"; +import { createSyncResourceName } from "~/apps/syncSystem/createSyncResourceName.js"; +import type { CoreOutput } from "~/apps/common/CoreOutput.js"; +import type { WithServiceManifest } from "~/utils/withServiceManifest.js"; + +export interface IAttachDynamoDbPermissionsParams { + app: PulumiApp & WithServiceManifest; + syncSystem: IGetSyncSystemOutputResult; + core: CoreOutput; +} + +export const attachDynamoDbPermissions = (params: IAttachDynamoDbPermissionsParams) => { + const { app, syncSystem, core } = params; + + const { lambdaRoleName } = syncSystem; + + const lambdaToDynamoDbResourceName = createSyncResourceName(`lambda-to-dynamodb`); + + const dynamoDbPolicy = app.addResource(aws.iam.Policy, { + name: `${lambdaToDynamoDbResourceName}-policy`, + config: { + description: "This policy enables access from Sync System Lambda to Webiny DynamoDB.", + policy: { + Version: "2012-10-17", + Statement: [ + { + Sid: "PermissionForLambdaToDynamoDb", + Effect: "Allow", + Action: [ + "dynamodb:BatchGetItem", + "dynamodb:BatchWriteItem", + "dynamodb:ConditionCheckItem", + "dynamodb:CreateBackup", + "dynamodb:CreateTable", + "dynamodb:CreateTableReplica", + "dynamodb:DeleteBackup", + "dynamodb:DeleteItem", + "dynamodb:DeleteTable", + "dynamodb:DeleteTableReplica", + "dynamodb:DescribeBackup", + "dynamodb:DescribeContinuousBackups", + "dynamodb:DescribeContributorInsights", + "dynamodb:DescribeExport", + "dynamodb:DescribeKinesisStreamingDestination", + "dynamodb:DescribeLimits", + "dynamodb:DescribeReservedCapacity", + "dynamodb:DescribeReservedCapacityOfferings", + "dynamodb:DescribeStream", + "dynamodb:DescribeTable", + "dynamodb:DescribeTableReplicaAutoScaling", + "dynamodb:DescribeTimeToLive", + "dynamodb:DisableKinesisStreamingDestination", + "dynamodb:EnableKinesisStreamingDestination", + "dynamodb:ExportTableToPointInTime", + "dynamodb:GetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:ListBackups", + "dynamodb:ListContributorInsights", + "dynamodb:ListExports", + "dynamodb:ListStreams", + "dynamodb:ListTables", + "dynamodb:ListTagsOfResource", + "dynamodb:PartiQLDelete", + "dynamodb:PartiQLInsert", + "dynamodb:PartiQLSelect", + "dynamodb:PartiQLUpdate", + "dynamodb:PurchaseReservedCapacityOfferings", + "dynamodb:PutItem", + "dynamodb:Query", + "dynamodb:RestoreTableFromBackup", + "dynamodb:RestoreTableToPointInTime", + "dynamodb:Scan", + "dynamodb:UpdateContinuousBackups", + "dynamodb:UpdateContributorInsights", + "dynamodb:UpdateItem", + "dynamodb:UpdateTable", + "dynamodb:UpdateTableReplicaAutoScaling", + "dynamodb:UpdateTimeToLive" + ], + Resource: [ + core.primaryDynamodbTableArn.apply(arn => arn), + core.primaryDynamodbTableArn.apply(arn => `${arn}/*`) + ] + } + ] + } + } + }); + + const lambdaRolePolicyAttachment = app.addResource(aws.iam.RolePolicyAttachment, { + name: `${lambdaToDynamoDbResourceName}-role-policy-attachment`, + config: { + role: lambdaRoleName, + policyArn: dynamoDbPolicy.output.arn + } + }); + + return { + dynamoDbPolicy, + lambdaRolePolicyAttachment + }; +}; diff --git a/packages/pulumi-aws/src/apps/syncSystem/api/attachEventBusPermissions.ts b/packages/pulumi-aws/src/apps/syncSystem/api/attachEventBusPermissions.ts new file mode 100644 index 00000000000..e80559a1d8b --- /dev/null +++ b/packages/pulumi-aws/src/apps/syncSystem/api/attachEventBusPermissions.ts @@ -0,0 +1,68 @@ +import * as aws from "@pulumi/aws"; +import type { PulumiApp } from "@webiny/pulumi/types"; +import type { IGetSyncSystemOutputResult } from "../types"; +import { createSyncResourceName } from "../createSyncResourceName"; +import { ApiGraphql } from "~/apps/api/ApiGraphql.js"; +import { ApiFileManager } from "~/apps/api/ApiFileManager.js"; +import type { WithServiceManifest } from "~/utils/withServiceManifest.js"; + +export interface IAttachEventBusPermissionsParam { + app: PulumiApp & WithServiceManifest; + syncSystem: IGetSyncSystemOutputResult; +} + +/** + * We need to attach the policy to: + * * GraphQL Lambda Role + * * File Manager Manage Lambda Role + * TODO determine if any other are required + */ +export const attachEventBusPermissions = (params: IAttachEventBusPermissionsParam) => { + const { app, syncSystem } = params; + + const { eventBusArn } = syncSystem; + + const graphql = app.getModule(ApiGraphql); + const fileManager = app.getModule(ApiFileManager); + + const lambdaToEventBridgeResourceName = createSyncResourceName(`lambda-to-event-bridge`); + const eventBridgePolicy = app.addResource(aws.iam.Policy, { + name: `${lambdaToEventBridgeResourceName}-policy`, + config: { + description: + "This policy enables access from Webiny Lambdas to Sync System EventBridge.", + policy: { + Version: "2012-10-17", + Statement: [ + { + Sid: "PermissionForLambdaToEventBridge", + Effect: "Allow", + Action: "events:PutEvents", + Resource: [eventBusArn] + } + ] + } + } + }); + + const graphQlPolicyAttachment = app.addResource(aws.iam.RolePolicyAttachment, { + name: `${lambdaToEventBridgeResourceName}-graphql-role-policy-attachment`, + config: { + role: graphql.role.output.name, + policyArn: eventBridgePolicy.output.arn + } + }); + const fileManagerManagePolicyAttachment = app.addResource(aws.iam.RolePolicyAttachment, { + name: `${lambdaToEventBridgeResourceName}-fm-role-policy-attachment`, + config: { + role: fileManager.roles.manage.output.name, + policyArn: eventBridgePolicy.output.arn + } + }); + + return { + eventBridgePolicy, + graphQlPolicyAttachment, + fileManagerManagePolicyAttachment + }; +}; diff --git a/packages/pulumi-aws/src/apps/syncSystem/api/attachS3Permissions.ts b/packages/pulumi-aws/src/apps/syncSystem/api/attachS3Permissions.ts new file mode 100644 index 00000000000..58bb6f02142 --- /dev/null +++ b/packages/pulumi-aws/src/apps/syncSystem/api/attachS3Permissions.ts @@ -0,0 +1,59 @@ +import * as aws from "@pulumi/aws"; +import type { PulumiApp } from "@webiny/pulumi"; +import type { IGetSyncSystemOutputResult } from "~/apps/syncSystem/types.js"; +import type { CoreOutput } from "~/apps/common/CoreOutput.js"; +import { createSyncResourceName } from "~/apps/syncSystem/createSyncResourceName.js"; +import type { WithServiceManifest } from "~/utils/withServiceManifest.js"; + +export interface IAttachS3PermissionsParams { + app: PulumiApp & WithServiceManifest; + syncSystem: IGetSyncSystemOutputResult; + core: CoreOutput; +} + +export const attachS3Permissions = (params: IAttachS3PermissionsParams) => { + const { app, syncSystem, core } = params; + + const { lambdaRoleName } = syncSystem; + + const lambdaToS3ResourceName = createSyncResourceName(`lambda-to-s3-fm`); + + const s3Policy = app.addResource(aws.iam.Policy, { + name: `${lambdaToS3ResourceName}-policy`, + config: { + description: "This policy enables access from Sync System Lambda to Webiny S3.", + policy: { + Version: "2012-10-17", + Statement: [ + { + Sid: "PermissionForLambdaToS3", + Effect: "Allow", + Action: [ + "s3:DeleteObject", + "s3:PutObject", + "s3:GetObject", + "s3:ListBucket" + ], + Resource: [ + core.fileManagerBucketArn.apply(arn => arn), + core.fileManagerBucketArn.apply(arn => `${arn}/*`) + ] + } + ] + } + } + }); + + const s3PolicyAttachment = app.addResource(aws.iam.RolePolicyAttachment, { + name: `${lambdaToS3ResourceName}-policy-attachment`, + config: { + role: lambdaRoleName, + policyArn: s3Policy.output.arn + } + }); + + return { + s3Policy, + s3PolicyAttachment + }; +}; diff --git a/packages/pulumi-aws/src/apps/syncSystem/api/index.ts b/packages/pulumi-aws/src/apps/syncSystem/api/index.ts new file mode 100644 index 00000000000..f2fa68475a9 --- /dev/null +++ b/packages/pulumi-aws/src/apps/syncSystem/api/index.ts @@ -0,0 +1,57 @@ +import { getSyncSystemOutput } from "~/apps/syncSystem/getSyncSystemOutput.js"; +import { attachEventBusPermissions } from "./attachEventBusPermissions.js"; +import { attachDynamoDbPermissions } from "~/apps/syncSystem/api/attachDynamoDbPermissions.js"; +import { attachS3Permissions } from "~/apps/syncSystem/api/attachS3Permissions.js"; +import { addServiceManifest } from "~/apps/syncSystem/api/addServiceManifest.js"; +import type { PulumiApp } from "@webiny/pulumi/types"; +import type { CoreOutput } from "~/apps/common/CoreOutput.js"; +import type { WithServiceManifest } from "~/utils/withServiceManifest.js"; + +export interface IAttachSyncSystemParams { + app: PulumiApp & WithServiceManifest; + env: string; + core: CoreOutput; +} + +export const attachSyncSystem = (params: IAttachSyncSystemParams) => { + const { app, core, env } = params; + + const syncSystem = getSyncSystemOutput({ + env + }); + /** + * Possibly no sync system deployed - no need to do anything at that point. + * At this point, if sync system was deployed, and it is not anymore, all resources after this check will disappear. + */ + if (!syncSystem) { + console.log(`No Sync System deployed in env "${env}". Skipping...`); + return; + } + /** + * Permissions for Webiny system to access Sync System resources. + */ + attachEventBusPermissions({ + app, + syncSystem + }); + /** + * Permissions for Sync System to access Webiny system resources. + */ + attachDynamoDbPermissions({ + app, + syncSystem, + core + }); + attachS3Permissions({ + app, + syncSystem, + core + }); + /** + * Add the Service Manifest item to the Webiny system. + */ + addServiceManifest({ + app, + syncSystem + }); +}; diff --git a/packages/pulumi-aws/src/apps/syncSystem/constants.ts b/packages/pulumi-aws/src/apps/syncSystem/constants.ts new file mode 100644 index 00000000000..f6c03347034 --- /dev/null +++ b/packages/pulumi-aws/src/apps/syncSystem/constants.ts @@ -0,0 +1 @@ +export const APPS_SYNC_SYSTEM_PATH = "apps/sync"; diff --git a/packages/pulumi-aws/src/apps/syncSystem/createSyncResourceName.ts b/packages/pulumi-aws/src/apps/syncSystem/createSyncResourceName.ts new file mode 100644 index 00000000000..aa9928ff3e1 --- /dev/null +++ b/packages/pulumi-aws/src/apps/syncSystem/createSyncResourceName.ts @@ -0,0 +1,8 @@ +import kebabCase from "lodash/kebabCase"; + +/** + * Need to have standardized resource names. + */ +export const createSyncResourceName = (name: string) => { + return `sync-system-${kebabCase(name)}`; +}; diff --git a/packages/pulumi-aws/src/apps/syncSystem/createSyncSystemPulumiApp.ts b/packages/pulumi-aws/src/apps/syncSystem/createSyncSystemPulumiApp.ts index 23c862f6cb0..8afb30de36f 100644 --- a/packages/pulumi-aws/src/apps/syncSystem/createSyncSystemPulumiApp.ts +++ b/packages/pulumi-aws/src/apps/syncSystem/createSyncSystemPulumiApp.ts @@ -1,9 +1,13 @@ +import * as pulumi from "@pulumi/pulumi"; import { createPulumiApp, PulumiAppParam } from "@webiny/pulumi"; -import { SyncSystemDynamo } from "./SyncSystemDynamo"; -import { DEFAULT_PROD_ENV_NAMES } from "~/constants"; -import { SyncSystemSQS } from "./SyncSystemSQS"; -import { SyncSystemLambda } from "./SyncSystemLambda"; -import { addTableItems } from "./addTableItems"; +import { DEFAULT_PROD_ENV_NAMES } from "~/constants.js"; +import { SyncSystemSQS } from "./SyncSystemSQS.js"; +import { SyncSystemLambda } from "./SyncSystemLambda.js"; +import type { IGetSyncSystemOutputResult, PulumiOutput } from "./types.js"; +import { APPS_SYNC_SYSTEM_PATH } from "./constants.js"; +import { SyncSystemEventBus } from "./SyncSystemEventBus.js"; +import { customApp } from "./customApp.js"; +import { SyncSystemDynamoDb } from "~/apps/syncSystem/SyncSystemDynamoDb.js"; export type SyncSystemPulumiApp = ReturnType; @@ -63,51 +67,101 @@ export interface CreateSyncSystemPulumiAppParams { productionEnvironments?: PulumiAppParam; } -export function createSyncSystemPulumiApp(projectAppParams: CreateSyncSystemPulumiAppParams = {}) { +export function createSyncSystemPulumiApp(projectAppParams: CreateSyncSystemPulumiAppParams) { return createPulumiApp({ - name: "syncSystem", - path: "apps/syncSystem", + name: "sync", + path: APPS_SYNC_SYSTEM_PATH, config: projectAppParams, program: async app => { + const pulumiResourceNamePrefix = app.getParam( + projectAppParams.pulumiResourceNamePrefix + ); + if (pulumiResourceNamePrefix) { + app.onResource(resource => { + if (!resource.name.startsWith(pulumiResourceNamePrefix)) { + resource.name = `${pulumiResourceNamePrefix}${resource.name}`; + } + }); + } const productionEnvironments = app.params.create.productionEnvironments || DEFAULT_PROD_ENV_NAMES; const isProduction = productionEnvironments.includes(app.params.run.env); const protect = app.getParam(projectAppParams.protect) ?? isProduction; - - const dynamoDbTable = app.addModule(SyncSystemDynamo, { - protect - }); - - const sqs = app.addModule(SyncSystemSQS, { + const regionApp = customApp({ + app, protect }); - - app.addModule(SyncSystemLambda, { - protect, - config: { - // TODO - } - }); /** - * Add + * Sync System services. */ - addTableItems({ - app, - table: dynamoDbTable, - items: {} - }); + const sqs = regionApp.addModule(SyncSystemSQS); + const dynamoDb = regionApp.addModule(SyncSystemDynamoDb); - return { + const lambda = regionApp.addModule(SyncSystemLambda); + const { eventBusRule, eventBus, eventBusTarget, eventBusPolicy } = + regionApp.addModule(SyncSystemEventBus); + + const output: PulumiOutput = { + /** + * Region provider. + */ + region: pulumi.output(process.env.AWS_REGION as string), /** - * Sync System resources. + * SyncSystemSQS */ - dynamodbTable: dynamoDbTable, - dynamodbTableArn: dynamoDbTable.output.arn, - dynamodbTableName: dynamoDbTable.output.name, - dynamodbTableHashKey: dynamoDbTable.output.hashKey, - dynamodbTableRangeKey: dynamoDbTable.output.rangeKey, - sqs, + sqsUrl: sqs.output.url, sqsArn: sqs.output.arn, + sqsName: sqs.output.name, + /** + * DynamoDB + */ + dynamoDbArn: dynamoDb.output.arn, + dynamoDbName: dynamoDb.output.name, + dynamoDbHashKey: dynamoDb.output.hashKey, + dynamoDbRangeKey: dynamoDb.output.rangeKey as pulumi.Output, + /** + * SyncSystemLambda + */ + lambdaArn: lambda.lambda.output.arn, + lambdaName: lambda.lambda.output.name, + lambdaRoleArn: lambda.role.output.arn, + lambdaRoleName: lambda.role.output.name, + lambdaRoleId: lambda.role.output.id, + lambdaPolicyArn: lambda.policy.output.arn, + lambdaPolicyName: lambda.policy.output.name, + lambdaPolicyId: lambda.policy.output.id, + lambdaEventSourceMappingArn: lambda.eventSourceMapping.output.arn, + lambdaEventSourceMappingId: lambda.eventSourceMapping.output.id, + /** + * We can safely cast as we know that the property exists. + */ + lambdaEventSourceMappingEventSourceArn: lambda.eventSourceMapping.output + .eventSourceArn as pulumi.Output, + /** + * SyncSystemEventBus + */ + eventBusArn: eventBus.output.arn, + eventBusName: eventBus.output.name, + eventBusRuleArn: eventBusRule.output.arn, + eventBusRuleName: eventBusRule.output.id, + eventBusTargetArn: eventBusTarget.output.arn, + eventBusPolicyId: eventBusPolicy.output.id, + eventBusPolicyUrn: eventBusPolicy.output.urn, + eventBusPolicyQueueUrl: eventBusPolicy.output.queueUrl + }; + app.addOutputs(output); + + return { + sqs: sqs.output, + dynamoDb: dynamoDb.output, + eventBus: eventBus.output, + eventBusRule: eventBusRule.output, + eventBusTarget: eventBusTarget.output, + eventBusPolicy: eventBusPolicy.output, + lambda: lambda.lambda.output, + lambdaRole: lambda.role.output, + lambdaPolicy: lambda.policy.output, + lambdaEventSourceMapping: lambda.eventSourceMapping.output, /** * Systems we are connecting together. */ diff --git a/packages/pulumi-aws/src/apps/syncSystem/customApp.ts b/packages/pulumi-aws/src/apps/syncSystem/customApp.ts new file mode 100644 index 00000000000..b52b8a9ecd7 --- /dev/null +++ b/packages/pulumi-aws/src/apps/syncSystem/customApp.ts @@ -0,0 +1,24 @@ +import type { PulumiApp } from "@webiny/pulumi"; + +export interface IAppWithRegionParams { + app: PulumiApp; + protect?: boolean; +} + +export const customApp = (params: IAppWithRegionParams) => { + const { app, protect } = params; + + const initialAddResource = app.addResource; + + app.addResource = (resource, params) => { + return initialAddResource(resource, { + ...params, + opts: { + protect, + ...params.opts + } + }); + }; + + return app; +}; diff --git a/packages/pulumi-aws/src/apps/syncSystem/getSyncSystemOutput.ts b/packages/pulumi-aws/src/apps/syncSystem/getSyncSystemOutput.ts new file mode 100644 index 00000000000..8cbb3d245b9 --- /dev/null +++ b/packages/pulumi-aws/src/apps/syncSystem/getSyncSystemOutput.ts @@ -0,0 +1,28 @@ +import { getStackOutput } from "@webiny/cli-plugin-deploy-pulumi/utils/index.js"; +import { APPS_SYNC_SYSTEM_PATH } from "./constants.js"; +import type { IGetSyncSystemOutputResult } from "~/apps/syncSystem/types.js"; + +export interface IGetSyncSystemOutputParams { + env: string; +} + +export const getSyncSystemOutput = (params: IGetSyncSystemOutputParams) => { + return getStackOutput({ + env: params.env, + /** + * Sync System cannot have a variant, only env. + */ + variant: undefined, + folder: APPS_SYNC_SYSTEM_PATH + }); +}; + +export const asyncGetSyncSystemOutput = async ( + params: IGetSyncSystemOutputParams +): Promise => { + return new Promise(resolve => { + const value = getSyncSystemOutput(params); + + return resolve(value); + }); +}; diff --git a/packages/pulumi-aws/src/apps/syncSystem/lambda/createSyncSystemInputLambdaPolicy.ts b/packages/pulumi-aws/src/apps/syncSystem/lambda/createSyncSystemInputLambdaPolicy.ts new file mode 100644 index 00000000000..f2986061cde --- /dev/null +++ b/packages/pulumi-aws/src/apps/syncSystem/lambda/createSyncSystemInputLambdaPolicy.ts @@ -0,0 +1,107 @@ +import * as aws from "@pulumi/aws"; +import type { PulumiApp } from "@webiny/pulumi"; +import { SyncSystemSQS } from "../SyncSystemSQS.js"; +import { SyncSystemDynamoDb } from "../SyncSystemDynamoDb.js"; + +interface ICreateSyncSystemLambdaPolicyParams { + name: string; + app: PulumiApp; +} + +export function createSyncSystemInputLambdaPolicy(params: ICreateSyncSystemLambdaPolicyParams) { + const { app } = params; + const sqs = app.getModule(SyncSystemSQS); + const dynamoDb = app.getModule(SyncSystemDynamoDb); + + const policy: aws.iam.PolicyDocument = { + Version: "2012-10-17", + Statement: [ + { + Sid: "PermissionForSQS", + Effect: "Allow", + Action: [ + "sqs:SendMessage", + "sqs:SendMessageBatch", + "sqs:ReceiveMessage", + "sqs:DeleteMessage", + "sqs:DeleteMessageBatch", + "sqs:ChangeMessageVisibility", + "sqs:ChangeMessageVisibilityBatch", + "sqs:GetQueueAttributes" + ], + Resource: [ + sqs.output.arn.apply(arn => `${arn}`), + sqs.output.arn.apply(arn => `${arn}/*`) + ] + }, + { + Sid: "PermissionForDynamoDb", + Effect: "Allow", + Action: [ + "dynamodb:BatchGetItem", + "dynamodb:BatchWriteItem", + "dynamodb:ConditionCheckItem", + "dynamodb:CreateBackup", + "dynamodb:CreateTable", + "dynamodb:CreateTableReplica", + "dynamodb:DeleteBackup", + "dynamodb:DeleteItem", + "dynamodb:DeleteTable", + "dynamodb:DeleteTableReplica", + "dynamodb:DescribeBackup", + "dynamodb:DescribeContinuousBackups", + "dynamodb:DescribeContributorInsights", + "dynamodb:DescribeExport", + "dynamodb:DescribeKinesisStreamingDestination", + "dynamodb:DescribeLimits", + "dynamodb:DescribeReservedCapacity", + "dynamodb:DescribeReservedCapacityOfferings", + "dynamodb:DescribeStream", + "dynamodb:DescribeTable", + "dynamodb:DescribeTableReplicaAutoScaling", + "dynamodb:DescribeTimeToLive", + "dynamodb:DisableKinesisStreamingDestination", + "dynamodb:EnableKinesisStreamingDestination", + "dynamodb:ExportTableToPointInTime", + "dynamodb:GetItem", + "dynamodb:GetRecords", + "dynamodb:GetShardIterator", + "dynamodb:ListBackups", + "dynamodb:ListContributorInsights", + "dynamodb:ListExports", + "dynamodb:ListStreams", + "dynamodb:ListTables", + "dynamodb:ListTagsOfResource", + "dynamodb:PartiQLDelete", + "dynamodb:PartiQLInsert", + "dynamodb:PartiQLSelect", + "dynamodb:PartiQLUpdate", + "dynamodb:PurchaseReservedCapacityOfferings", + "dynamodb:PutItem", + "dynamodb:Query", + "dynamodb:RestoreTableFromBackup", + "dynamodb:RestoreTableToPointInTime", + "dynamodb:Scan", + "dynamodb:UpdateContinuousBackups", + "dynamodb:UpdateContributorInsights", + "dynamodb:UpdateItem", + "dynamodb:UpdateTable", + "dynamodb:UpdateTableReplicaAutoScaling", + "dynamodb:UpdateTimeToLive" + ], + Resource: [ + dynamoDb.output.arn.apply(arn => `${arn}`), + dynamoDb.output.arn.apply(arn => `${arn}/*`) + ] + } + ] + }; + + return app.addResource(aws.iam.Policy, { + name: params.name, + config: { + description: "This policy enables access to DynamoDb and SQS.", + policy + } + }); +} diff --git a/packages/pulumi-aws/src/apps/syncSystem/types.ts b/packages/pulumi-aws/src/apps/syncSystem/types.ts new file mode 100644 index 00000000000..6b70443db36 --- /dev/null +++ b/packages/pulumi-aws/src/apps/syncSystem/types.ts @@ -0,0 +1,50 @@ +import * as pulumi from "@pulumi/pulumi"; +import type { IStackOutput } from "@webiny/cli-plugin-deploy-pulumi/utils/index.js"; + +export type PulumiOutput = { + [K in keyof T]: pulumi.Output; +}; + +export interface IGetSyncSystemOutputResult extends IStackOutput { + /** + * createRegionProvider + */ + region: string; + /** + * SyncSystemSQS + */ + sqsUrl: string; + sqsArn: string; + sqsName: string; + /** + * DynamoDb + */ + dynamoDbArn: string; + dynamoDbName: string; + dynamoDbHashKey: string; + dynamoDbRangeKey: string; + /** + * SyncSystemLambda + */ + lambdaArn: string; + lambdaName: string; + lambdaRoleArn: string; + lambdaRoleName: string; + lambdaRoleId: string; + lambdaPolicyArn: string; + lambdaPolicyName: string; + lambdaPolicyId: string; + lambdaEventSourceMappingId: string; + lambdaEventSourceMappingArn: string; + lambdaEventSourceMappingEventSourceArn: string; + /** + * SyncSystemEventBus + */ + eventBusArn: string; + eventBusName: string; + eventBusRuleArn: string; + eventBusRuleName: string; + eventBusTargetArn: string; + eventBusPolicyUrn: string; + eventBusPolicyQueueUrl: string; +} diff --git a/packages/pulumi-aws/src/enterprise/createSyncSystemPulumiApp.ts b/packages/pulumi-aws/src/enterprise/createSyncSystemPulumiApp.ts index 8008e76c5f7..25b2ac1ad5c 100644 --- a/packages/pulumi-aws/src/enterprise/createSyncSystemPulumiApp.ts +++ b/packages/pulumi-aws/src/enterprise/createSyncSystemPulumiApp.ts @@ -20,7 +20,7 @@ export interface CreateSyncSystemPulumiAppParams vpc?: PulumiAppParam; } -export function createSyncSystemPulumiApp(projectAppParams: CreateSyncSystemPulumiAppParams = {}) { +export function createSyncSystemPulumiApp(projectAppParams: CreateSyncSystemPulumiAppParams) { return baseCreateSyncSystemPulumiApp({ ...projectAppParams, // If using existing VPC, we ensure `vpc` param is set to `false`. diff --git a/packages/pulumi-aws/src/utils/createAssetArchive.ts b/packages/pulumi-aws/src/utils/createAssetArchive.ts new file mode 100644 index 00000000000..3dc8cfaabe4 --- /dev/null +++ b/packages/pulumi-aws/src/utils/createAssetArchive.ts @@ -0,0 +1,7 @@ +import * as pulumi from "@pulumi/pulumi"; + +export const createAssetArchive = (target: string) => { + return new pulumi.asset.AssetArchive({ + ".": new pulumi.asset.FileArchive(target) + }); +}; diff --git a/packages/serverless-cms-aws/package.json b/packages/serverless-cms-aws/package.json index 7b37ae58689..fcabd7f268e 100644 --- a/packages/serverless-cms-aws/package.json +++ b/packages/serverless-cms-aws/package.json @@ -43,6 +43,7 @@ "@webiny/api-prerendering-service-so-ddb": "0.0.0", "@webiny/api-security": "0.0.0", "@webiny/api-security-so-ddb": "0.0.0", + "@webiny/api-sync-system": "0.0.0", "@webiny/api-tenancy": "0.0.0", "@webiny/api-tenancy-so-ddb": "0.0.0", "@webiny/aws-sdk": "0.0.0", diff --git a/packages/serverless-cms-aws/src/createSyncSystemApp.ts b/packages/serverless-cms-aws/src/createSyncSystemApp.ts new file mode 100644 index 00000000000..8a733e5dcc3 --- /dev/null +++ b/packages/serverless-cms-aws/src/createSyncSystemApp.ts @@ -0,0 +1,28 @@ +import type { CreateSyncSystemPulumiAppParams } from "@webiny/pulumi-aws/apps/syncSystem/createSyncSystemPulumiApp.js"; +import { createSyncSystemPulumiApp } from "@webiny/pulumi-aws/apps/syncSystem/createSyncSystemPulumiApp.js"; +import type { PluginCollection } from "@webiny/plugins/types"; + +export interface CreateSyncSystemAppParams extends CreateSyncSystemPulumiAppParams { + plugins?: PluginCollection; +} + +export function createSyncSystemApp(projectAppParams: CreateSyncSystemAppParams) { + const plugins = projectAppParams.plugins ? [...projectAppParams.plugins] : []; + + return { + id: "sync", + name: "Sync System", + description: "Your project's Sync System.", + cli: { + // Default args for the "yarn webiny watch ..." command (we don't need the deploy option while developing). + watch: { + // We disable local development for all AWS Lambda functions. + // This can be changed down the line by passing another set of values + // to the "watch" command (for example `-f ps-render-subscriber`). + function: "none" + } + }, + pulumi: createSyncSystemPulumiApp(projectAppParams), + plugins: plugins.concat([]) + }; +} diff --git a/packages/serverless-cms-aws/src/enterprise/createApiApp.ts b/packages/serverless-cms-aws/src/enterprise/createApiApp.ts index a609453423b..a3b7759ac1e 100644 --- a/packages/serverless-cms-aws/src/enterprise/createApiApp.ts +++ b/packages/serverless-cms-aws/src/enterprise/createApiApp.ts @@ -8,6 +8,7 @@ import { generateDdbHandlers, injectWcpTelemetryClientCode } from "~/api/plugins"; +import { createSyncSystemPlugins } from "./sync/plugins.js"; export { ApiOutput } from "@webiny/pulumi-aws"; @@ -20,7 +21,8 @@ export function createApiApp(projectAppParams: CreateApiAppParams = {}) { ensureCoreDeployed, injectWcpTelemetryClientCode, generateCommonHandlers, - executeDataMigrations + executeDataMigrations, + createSyncSystemPlugins() ]; if (projectAppParams.elasticSearch || projectAppParams.openSearch) { diff --git a/packages/serverless-cms-aws/src/enterprise/sync/plugins.ts b/packages/serverless-cms-aws/src/enterprise/sync/plugins.ts new file mode 100644 index 00000000000..c2c876bff02 --- /dev/null +++ b/packages/serverless-cms-aws/src/enterprise/sync/plugins.ts @@ -0,0 +1,132 @@ +import { Plugin } from "@webiny/plugins"; +import { + createAfterDeployPlugin, + createAfterDestroyPlugin +} from "@webiny/cli-plugin-deploy-pulumi/plugins/index.js"; +import { DeleteCommand, getDocumentClient, PutCommand } from "@webiny/aws-sdk/client-dynamodb"; +import { getSyncSystemOutput } from "@webiny/pulumi-aws/apps/syncSystem/getSyncSystemOutput.js"; +import { getStackOutput } from "@webiny/cli-plugin-deploy-pulumi/utils/index.js"; +import { createSystemName } from "@webiny/api-sync-system/utils/createSystemName.js"; + +interface IGetStacksParams { + env: string; + variant: string | undefined; +} + +const getStacks = async (params: IGetStacksParams) => { + const { env, variant } = params; + const syncSystem = getSyncSystemOutput({ + env + }); + if (!syncSystem) { + return { + syncSystem: null + }; + } + const core = getStackOutput({ + env, + variant, + folder: "apps/core" + }); + if (!core) { + return { + syncSystem, + core: null + }; + } + return { + syncSystem, + core + }; +}; +/** + * Note that the plugins will only have effect if the Sync System is deployed in same env as the API system. + */ +export const createSyncSystemPlugins = (): Plugin[] => { + return [ + /** + * After deployment of API system, we need to write the deployment information to the Sync System DynamoDB table. + * This way Sync System will know which deployments exist. + */ + createAfterDeployPlugin(async ({ env, variant }) => { + const { syncSystem, core } = await getStacks({ env, variant }); + if (!syncSystem || !core) { + return; + } + const client = getDocumentClient({ + region: syncSystem.region + }); + const tableName = syncSystem.dynamoDbName; + if (!tableName) { + throw new Error("Sync System DynamoDB table name is not defined."); + } + + const item = { + name: createSystemName({ env, variant }), + env, + variant, + version: process.env.WEBINY_VERSION, + region: core.region, + s3Id: core.fileManagerBucketId, + s3Arn: core.fileManagerBucketArn, + primaryDynamoDbArn: core.primaryDynamodbTableArn, + primaryDynamoDbName: core.primaryDynamodbTableName, + primaryDynamoDbHashKey: core.primaryDynamodbTableHashKey, + primaryDynamoDbRangeKey: core.primaryDynamodbTableRangeKey, + elasticsearchDynamodbTableArn: core.elasticsearchDynamodbTableArn, + elasticsearchDynamodbTableName: core.elasticsearchDynamodbTableName, + logDynamodbTableArn: core.logDynamodbTableArn, + logDynamodbTableName: core.logDynamodbTableName + }; + + const cmd = new PutCommand({ + TableName: tableName, + Item: { + PK: `DEPLOYMENT#${env}#${variant || "unknown"}`, + SK: `default`, + GSI1_PK: "DEPLOYMENTS", + GSI1_SK: `${env}#${variant || "unknown"}`, + item + } + }); + try { + await client.send(cmd); + } catch (ex) { + console.error("Error while writing to Sync System DynamoDB table."); + console.log(ex.message); + throw ex; + } + }), + /** + * After destroy of the deployment, we need to delete the deployment information from the Sync System DynamoDB table. + */ + createAfterDestroyPlugin(async ({ env, variant }) => { + const { syncSystem, core } = await getStacks({ env, variant }); + if (!syncSystem || !core) { + return; + } + const client = getDocumentClient({ + region: syncSystem.region + }); + const tableName = syncSystem.dynamoDbName; + if (!tableName) { + throw new Error("Sync System DynamoDB table name is not defined."); + } + + const cmd = new DeleteCommand({ + TableName: tableName, + Key: { + PK: "DEPLOYMENTS", + SK: `${env}#${variant || "unknown"}` + } + }); + try { + await client.send(cmd); + } catch (ex) { + console.error("Error while deleting from Sync System DynamoDB table."); + console.log(ex.message); + throw ex; + } + }) + ]; +}; diff --git a/packages/serverless-cms-aws/src/index.ts b/packages/serverless-cms-aws/src/index.ts index dda34133e8e..2795f2b6f39 100644 --- a/packages/serverless-cms-aws/src/index.ts +++ b/packages/serverless-cms-aws/src/index.ts @@ -10,4 +10,5 @@ export * from "./createWebsiteAppConfig"; // -export * from "./createBlueGreenApp"; +export * from "./createBlueGreenApp.js"; +export * from "./createSyncSystemApp.js"; diff --git a/packages/serverless-cms-aws/tsconfig.build.json b/packages/serverless-cms-aws/tsconfig.build.json index 3bfa5088b8f..b75a289dd67 100644 --- a/packages/serverless-cms-aws/tsconfig.build.json +++ b/packages/serverless-cms-aws/tsconfig.build.json @@ -30,6 +30,7 @@ { "path": "../api-prerendering-service-so-ddb/tsconfig.build.json" }, { "path": "../api-security/tsconfig.build.json" }, { "path": "../api-security-so-ddb/tsconfig.build.json" }, + { "path": "../api-sync-system/tsconfig.build.json" }, { "path": "../api-tenancy/tsconfig.build.json" }, { "path": "../api-tenancy-so-ddb/tsconfig.build.json" }, { "path": "../aws-sdk/tsconfig.build.json" }, diff --git a/packages/serverless-cms-aws/tsconfig.json b/packages/serverless-cms-aws/tsconfig.json index 035298374e0..77e3d351cbe 100644 --- a/packages/serverless-cms-aws/tsconfig.json +++ b/packages/serverless-cms-aws/tsconfig.json @@ -30,6 +30,7 @@ { "path": "../api-prerendering-service-so-ddb" }, { "path": "../api-security" }, { "path": "../api-security-so-ddb" }, + { "path": "../api-sync-system" }, { "path": "../api-tenancy" }, { "path": "../api-tenancy-so-ddb" }, { "path": "../aws-sdk" }, @@ -111,6 +112,8 @@ "@webiny/api-security": ["../api-security/src"], "@webiny/api-security-so-ddb/*": ["../api-security-so-ddb/src/*"], "@webiny/api-security-so-ddb": ["../api-security-so-ddb/src"], + "@webiny/api-sync-system/*": ["../api-sync-system/src/*"], + "@webiny/api-sync-system": ["../api-sync-system/src"], "@webiny/api-tenancy/*": ["../api-tenancy/src/*"], "@webiny/api-tenancy": ["../api-tenancy/src"], "@webiny/api-tenancy-so-ddb/*": ["../api-tenancy-so-ddb/src/*"], diff --git a/packages/utils/src/exception.ts b/packages/utils/src/exception.ts new file mode 100644 index 00000000000..87da341b976 --- /dev/null +++ b/packages/utils/src/exception.ts @@ -0,0 +1,16 @@ +import type { GenericRecord } from "~/GenericRecord.js"; + +/** + * This will help with output of the error object. + * Normally, the error object is not serializable, so we need to convert it to a plain object. + */ +export const convertException = (error: Error, remove?: string[]): GenericRecord => { + const properties = Object.getOwnPropertyNames(error) as (keyof Error)[]; + return properties.reduce((items, property) => { + if (remove && remove.includes(property)) { + return items; + } + items[property] = error[property]; + return items; + }, {}); +}; diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index cd95549c724..435cf5cc222 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,5 +1,6 @@ export * from "~/parseIdentifier"; export * from "~/zeroPad"; +export * from "~/exception.js"; export * from "~/createIdentifier"; export * from "~/cursor"; export * from "~/headers"; diff --git a/webiny.project.ts b/webiny.project.ts index 9c5f0cd687d..6179ab91f72 100644 --- a/webiny.project.ts +++ b/webiny.project.ts @@ -50,6 +50,7 @@ export default { }, appAliases: { blueGreen: "apps/blueGreen", + sync: "apps/sync", core: "apps/core", api: "apps/api", admin: "apps/admin", diff --git a/yarn.lock b/yarn.lock index 072b654c7fc..b3a07957f62 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14852,6 +14852,31 @@ __metadata: languageName: unknown linkType: soft +"@webiny/api-sync-system@npm:0.0.0, @webiny/api-sync-system@workspace:packages/api-sync-system": + version: 0.0.0-use.local + resolution: "@webiny/api-sync-system@workspace:packages/api-sync-system" + dependencies: + "@faker-js/faker": "npm:^9.3.0" + "@types/lodash": "npm:^4.17.13" + "@webiny/api": "npm:0.0.0" + "@webiny/aws-sdk": "npm:0.0.0" + "@webiny/cli": "npm:0.0.0" + "@webiny/error": "npm:0.0.0" + "@webiny/handler": "npm:0.0.0" + "@webiny/handler-aws": "npm:0.0.0" + "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" + "@webiny/utils": "npm:0.0.0" + jest: "npm:^29.7.0" + jest-dynalite: "npm:^3.6.1" + lodash: "npm:^4.17.21" + rimraf: "npm:^6.0.1" + semver: "npm:^7.6.3" + typescript: "npm:5.3.3" + zod: "npm:^3.23.8" + languageName: unknown + linkType: soft + "@webiny/api-tenancy-so-ddb@npm:0.0.0, @webiny/api-tenancy-so-ddb@workspace:packages/api-tenancy-so-ddb": version: 0.0.0-use.local resolution: "@webiny/api-tenancy-so-ddb@workspace:packages/api-tenancy-so-ddb" @@ -17347,6 +17372,7 @@ __metadata: "@webiny/api-prerendering-service-so-ddb": "npm:0.0.0" "@webiny/api-security": "npm:0.0.0" "@webiny/api-security-so-ddb": "npm:0.0.0" + "@webiny/api-sync-system": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-tenancy-so-ddb": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" @@ -18364,6 +18390,7 @@ __metadata: "@webiny/api-security-cognito": "npm:0.0.0" "@webiny/api-security-so-ddb": "npm:0.0.0" "@webiny/api-serverless-cms": "npm:0.0.0" + "@webiny/api-sync-system": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-tenancy-so-ddb": "npm:0.0.0" "@webiny/api-tenant-manager": "npm:0.0.0" @@ -29030,7 +29057,7 @@ __metadata: languageName: node linkType: hard -"jest-resolve@npm:^29.7.0": +"jest-resolve@npm:^29.5.0, jest-resolve@npm:^29.7.0": version: 29.7.0 resolution: "jest-resolve@npm:29.7.0" dependencies: @@ -37175,6 +37202,7 @@ __metadata: semver: "npm:^7.6.3" ts-expect: "npm:^1.3.0" ts-jest: "npm:29.1.5" + ts-jest-resolver: "npm:^2.0.1" ts-node: "npm:^10.9.2" type-fest: "npm:4.14.0" typescript: "npm:5.3.3" @@ -39706,6 +39734,15 @@ __metadata: languageName: node linkType: hard +"ts-jest-resolver@npm:^2.0.1": + version: 2.0.1 + resolution: "ts-jest-resolver@npm:2.0.1" + dependencies: + jest-resolve: "npm:^29.5.0" + checksum: 10/0845b9ab6a7d5c7b872e7573550607e9da1a2281c4db7a9d900c52b518bf5237ca265d56356b2ebb6d5aad705613e55e406c0eb66cad60ab2a303d17e6b0844e + languageName: node + linkType: hard + "ts-jest@npm:29.1.5": version: 29.1.5 resolution: "ts-jest@npm:29.1.5"