From d3617f3a1e138ad7ed408694283a5ebaf91f0476 Mon Sep 17 00:00:00 2001 From: Pavel Denisjuk Date: Wed, 3 Sep 2025 17:28:15 +0200 Subject: [PATCH 01/13] wip: migrate tests to vitest --- .../wac/utils/listPackagesWithJestTests.ts | 136 +- .prettierignore | 1 - jest-es-config.js | 9 - jest.config.base.js | 3 +- jest.config.base.setup.js | 1 + package.json | 14 +- packages/api-file-manager-s3/jest.config.js | 5 - .../src/utils/FileKey.test.ts | 1 + packages/api-file-manager-s3/vitest.config.ts | 10 + .../__tests__/getI18NInformation.test.ts | 7 +- packages/api-i18n/__tests__/helpers.ts | 18 +- .../__tests__/locale.lifecycle.test.ts | 1 + packages/api-i18n/__tests__/locales.test.ts | 1 + packages/api-i18n/__tests__/system.test.ts | 1 + packages/api-i18n/jest.setup.js | 10 - packages/api-i18n/vitest.setup.ts | 12 + .../converter/ParsedPath.test.ts | 1 + .../converter/PathsParser.test.ts | 1 + .../converter/SelectionFormatter.test.ts | 1 + packages/api-page-builder/vitest.setup.ts | 15 + packages/api-security-so-ddb/.typedoc.json | 4 - packages/api-security/jest.setup.js | 14 - packages/api-security/tsconfig.json | 2 +- packages/api-security/vitest.setup.ts | 14 + packages/api-tenancy-so-ddb/.typedoc.json | 4 - packages/api-tenancy/jest.setup.js | 9 - packages/api-tenancy/tsconfig.json | 2 +- packages/api-tenancy/vitest.setup.ts | 11 + packages/app-aco/jest.config.js | 5 - .../AdvancedSearchPresenter.test.ts | 38 +- .../AdvancedSearch/GraphQLInputMapper.test.ts | 1 + .../QueryBuilderDrawerPresenter.test.tsx | 9 +- .../QuerySaverDialogPresenter.test.ts | 6 +- .../ColumnsVisibilityPresenter.test.ts | 12 +- .../Table/Columns/ColumnsPresenter.test.ts | 3 +- .../folders/createFolder/CreateFolder.test.ts | 4 +- .../folders/deleteFolder/DeleteFolder.test.ts | 4 +- .../GetDescendantFolders.test.ts | 1 + .../GetFolderExtensionsFields.test.ts | 1 + .../GetFolderHierarchy.test.ts | 34 +- .../GetFolderLevelPermission.test.ts | 1 + .../getFolderModel/GetFolderModel.test.ts | 12 +- .../folders/listFolders/ListFolders.test.ts | 28 +- .../ListFoldersByParentIds.test.ts | 40 +- .../folders/updateFolder/UpdateFolder.test.ts | 14 +- packages/app-aco/tsconfig.json | 2 +- packages/app-aco/vitest.config.ts | 5 + .../components/BulkActions/Worker.test.ts | 6 +- packages/app-admin/jest.config.js | 5 - .../IconPicker/IconPickerPresenter.test.ts | 1 + .../IconPicker/IconRepository.test.ts | 1 + packages/app-admin/vitest.config.ts | 5 + packages/app-file-manager/jest.config.js | 5 - .../ActionEdit/ActionEditPresenter.test.ts | 4 +- .../BatchEditorDialogPresenter.test.ts | 8 +- .../BatchEditorDialogPresenter.tsx | 2 +- .../ActionEdit/GraphQLInputMapper.test.ts | 1 + packages/app-file-manager/vitest.config.ts | 5 + packages/app-headless-cms/jest.config.js | 5 - .../components/RefPresenter.test.ts | 12 +- packages/app-headless-cms/vitest.config.ts | 5 + packages/app-page-builder/jest.config.js | 5 - .../{__tests__ => }/mediaToContainer.test.ts | 3 +- packages/app-page-builder/vitest.config.ts | 5 + packages/app-trash-bin/jest.config.js | 5 - .../Presentation/TrashBin/TrashBin.test.ts | 22 +- packages/app-trash-bin/vitest.config.ts | 5 + packages/cli/jest.config.js | 5 - packages/form/__tests__/form.test.tsx | 44 +- packages/form/__tests__/setupEnv.ts | 2 - packages/form/jest.config.js | 6 - packages/form/src/FormPresenter.test.ts | 10 +- packages/form/vitest.config.ts | 11 + .../__tests__/htmlToLexicalState.test.ts | 5 +- .../__tests__/stateTransformer.test.ts | 5 +- packages/lexical-converter/jest.config.js | 11 - packages/lexical-converter/tsconfig.json | 2 +- packages/lexical-converter/vitest.config.ts | 20 + .../project-utils/testing/dynalite/index.js | 2 +- .../project-utils/testing/presets/index.d.ts | 6 + .../project-utils/testing/presets/index.js | 2 +- .../tasks/__tests__/crud/definitions.test.ts | 1 + packages/tasks/__tests__/crud/store.test.ts | 1 + packages/tasks/__tests__/crud/trigger.test.ts | 1 + .../__tests__/graphql/definitions.test.ts | 1 + packages/tasks/__tests__/graphql/logs.test.ts | 1 + .../tasks/__tests__/graphql/tasks.test.ts | 1 + .../tasks/__tests__/response/response.test.ts | 1 + .../runner/taskEventValidation.test.ts | 1 + .../__tests__/runner/taskRunnerAbort.test.ts | 1 + .../__tests__/runner/taskRunnerCreate.test.ts | 1 + .../runner/taskRunnerErrorFailedState.test.ts | 1 + .../taskRunnerErrorSuccessState.test.ts | 1 + .../runner/taskRunnerSuccess.test.ts | 1 + .../runner/taskRunnerTaskNotFound.test.ts | 1 + .../runner/taskTenantAndLocale.test.ts | 1 + packages/tasks/__tests__/task/input.test.ts | 1 + packages/tasks/__tests__/task/plugin.test.ts | 1 + packages/tasks/jest.setup.js | 11 - packages/tasks/tsconfig.json | 2 +- packages/tasks/vitest.setup.ts | 16 + .../ui/src/Input/__tests__/Input.test.tsx | 90 - packages/utils/__tests__/compose.test.ts | 1 + .../utils/__tests__/compression/gzip.test.ts | 1 + .../__tests__/compression/jsonpack.test.ts | 1 + .../utils/__tests__/createIdentifier.test.ts | 1 + .../utils/__tests__/createZodError.test.ts | 1 + packages/utils/__tests__/cursor.test.ts | 1 + packages/utils/__tests__/generateId.test.ts | 1 + packages/utils/__tests__/headers.test.ts | 1 + .../utils/__tests__/parseIdentifier.test.ts | 1 + packages/utils/__tests__/zeroPad.test.ts | 1 + packages/utils/jest.config.js | 5 - packages/utils/tsconfig.json | 2 +- packages/utils/vitest.config.ts | 10 + packages/validation/__tests__/create.test.js | 1 + .../validation/__tests__/creditCard.test.js | 1 + packages/validation/__tests__/dateGte.test.js | 1 + packages/validation/__tests__/dateLte.test.js | 1 + packages/validation/__tests__/email.test.js | 1 + packages/validation/__tests__/empty.test.js | 1 + packages/validation/__tests__/eq.test.js | 1 + packages/validation/__tests__/errors.test.js | 1 + packages/validation/__tests__/gt.test.js | 1 + packages/validation/__tests__/gte.test.js | 1 + packages/validation/__tests__/in.test.js | 1 + packages/validation/__tests__/integer.test.js | 1 + .../__tests__/invalidValidators.test.js | 1 + packages/validation/__tests__/json.test.js | 1 + packages/validation/__tests__/lt.test.js | 1 + packages/validation/__tests__/lte.test.js | 1 + .../validation/__tests__/maxLength.test.js | 1 + .../validation/__tests__/minLength.test.js | 1 + .../__tests__/multipleValidators.test.js | 1 + packages/validation/__tests__/number.test.js | 1 + packages/validation/__tests__/numeric.test.js | 1 + .../validation/__tests__/password.test.js | 1 + packages/validation/__tests__/phone.test.js | 1 + .../validation/__tests__/required.test.js | 1 + packages/validation/__tests__/slug.test.js | 1 + .../__tests__/syncAsyncValidation.test.js | 1 + packages/validation/__tests__/timeGte.test.js | 1 + packages/validation/__tests__/timeLte.test.js | 1 + packages/validation/__tests__/url.test.js | 1 + .../__tests__/validationError.test.js | 1 + .../__tests__/validatorRegistration.test.js | 1 + packages/validation/jest.config.js | 5 - packages/validation/tsconfig.json | 2 +- packages/validation/vitest.config.ts | 10 + testing/createTestConfig.ts | 75 + testing/index.ts | 1 + testing/setupFile.ts | 4 + testing/vitest.config.ts | 124 + testing/vitest.project.ts | 56 + typings/jest-extended/index.d.ts | 2 +- typings/vitest/index.d.ts | 8 + yarn.lock | 6116 ++++++++--------- 157 files changed, 3719 insertions(+), 3647 deletions(-) delete mode 100644 jest-es-config.js delete mode 100644 packages/api-file-manager-s3/jest.config.js create mode 100644 packages/api-file-manager-s3/vitest.config.ts delete mode 100644 packages/api-i18n/jest.setup.js create mode 100644 packages/api-i18n/vitest.setup.ts create mode 100644 packages/api-page-builder/vitest.setup.ts delete mode 100644 packages/api-security-so-ddb/.typedoc.json delete mode 100644 packages/api-security/jest.setup.js create mode 100644 packages/api-security/vitest.setup.ts delete mode 100644 packages/api-tenancy-so-ddb/.typedoc.json delete mode 100644 packages/api-tenancy/jest.setup.js create mode 100644 packages/api-tenancy/vitest.setup.ts delete mode 100644 packages/app-aco/jest.config.js create mode 100644 packages/app-aco/vitest.config.ts delete mode 100644 packages/app-admin/jest.config.js create mode 100644 packages/app-admin/vitest.config.ts delete mode 100644 packages/app-file-manager/jest.config.js create mode 100644 packages/app-file-manager/vitest.config.ts delete mode 100644 packages/app-headless-cms/jest.config.js create mode 100644 packages/app-headless-cms/vitest.config.ts delete mode 100644 packages/app-page-builder/jest.config.js rename packages/app-page-builder/src/editor/contexts/EditorPageElementsProvider/{__tests__ => }/mediaToContainer.test.ts (91%) create mode 100644 packages/app-page-builder/vitest.config.ts delete mode 100644 packages/app-trash-bin/jest.config.js create mode 100644 packages/app-trash-bin/vitest.config.ts delete mode 100644 packages/cli/jest.config.js delete mode 100644 packages/form/__tests__/setupEnv.ts delete mode 100644 packages/form/jest.config.js create mode 100644 packages/form/vitest.config.ts delete mode 100644 packages/lexical-converter/jest.config.js create mode 100644 packages/lexical-converter/vitest.config.ts create mode 100644 packages/project-utils/testing/presets/index.d.ts delete mode 100644 packages/tasks/jest.setup.js create mode 100644 packages/tasks/vitest.setup.ts delete mode 100644 packages/ui/src/Input/__tests__/Input.test.tsx delete mode 100644 packages/utils/jest.config.js create mode 100644 packages/utils/vitest.config.ts delete mode 100644 packages/validation/jest.config.js create mode 100644 packages/validation/vitest.config.ts create mode 100644 testing/createTestConfig.ts create mode 100644 testing/index.ts create mode 100644 testing/setupFile.ts create mode 100644 testing/vitest.config.ts create mode 100644 testing/vitest.project.ts create mode 100644 typings/vitest/index.d.ts diff --git a/.github/workflows/wac/utils/listPackagesWithJestTests.ts b/.github/workflows/wac/utils/listPackagesWithJestTests.ts index 6ec12ccb331..18d7f37ec47 100644 --- a/.github/workflows/wac/utils/listPackagesWithJestTests.ts +++ b/.github/workflows/wac/utils/listPackagesWithJestTests.ts @@ -42,38 +42,38 @@ const CUSTOM_HANDLERS: Record Array> = { "project-utils": () => [], "api-tenancy": () => { - return [{ cmd: "packages/api-tenancy --storage=ddb", storage: "ddb" }]; + return [{ cmd: "packages/api-tenancy -- --storage=ddb", storage: "ddb" }]; }, "api-security": () => { - return [{ cmd: "packages/api-security --storage=ddb", storage: "ddb" }]; + return [{ cmd: "packages/api-security -- --storage=ddb", storage: "ddb" }]; }, "api-security-cognito": () => { - return [{ cmd: "packages/api-security-cognito --storage=ddb", storage: "ddb" }]; + return [{ cmd: "packages/api-security-cognito -- --storage=ddb", storage: "ddb" }]; }, "api-i18n": () => { - return [{ cmd: "packages/api-i18n --storage=ddb", storage: "ddb" }]; + return [{ cmd: "packages/api-i18n -- --storage=ddb", storage: "ddb" }]; }, "api-tenant-manager": () => { - return [{ cmd: "packages/api-tenant-manager --storage=ddb", storage: "ddb" }]; + return [{ cmd: "packages/api-tenant-manager -- --storage=ddb", storage: "ddb" }]; }, "api-log": () => { - return [{ cmd: "packages/api-log --storage=ddb", storage: "ddb" }]; + return [{ cmd: "packages/api-log -- --storage=ddb", storage: "ddb" }]; }, "api-file-manager": () => { return [ - { cmd: "packages/api-file-manager --storage=ddb", storage: "ddb" }, + { cmd: "packages/api-file-manager -- --storage=ddb", storage: "ddb" }, { - cmd: "packages/api-file-manager --storage=ddb-es,ddb", + cmd: "packages/api-file-manager -- --storage=ddb-es,ddb", storage: "ddb-es" }, { - cmd: "packages/api-file-manager --storage=ddb-os,ddb", + cmd: "packages/api-file-manager -- --storage=ddb-os,ddb", storage: "ddb-os" } ]; @@ -81,13 +81,13 @@ const CUSTOM_HANDLERS: Record Array> = { "api-file-manager-aco": () => { return [ - { cmd: "packages/api-file-manager-aco --storage=ddb", storage: "ddb" }, + { cmd: "packages/api-file-manager-aco -- --storage=ddb", storage: "ddb" }, { - cmd: "packages/api-file-manager-aco --storage=ddb-es,ddb", + cmd: "packages/api-file-manager-aco -- --storage=ddb-es,ddb", storage: "ddb-es" }, { - cmd: "packages/api-file-manager-aco --storage=ddb-os,ddb", + cmd: "packages/api-file-manager-aco -- --storage=ddb-os,ddb", storage: "ddb-os" } ]; @@ -95,20 +95,20 @@ const CUSTOM_HANDLERS: Record Array> = { "api-form-builder": () => { return [ - { cmd: "packages/api-form-builder --storage=ddb-es,ddb", storage: "ddb-es" }, - { cmd: "packages/api-form-builder --storage=ddb-os,ddb", storage: "ddb-os" }, - { cmd: "packages/api-form-builder --storage=ddb", storage: "ddb" } + { cmd: "packages/api-form-builder -- --storage=ddb-es,ddb", storage: "ddb-es" }, + { cmd: "packages/api-form-builder -- --storage=ddb-os,ddb", storage: "ddb-os" }, + { cmd: "packages/api-form-builder -- --storage=ddb", storage: "ddb" } ]; }, "api-form-builder-so-ddb-es": () => { return [ { - cmd: "packages/api-form-builder-so-ddb-es --storage=ddb-es,ddb", + cmd: "packages/api-form-builder-so-ddb-es -- --storage=ddb-es,ddb", storage: "ddb-es" }, { - cmd: "packages/api-form-builder-so-ddb-es --storage=ddb-os,ddb", + cmd: "packages/api-form-builder-so-ddb-es -- --storage=ddb-os,ddb", storage: "ddb-os" } ]; @@ -117,15 +117,15 @@ const CUSTOM_HANDLERS: Record Array> = { "api-page-builder": () => { return [ ...shardPackageTestExecution({ - cmd: "packages/api-page-builder --storage=ddb-es,ddb", + cmd: "packages/api-page-builder -- --storage=ddb-es,ddb", storage: "ddb-es" }), ...shardPackageTestExecution({ - cmd: "packages/api-page-builder --storage=ddb-os,ddb", + cmd: "packages/api-page-builder -- --storage=ddb-os,ddb", storage: "ddb-os" }), ...shardPackageTestExecution({ - cmd: "packages/api-page-builder --storage=ddb", + cmd: "packages/api-page-builder -- --storage=ddb", storage: "ddb" }) ]; @@ -133,11 +133,11 @@ const CUSTOM_HANDLERS: Record Array> = { "api-page-builder-so-ddb-es": () => { return [ { - cmd: "packages/api-page-builder-so-ddb-es --storage=ddb-es,ddb", + cmd: "packages/api-page-builder-so-ddb-es -- --storage=ddb-es,ddb", storage: "ddb-es" }, { - cmd: "packages/api-page-builder-so-ddb-es --storage=ddb-os,ddb", + cmd: "packages/api-page-builder-so-ddb-es -- --storage=ddb-os,ddb", storage: "ddb-os" } ]; @@ -146,49 +146,49 @@ const CUSTOM_HANDLERS: Record Array> = { "api-page-builder-import-export": () => { return [ { - cmd: "packages/api-page-builder-import-export --storage=ddb", + cmd: "packages/api-page-builder-import-export -- --storage=ddb", storage: "ddb" } ]; }, "api-prerendering-service": () => { - return [{ cmd: "packages/api-prerendering-service --storage=ddb", storage: "ddb" }]; + return [{ cmd: "packages/api-prerendering-service -- --storage=ddb", storage: "ddb" }]; }, "api-mailer": () => { return [ - { cmd: "packages/api-mailer --storage=ddb", storage: "ddb" }, - { cmd: "packages/api-mailer --storage=ddb-es,ddb", storage: "ddb-es" }, - { cmd: "packages/api-mailer --storage=ddb-os,ddb", storage: "ddb-os" } + { cmd: "packages/api-mailer -- --storage=ddb", storage: "ddb" }, + { cmd: "packages/api-mailer -- --storage=ddb-es,ddb", storage: "ddb-es" }, + { cmd: "packages/api-mailer -- --storage=ddb-os,ddb", storage: "ddb-os" } ]; }, "api-headless-cms": () => { return [ ...shardPackageTestExecution({ - cmd: "packages/api-headless-cms --storage=ddb", + cmd: "packages/api-headless-cms -- --storage=ddb", storage: "ddb" }), ...shardPackageTestExecution({ - cmd: "packages/api-headless-cms --storage=ddb-es,ddb", + cmd: "packages/api-headless-cms -- --storage=ddb-es,ddb", storage: "ddb-es" }), ...shardPackageTestExecution({ - cmd: "packages/api-headless-cms --storage=ddb-os,ddb", + cmd: "packages/api-headless-cms -- --storage=ddb-os,ddb", storage: "ddb-os" }) ]; }, "api-headless-cms-import-export": () => { return [ - { cmd: "packages/api-headless-cms-import-export --storage=ddb", storage: "ddb" }, + { cmd: "packages/api-headless-cms-import-export -- --storage=ddb", storage: "ddb" }, { - cmd: "packages/api-headless-cms-import-export --storage=ddb-es,ddb", + cmd: "packages/api-headless-cms-import-export -- --storage=ddb-es,ddb", storage: "ddb-es" }, { - cmd: "packages/api-headless-cms-import-export --storage=ddb-os,ddb", + cmd: "packages/api-headless-cms-import-export -- --storage=ddb-os,ddb", storage: "ddb-os" } ]; @@ -196,65 +196,65 @@ const CUSTOM_HANDLERS: Record Array> = { "api-headless-cms-ddb-es": () => { return [ { - cmd: "packages/api-headless-cms-ddb-es --storage=ddb-es,ddb", + cmd: "packages/api-headless-cms-ddb-es -- --storage=ddb-es,ddb", storage: "ddb-es" }, { - cmd: "packages/api-headless-cms-ddb-es --storage=ddb-os,ddb", + cmd: "packages/api-headless-cms-ddb-es -- --storage=ddb-os,ddb", storage: "ddb-os" } ]; }, "api-headless-cms-aco": () => { return [ - { cmd: "packages/api-headless-cms-aco --storage=ddb", storage: "ddb" }, - { cmd: "packages/api-headless-cms-aco --storage=ddb-es,ddb", storage: "ddb-es" }, - { cmd: "packages/api-headless-cms-aco --storage=ddb-os,ddb", storage: "ddb-os" } + { cmd: "packages/api-headless-cms-aco -- --storage=ddb", storage: "ddb" }, + { cmd: "packages/api-headless-cms-aco -- --storage=ddb-es,ddb", storage: "ddb-es" }, + { cmd: "packages/api-headless-cms-aco -- --storage=ddb-os,ddb", storage: "ddb-os" } ]; }, "api-headless-cms-bulk-actions": () => { return [ - { cmd: "packages/api-headless-cms-bulk-actions --storage=ddb", storage: "ddb" }, + { cmd: "packages/api-headless-cms-bulk-actions -- --storage=ddb", storage: "ddb" }, { - cmd: "packages/api-headless-cms-bulk-actions --storage=ddb-es,ddb", + cmd: "packages/api-headless-cms-bulk-actions -- --storage=ddb-es,ddb", storage: "ddb-es" }, { - cmd: "packages/api-headless-cms-bulk-actions --storage=ddb-os,ddb", + cmd: "packages/api-headless-cms-bulk-actions -- --storage=ddb-os,ddb", storage: "ddb-os" } ]; }, "api-apw": () => { return [ - { cmd: "packages/api-apw --storage=ddb", storage: "ddb" } + { cmd: "packages/api-apw -- --storage=ddb", storage: "ddb" } // TODO: With ddb-es setup, some tests are failing! - // "packages/api-apw --storage=ddb-es,ddb" + // "packages/api-apw -- --storage=ddb-es,ddb" ]; }, "api-aco": () => { return [ - { cmd: "packages/api-aco --storage=ddb", storage: "ddb" }, - { cmd: "packages/api-aco --storage=ddb-es,ddb", storage: "ddb-es" }, - { cmd: "packages/api-aco --storage=ddb-os,ddb", storage: "ddb-os" } + { cmd: "packages/api-aco -- --storage=ddb", storage: "ddb" }, + { cmd: "packages/api-aco -- --storage=ddb-es,ddb", storage: "ddb-es" }, + { cmd: "packages/api-aco -- --storage=ddb-os,ddb", storage: "ddb-os" } ]; }, "api-audit-logs": () => { return [ - { cmd: "packages/api-audit-logs --storage=ddb", storage: "ddb" }, - { cmd: "packages/api-audit-logs --storage=ddb-es,ddb", storage: "ddb-es" }, - { cmd: "packages/api-audit-logs --storage=ddb-os,ddb", storage: "ddb-os" } + { cmd: "packages/api-audit-logs -- --storage=ddb", storage: "ddb" }, + { cmd: "packages/api-audit-logs -- --storage=ddb-es,ddb", storage: "ddb-es" }, + { cmd: "packages/api-audit-logs -- --storage=ddb-os,ddb", storage: "ddb-os" } ]; }, "api-page-builder-aco": () => { return [ - { cmd: "packages/api-page-builder-aco --storage=ddb", storage: "ddb" }, + { cmd: "packages/api-page-builder-aco -- --storage=ddb", storage: "ddb" }, { - cmd: "packages/api-page-builder-aco --storage=ddb-es,ddb", + cmd: "packages/api-page-builder-aco -- --storage=ddb-es,ddb", storage: "ddb-es" }, { - cmd: "packages/api-page-builder-aco --storage=ddb-os,ddb", + cmd: "packages/api-page-builder-aco -- --storage=ddb-os,ddb", storage: "ddb-os" } ]; @@ -269,11 +269,11 @@ const CUSTOM_HANDLERS: Record Array> = { migrations: () => { return [ { - cmd: "packages/migrations --storage=ddb-es,ddb", + cmd: "packages/migrations -- --storage=ddb-es,ddb", storage: ["ddb-es"] }, { - cmd: "packages/migrations --storage=ddb-os,ddb", + cmd: "packages/migrations -- --storage=ddb-os,ddb", storage: ["ddb-os"] } ]; @@ -281,11 +281,11 @@ const CUSTOM_HANDLERS: Record Array> = { "api-elasticsearch": () => { return [ { - cmd: "packages/api-elasticsearch --storage=ddb-es,ddb", + cmd: "packages/api-elasticsearch -- --storage=ddb-es,ddb", storage: ["ddb-es"] }, { - cmd: "packages/api-elasticsearch --storage=ddb-os,ddb", + cmd: "packages/api-elasticsearch -- --storage=ddb-os,ddb", storage: ["ddb-os"] } ]; @@ -293,11 +293,11 @@ const CUSTOM_HANDLERS: Record Array> = { "api-dynamodb-to-elasticsearch": () => { return [ { - cmd: "packages/api-dynamodb-to-elasticsearch --storage=ddb-es,ddb", + cmd: "packages/api-dynamodb-to-elasticsearch -- --storage=ddb-es,ddb", storage: ["ddb-es"] }, { - cmd: "packages/api-dynamodb-to-elasticsearch --storage=ddb-os,ddb", + cmd: "packages/api-dynamodb-to-elasticsearch -- --storage=ddb-os,ddb", storage: ["ddb-os"] } ]; @@ -305,24 +305,24 @@ const CUSTOM_HANDLERS: Record Array> = { "api-headless-cms-es-tasks": () => { return [ { - cmd: "packages/api-headless-cms-es-tasks --storage=ddb-es,ddb", + cmd: "packages/api-headless-cms-es-tasks -- --storage=ddb-es,ddb", storage: ["ddb-es"] }, { - cmd: "packages/api-headless-cms-es-tasks --storage=ddb-os,ddb", + cmd: "packages/api-headless-cms-es-tasks -- --storage=ddb-os,ddb", storage: ["ddb-os"] } ]; }, tasks: () => { return [ - { cmd: "packages/tasks --storage=ddb", storage: "ddb" }, + { cmd: "packages/tasks -- --storage=ddb", storage: "ddb" }, { - cmd: "packages/tasks --storage=ddb-es,ddb", + cmd: "packages/tasks -- --storage=ddb-es,ddb", storage: "ddb-es" }, { - cmd: "packages/tasks --storage=ddb-os,ddb", + cmd: "packages/tasks -- --storage=ddb-os,ddb", storage: "ddb-os" } ]; @@ -330,20 +330,20 @@ const CUSTOM_HANDLERS: Record Array> = { "api-elasticsearch-tasks": () => { return [ { - cmd: "packages/api-elasticsearch-tasks --storage=ddb-es,ddb", + cmd: "packages/api-elasticsearch-tasks -- --storage=ddb-es,ddb", storage: "ddb-es" }, { - cmd: "packages/api-elasticsearch-tasks --storage=ddb-os,ddb", + cmd: "packages/api-elasticsearch-tasks -- --storage=ddb-os,ddb", storage: "ddb-os" } ]; }, "api-serverless-cms": () => { return [ - { cmd: "packages/api-serverless-cms --storage=ddb-es,ddb", storage: "ddb-es" }, - { cmd: "packages/api-serverless-cms --storage=ddb-os,ddb", storage: "ddb-os" }, - { cmd: "packages/api-serverless-cms --storage=ddb", storage: "ddb" } + { cmd: "packages/api-serverless-cms -- --storage=ddb-es,ddb", storage: "ddb-es" }, + { cmd: "packages/api-serverless-cms -- --storage=ddb-os,ddb", storage: "ddb-os" }, + { cmd: "packages/api-serverless-cms -- --storage=ddb", storage: "ddb" } ]; } }; diff --git a/.prettierignore b/.prettierignore index ea1fcf46440..704521e1bb4 100644 --- a/.prettierignore +++ b/.prettierignore @@ -3,7 +3,6 @@ .verdaccio/ **/build/ **/dist/ -**/*.d.ts **/.out/ **/.pulumi/ .webiny/** diff --git a/jest-es-config.js b/jest-es-config.js deleted file mode 100644 index 704710e0619..00000000000 --- a/jest-es-config.js +++ /dev/null @@ -1,9 +0,0 @@ -export default () => { - return { - esVersion: "7.6.0", - clusterName: "test-cluster", - nodeName: "test-node", - port: 9200, - indexes: [] - }; -}; diff --git a/jest.config.base.js b/jest.config.base.js index de5be576074..c68d52aa605 100644 --- a/jest.config.base.js +++ b/jest.config.base.js @@ -1,3 +1,4 @@ +// TO BE DELETED! import { basename, join, dirname } from "path"; import fs from "fs"; import merge from "deepmerge"; @@ -7,7 +8,7 @@ import { createJsWithTsEsmPreset } from "ts-jest"; export default async ({ path }, presets = []) => { const name = basename(path); - const { PackageJson } = await import("@webiny/project/PackageJson.js"); + const { PackageJson } = await import("@webiny/project-utils/utils/PackageJson.js"); const cliPackage = await PackageJson.fromPackage("@webiny/cli"); const version = cliPackage.getJson().version; diff --git a/jest.config.base.setup.js b/jest.config.base.setup.js index 2255a20c547..e1f6b1fcb57 100644 --- a/jest.config.base.setup.js +++ b/jest.config.base.setup.js @@ -1,3 +1,4 @@ +// TO BE DELETED! import { jest } from "@jest/globals"; // The `jest.config.base.setup.js` file is run by Jest before running the actual test suite. diff --git a/package.json b/package.json index b7ad62bb3ef..915377bd5c1 100644 --- a/package.json +++ b/package.json @@ -54,10 +54,8 @@ "@commitlint/cli": "^11.0.0", "@commitlint/config-conventional": "^11.0.0", "@grpc/grpc-js": "^1.11.1", - "@jest/globals": "^29.7.0", "@octokit/rest": "^20.0.2", "@types/fs-extra": "^11.0.4", - "@types/jest": "^29.5.14", "@types/node": "^20.17.10", "@types/prettier": "^2.7.3", "@types/react": "18.2.79", @@ -66,7 +64,6 @@ "@typescript-eslint/parser": "^6.21.0", "adio": "^2.0.1", "axios": "^1.8.2", - "babel-jest": "29.7.0", "babel-loader": "^9.2.1", "babel-plugin-dynamic-import-node": "2.3.3", "babel-plugin-macros": "3.1.0", @@ -81,13 +78,13 @@ "eslint-config-standard": "^16.0.3", "eslint-import-resolver-babel-module": "^5.3.2", "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jest": "^25.7.0", "eslint-plugin-lodash": "^7.4.0", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^5.2.0", "eslint-plugin-react": "^7.32.2", "eslint-plugin-standard": "^5.0.0", "execa": "^5.1.1", + "fast-glob": "^3.3.3", "folder-hash": "^4.0.4", "fs-extra": "^11.2.0", "get-stream": "^3.0.0", @@ -101,9 +98,7 @@ "inquirer-autocomplete-prompt": "^1.0.1", "inquirer-checkbox-plus-prompt": "^1.0.1", "inquirer-maxlength-input-prompt": "^1.0.0", - "jest": "^30.0.0-rc.1", - "jest-environment-jsdom": "^30.0.0-rc.1", - "jest-extended": "^4.0.2", + "jest-extended": "^6.0.0", "lerna": "8.1.2", "lint-staged": "^15.3.0", "listr": "^0.14.3", @@ -118,13 +113,12 @@ "prettier": "^2.8.8", "semver": "^7.6.3", "ts-expect": "^1.3.0", - "ts-jest": "^29.2.5", - "ts-jest-resolver": "^2.0.1", "tsx": "^4.16.2", "type-fest": "4.14.0", "typescript": "5.3.3", "typescript-transform-paths": "^3.5.3", "verdaccio": "^6.0.5", + "vitest": "^3.2.4", "write-json-file": "^4.3.0", "yargs": "^17.7.2" }, @@ -172,7 +166,7 @@ "setup-project": "node scripts/setupProject", "setup-env-files": "node scripts/setupEnvFiles", "setup-cypress": "node scripts/setupCypress", - "test": "NODE_OPTIONS=\"--experimental-vm-modules --max_old_space_size=4096\" jest --runInBand --logHeapUsage --config jest.config.js", + "test": "vitest --config testing/vitest.config.ts --run", "test:unit": "cross-env TEST_TYPE=unit yarn test", "test:integration": "cross-env TEST_TYPE=integration yarn test", "test:e2e": "cross-env TEST_TYPE=e2e yarn test", diff --git a/packages/api-file-manager-s3/jest.config.js b/packages/api-file-manager-s3/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/api-file-manager-s3/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/api-file-manager-s3/src/utils/FileKey.test.ts b/packages/api-file-manager-s3/src/utils/FileKey.test.ts index 5a4984318f0..26badd0364e 100644 --- a/packages/api-file-manager-s3/src/utils/FileKey.test.ts +++ b/packages/api-file-manager-s3/src/utils/FileKey.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { FileKey } from "./FileKey.js"; describe("FileKey", () => { diff --git a/packages/api-file-manager-s3/vitest.config.ts b/packages/api-file-manager-s3/vitest.config.ts new file mode 100644 index 00000000000..77c26269023 --- /dev/null +++ b/packages/api-file-manager-s3/vitest.config.ts @@ -0,0 +1,10 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ + path: import.meta.dirname, + vitestConfig: { + fileParallelism: true + } + }); +}; diff --git a/packages/api-i18n/__tests__/getI18NInformation.test.ts b/packages/api-i18n/__tests__/getI18NInformation.test.ts index 1955cd12bfb..bdfb684e96d 100644 --- a/packages/api-i18n/__tests__/getI18NInformation.test.ts +++ b/packages/api-i18n/__tests__/getI18NInformation.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import useGqlHandler from "./useGqlHandler"; describe("getI18NInformation Test", () => { @@ -47,7 +48,7 @@ describe("getI18NInformation Test", () => { } }); - [response] = await getI18NInformation(null, { + [response] = await getI18NInformation({}, { headers: { "accept-language": "en-GB,en;q=0.9,hr-HR;q=0.8,hr;q=0.7,en-US;q=0.6" } @@ -73,7 +74,7 @@ describe("getI18NInformation Test", () => { }); // We are also testing "not-all-lower-case" scenario. - [response] = await getI18NInformation(null, { + [response] = await getI18NInformation({}, { headers: { "Accept-Language": "en-GB,en;q=0.9,hr-HR;q=0.8,hr;q=0.7,en-US;q=0.6", "X-I18N-LOCALE": "default:en-US;content:en-GB" @@ -99,7 +100,7 @@ describe("getI18NInformation Test", () => { } }); - [response] = await getI18NInformation(null, { + [response] = await getI18NInformation({}, { headers: { "accept-language": "en-GB,en;q=0.9,hr-HR;q=0.8,hr;q=0.7,en-US;q=0.6", "x-i18n-locale": "default:it-IT;content:ru" diff --git a/packages/api-i18n/__tests__/helpers.ts b/packages/api-i18n/__tests__/helpers.ts index ee22caed6cf..fcac5791645 100644 --- a/packages/api-i18n/__tests__/helpers.ts +++ b/packages/api-i18n/__tests__/helpers.ts @@ -8,27 +8,29 @@ import { } from "./graphql/locales"; import { GET_VERSION, INSTALL } from "./graphql/system"; -export const apiCallsFactory = invoke => { +type Variables = Record; + +export const apiCallsFactory = (invoke: Function) => { return { - async createI18NLocale(variables, fields: string[] = []) { + async createI18NLocale(variables: Variables, fields: string[] = []) { return invoke({ body: { query: CREATE_LOCALE(fields), variables } }); }, - async updateI18NLocale(variables, fields: string[] = []) { + async updateI18NLocale(variables: Variables, fields: string[] = []) { return invoke({ body: { query: UPDATE_LOCALE(fields), variables } }); }, - async deleteI18NLocale(variables) { + async deleteI18NLocale(variables: Variables) { return invoke({ body: { query: DELETE_LOCALE, variables } }); }, - async listI18NLocales(variables = {}) { + async listI18NLocales(variables: Variables = {}) { return invoke({ body: { query: LIST_LOCALES, variables } }); }, - async getI18NLocale(variables) { + async getI18NLocale(variables: Variables) { return invoke({ body: { query: GET_LOCALE, variables } }); }, - async getI18NInformation(variables = {}, rest = {}) { + async getI18NInformation(variables: Variables = {}, rest = {}) { return invoke({ body: { query: GET_I18N_INFORMATION, variables }, ...rest }); }, - async install(variables) { + async install(variables: Variables) { return invoke({ body: { query: INSTALL, variables } }); }, async getVersion() { diff --git a/packages/api-i18n/__tests__/locale.lifecycle.test.ts b/packages/api-i18n/__tests__/locale.lifecycle.test.ts index 6807515e6cb..9c9646b4fa3 100644 --- a/packages/api-i18n/__tests__/locale.lifecycle.test.ts +++ b/packages/api-i18n/__tests__/locale.lifecycle.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect, beforeEach } from "vitest"; import useGqlHandler from "./useGqlHandler"; import { assignLifecycleEvents, lifecycleTracker } from "./mocks/lifecycleEvents"; diff --git a/packages/api-i18n/__tests__/locales.test.ts b/packages/api-i18n/__tests__/locales.test.ts index 023771de00c..d29c2e087ce 100644 --- a/packages/api-i18n/__tests__/locales.test.ts +++ b/packages/api-i18n/__tests__/locales.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import useGqlHandler from "./useGqlHandler"; describe("CRUD Test", () => { diff --git a/packages/api-i18n/__tests__/system.test.ts b/packages/api-i18n/__tests__/system.test.ts index c9d53856fdb..c3354805dc4 100644 --- a/packages/api-i18n/__tests__/system.test.ts +++ b/packages/api-i18n/__tests__/system.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import useGqlHandler from "./useGqlHandler"; describe("System CRUD", () => { diff --git a/packages/api-i18n/jest.setup.js b/packages/api-i18n/jest.setup.js deleted file mode 100644 index a84d4d2cc3e..00000000000 --- a/packages/api-i18n/jest.setup.js +++ /dev/null @@ -1,10 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-i18n/vitest.setup.ts b/packages/api-i18n/vitest.setup.ts new file mode 100644 index 00000000000..b0981ee79eb --- /dev/null +++ b/packages/api-i18n/vitest.setup.ts @@ -0,0 +1,12 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ path: import.meta.dirname, presets }); +}; diff --git a/packages/api-page-builder/src/dataSources/cmsDataSources/converter/ParsedPath.test.ts b/packages/api-page-builder/src/dataSources/cmsDataSources/converter/ParsedPath.test.ts index 5da72b30f2d..2212011c209 100644 --- a/packages/api-page-builder/src/dataSources/cmsDataSources/converter/ParsedPath.test.ts +++ b/packages/api-page-builder/src/dataSources/cmsDataSources/converter/ParsedPath.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { ParsedPath } from "./ParsedPath.js"; describe("Path Parser", () => { diff --git a/packages/api-page-builder/src/dataSources/cmsDataSources/converter/PathsParser.test.ts b/packages/api-page-builder/src/dataSources/cmsDataSources/converter/PathsParser.test.ts index 4d52fd0b96e..7a0b31e37d0 100644 --- a/packages/api-page-builder/src/dataSources/cmsDataSources/converter/PathsParser.test.ts +++ b/packages/api-page-builder/src/dataSources/cmsDataSources/converter/PathsParser.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { PathsParser } from "./PathsParser.js"; describe("PathsParser", () => { diff --git a/packages/api-page-builder/src/dataSources/cmsDataSources/converter/SelectionFormatter.test.ts b/packages/api-page-builder/src/dataSources/cmsDataSources/converter/SelectionFormatter.test.ts index 135c27419d4..b4c9c14f07d 100644 --- a/packages/api-page-builder/src/dataSources/cmsDataSources/converter/SelectionFormatter.test.ts +++ b/packages/api-page-builder/src/dataSources/cmsDataSources/converter/SelectionFormatter.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import prettier from "prettier"; import { PathsParser } from "./PathsParser.js"; import { SelectionFormatter } from "./SelectionFormatter.js"; diff --git a/packages/api-page-builder/vitest.setup.ts b/packages/api-page-builder/vitest.setup.ts new file mode 100644 index 00000000000..569549ef6e4 --- /dev/null +++ b/packages/api-page-builder/vitest.setup.ts @@ -0,0 +1,15 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-page-builder", "storage-operations"], + ["@webiny/api-file-manager", "storage-operations"], + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ path: import.meta.dirname, presets }); +}; diff --git a/packages/api-security-so-ddb/.typedoc.json b/packages/api-security-so-ddb/.typedoc.json deleted file mode 100644 index 8506d54e013..00000000000 --- a/packages/api-security-so-ddb/.typedoc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "API Security Admin Users DynamoDB", - "entryPoints": ["types.ts"] -} diff --git a/packages/api-security/jest.setup.js b/packages/api-security/jest.setup.js deleted file mode 100644 index abbe11b2245..00000000000 --- a/packages/api-security/jest.setup.js +++ /dev/null @@ -1,14 +0,0 @@ -import base from "../../jest.config.base"; -import { getPresets } from "@webiny/project-utils/testing/presets/index.js"; - -export default async () => { - const config = await base( - { path: import.meta.dirname }, - await getPresets( - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] - ) - ); - - return config; -}; diff --git a/packages/api-security/tsconfig.json b/packages/api-security/tsconfig.json index 24cbca82c3d..6111f30a4ce 100644 --- a/packages/api-security/tsconfig.json +++ b/packages/api-security/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.setup.ts"], "references": [ { "path": "../api" }, { "path": "../api-authentication" }, diff --git a/packages/api-security/vitest.setup.ts b/packages/api-security/vitest.setup.ts new file mode 100644 index 00000000000..92c1da6e776 --- /dev/null +++ b/packages/api-security/vitest.setup.ts @@ -0,0 +1,14 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ + path: import.meta.dirname, + presets + }); +}; diff --git a/packages/api-tenancy-so-ddb/.typedoc.json b/packages/api-tenancy-so-ddb/.typedoc.json deleted file mode 100644 index 8506d54e013..00000000000 --- a/packages/api-tenancy-so-ddb/.typedoc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "API Security Admin Users DynamoDB", - "entryPoints": ["types.ts"] -} diff --git a/packages/api-tenancy/jest.setup.js b/packages/api-tenancy/jest.setup.js deleted file mode 100644 index 11469b21653..00000000000 --- a/packages/api-tenancy/jest.setup.js +++ /dev/null @@ -1,9 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")([ - "@webiny/api-tenancy", - "storage-operations" -]); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-tenancy/tsconfig.json b/packages/api-tenancy/tsconfig.json index 7b26af01fab..684369d25dc 100644 --- a/packages/api-tenancy/tsconfig.json +++ b/packages/api-tenancy/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.setup.ts"], "references": [ { "path": "../api" }, { "path": "../api-wcp" }, diff --git a/packages/api-tenancy/vitest.setup.ts b/packages/api-tenancy/vitest.setup.ts new file mode 100644 index 00000000000..3ab956f2c73 --- /dev/null +++ b/packages/api-tenancy/vitest.setup.ts @@ -0,0 +1,11 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets(["@webiny/api-tenancy", "storage-operations"]); + + return createTestConfig({ + path: import.meta.dirname, + presets + }); +}; diff --git a/packages/app-aco/jest.config.js b/packages/app-aco/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/app-aco/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/app-aco/src/components/AdvancedSearch/AdvancedSearchPresenter.test.ts b/packages/app-aco/src/components/AdvancedSearch/AdvancedSearchPresenter.test.ts index e9f9b6f69d1..64b7d66fe01 100644 --- a/packages/app-aco/src/components/AdvancedSearch/AdvancedSearchPresenter.test.ts +++ b/packages/app-aco/src/components/AdvancedSearch/AdvancedSearchPresenter.test.ts @@ -1,3 +1,4 @@ +import { describe, it, vi, expect, beforeEach } from "vitest"; import { AdvancedSearchPresenter } from "./AdvancedSearchPresenter.js"; import { type FilterDTO, @@ -7,14 +8,13 @@ import { Operation } from "./domain/index.js"; import { type FiltersGatewayInterface } from "./gateways/index.js"; -import { jest } from "@jest/globals"; const mockGateway: FiltersGatewayInterface = { - list: jest.fn(), - get: jest.fn(), - create: jest.fn(), - update: jest.fn(), - delete: jest.fn() + list: vi.fn(), + get: vi.fn(), + create: vi.fn(), + update: vi.fn(), + delete: vi.fn() }; const createMockGateway = ({ @@ -64,19 +64,19 @@ describe("AdvancedSearchPresenter", () => { }; const gateway = createMockGateway({ - list: jest.fn().mockImplementation(() => { + list: vi.fn().mockImplementation(() => { return Promise.resolve([filter1, filter2]); }), - get: jest.fn().mockImplementation(() => { + get: vi.fn().mockImplementation(() => { return Promise.resolve(filter1); }), - create: jest.fn().mockImplementation(() => { + create: vi.fn().mockImplementation(() => { return Promise.resolve(filter1); }), - update: jest.fn().mockImplementation(() => { + update: vi.fn().mockImplementation(() => { return Promise.resolve({ ...filter1, name: "Filter 1 - Edit" }); }), - delete: jest.fn().mockImplementation(() => { + delete: vi.fn().mockImplementation(() => { return Promise.resolve(true); }) }); @@ -84,7 +84,7 @@ describe("AdvancedSearchPresenter", () => { let presenter: AdvancedSearchPresenter; beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); const repository = new FilterRepository(gateway, namespace); presenter = new AdvancedSearchPresenter(repository); @@ -668,7 +668,7 @@ describe("AdvancedSearchPresenter", () => { it("should be able to handle an empty list - error from the gateway", async () => { const message = "Gateway error while listing filters"; const gateway = createMockGateway({ - list: jest.fn().mockRejectedValue(new Error(message)) + list: vi.fn().mockRejectedValue(new Error(message)) }); const repository = new FilterRepository(gateway, namespace); @@ -695,9 +695,7 @@ describe("AdvancedSearchPresenter", () => { const message = "Gateway error while creating filter"; const createGateway = createMockGateway({ ...gateway, - create: jest - .fn() - .mockRejectedValue(new Error(message)) + create: vi.fn().mockRejectedValue(new Error(message)) }); const repository = new FilterRepository(createGateway, namespace); @@ -740,9 +738,7 @@ describe("AdvancedSearchPresenter", () => { const message = "Gateway error while updating filter"; const updateGateway = createMockGateway({ ...gateway, - update: jest - .fn() - .mockRejectedValue(new Error(message)) + update: vi.fn().mockRejectedValue(new Error(message)) }); const repository = new FilterRepository(updateGateway, namespace); @@ -771,9 +767,7 @@ describe("AdvancedSearchPresenter", () => { const message = "Gateway error while deleting filter"; const updateGateway = createMockGateway({ ...gateway, - delete: jest - .fn() - .mockRejectedValue(new Error(message)) + delete: vi.fn().mockRejectedValue(new Error(message)) }); const repository = new FilterRepository(updateGateway, namespace); diff --git a/packages/app-aco/src/components/AdvancedSearch/GraphQLInputMapper.test.ts b/packages/app-aco/src/components/AdvancedSearch/GraphQLInputMapper.test.ts index a235f9935a2..50d493f42c1 100644 --- a/packages/app-aco/src/components/AdvancedSearch/GraphQLInputMapper.test.ts +++ b/packages/app-aco/src/components/AdvancedSearch/GraphQLInputMapper.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { GraphQLInputMapper } from "./GraphQLInputMapper.js"; import { Operation, type FilterDTO } from "./domain/index.js"; diff --git a/packages/app-aco/src/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilderDrawerPresenter.test.tsx b/packages/app-aco/src/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilderDrawerPresenter.test.tsx index b4919444e8b..29f08ef8fee 100644 --- a/packages/app-aco/src/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilderDrawerPresenter.test.tsx +++ b/packages/app-aco/src/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilderDrawerPresenter.test.tsx @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { QueryBuilderDrawerPresenter } from "./QueryBuilderDrawerPresenter.js"; import { type FilterDTO, Operation } from "~/components/AdvancedSearch/domain/index.js"; @@ -274,8 +275,8 @@ describe("QueryBuilderDrawerPresenter", () => { // let's load a filter presenter.load(filter); - const onSuccess = jest.fn(); - const onError = jest.fn(); + const onSuccess = vi.fn(); + const onError = vi.fn(); presenter.setFilter({ operation: Operation.OR, @@ -334,8 +335,8 @@ describe("QueryBuilderDrawerPresenter", () => { // let's load a filter presenter.load(filter); - const onSuccess = jest.fn(); - const onError = jest.fn(); + const onSuccess = vi.fn(); + const onError = vi.fn(); presenter.setFilter({ operation: Operation.OR, diff --git a/packages/app-aco/src/components/AdvancedSearch/QuerySaverDialog/QuerySaverDialogPresenter.test.ts b/packages/app-aco/src/components/AdvancedSearch/QuerySaverDialog/QuerySaverDialogPresenter.test.ts index 9f3a60e3cc4..1fb6173e0dc 100644 --- a/packages/app-aco/src/components/AdvancedSearch/QuerySaverDialog/QuerySaverDialogPresenter.test.ts +++ b/packages/app-aco/src/components/AdvancedSearch/QuerySaverDialog/QuerySaverDialogPresenter.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { type FilterDTO, type FilterGroupDTO, @@ -5,7 +6,6 @@ import { Operation } from "~/components/AdvancedSearch/domain/index.js"; import { QuerySaverDialogPresenter } from "./QuerySaverDialogPresenter.js"; -import { jest } from "@jest/globals"; describe("QuerySaverDialogPresenter", () => { const demoFilter: FilterGroupFilterDTO = { @@ -64,8 +64,8 @@ describe("QuerySaverDialogPresenter", () => { // let's load a filter presenter.load(filter); - const onSuccess = jest.fn(); - const onError = jest.fn(); + const onSuccess = vi.fn(); + const onError = vi.fn(); presenter.setFilter({ name: "", // empty value -> this should trigger the error diff --git a/packages/app-aco/src/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityPresenter.test.ts b/packages/app-aco/src/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityPresenter.test.ts index 5674b0e1b8a..fc84987f2d0 100644 --- a/packages/app-aco/src/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityPresenter.test.ts +++ b/packages/app-aco/src/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityPresenter.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { ColumnsVisibilityPresenter } from "./ColumnsVisibilityPresenter.js"; import { type IColumnsVisibilityGateway } from "../gateways/index.js"; import { type ColumnConfig } from "~/config/table/Column.js"; @@ -5,11 +6,10 @@ import { Column, ColumnsPresenter, ColumnsRepository } from "../Columns/index.js import { ColumnsVisibilityRepository } from "./ColumnsVisibilityRepository.js"; import { ColumnsVisibilityDecorator } from "./ColumnsVisibilityDecorator.js"; import { ColumnsVisibilityUpdater } from "~/components/Table/components/Table/ColumnVisibility/ColumnsVisibilityUpdater.js"; -import { jest } from "@jest/globals"; const defaultGateway: IColumnsVisibilityGateway = { - get: jest.fn(), - set: jest.fn() + get: vi.fn(), + set: vi.fn() }; const createMockGateway = ({ @@ -59,7 +59,7 @@ describe("ColumnsVisibilityPresenter", () => { ]; beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it("should return the columns visibility from the column config", async () => { @@ -90,7 +90,7 @@ describe("ColumnsVisibilityPresenter", () => { it("should return the columns visibility from both the column configs and the gateway", async () => { // Let's create a mocked gateway const gateway = createMockGateway({ - get: jest + get: vi .fn() .mockImplementation(async () => ({ title: false })) }); @@ -145,7 +145,7 @@ describe("ColumnsVisibilityPresenter", () => { }); // Let's update the visibility - const updater = jest + const updater = vi .fn() .mockImplementation((current: any) => ({ ...current, title: false })); diff --git a/packages/app-aco/src/components/Table/components/Table/Columns/ColumnsPresenter.test.ts b/packages/app-aco/src/components/Table/components/Table/Columns/ColumnsPresenter.test.ts index 3c8d3998f6c..91010b80dad 100644 --- a/packages/app-aco/src/components/Table/components/Table/Columns/ColumnsPresenter.test.ts +++ b/packages/app-aco/src/components/Table/components/Table/Columns/ColumnsPresenter.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { ColumnsPresenter } from "./ColumnsPresenter.js"; import { Column } from "./Column.js"; import { type ColumnConfig } from "~/config/table/Column.js"; @@ -33,7 +34,7 @@ describe("ColumnsPresenter", () => { let presenter: ColumnsPresenter; beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); const repository = new ColumnsRepository( columnConfigs.map(config => Column.createFromConfig(config)) ); diff --git a/packages/app-aco/src/features/folders/createFolder/CreateFolder.test.ts b/packages/app-aco/src/features/folders/createFolder/CreateFolder.test.ts index 5328c157414..3be66b479a3 100644 --- a/packages/app-aco/src/features/folders/createFolder/CreateFolder.test.ts +++ b/packages/app-aco/src/features/folders/createFolder/CreateFolder.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { CreateFolder } from "./CreateFolder.js"; import { folderCacheFactory } from "../cache/FoldersCacheFactory.js"; import type { FolderGqlDto } from "~/features/folders/listFolders/FolderGqlDto"; @@ -25,6 +26,7 @@ describe("CreateFolder", () => { }); it("should be able to create a new folder", async () => { + const spy = vi.spyOn(gateway, "execute"); const createFolder = CreateFolder.getInstance(type, gateway); expect(foldersCache.hasItems()).toBeFalse(); @@ -37,7 +39,7 @@ describe("CreateFolder", () => { type }); - expect(gateway.execute).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(1); expect(foldersCache.hasItems()).toBeTrue(); const item = foldersCache.getItem(folder => folder.slug === "new-folder"); diff --git a/packages/app-aco/src/features/folders/deleteFolder/DeleteFolder.test.ts b/packages/app-aco/src/features/folders/deleteFolder/DeleteFolder.test.ts index b471c25bce0..c451d5aca8d 100644 --- a/packages/app-aco/src/features/folders/deleteFolder/DeleteFolder.test.ts +++ b/packages/app-aco/src/features/folders/deleteFolder/DeleteFolder.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { DeleteFolder } from "./DeleteFolder.js"; import { folderCacheFactory } from "../cache/FoldersCacheFactory.js"; import { Folder } from "../Folder.js"; @@ -28,6 +29,7 @@ describe("DeleteFolder", () => { }); it("should be able to delete a folder", async () => { + const spy = vi.spyOn(gateway, "execute"); const deleteFolder = DeleteFolder.getInstance(type, gateway); expect(foldersCache.hasItems()).toBeTrue(); @@ -43,7 +45,7 @@ describe("DeleteFolder", () => { type }); - expect(gateway.execute).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(1); expect(foldersCache.hasItems()).toBeFalse(); }); }); diff --git a/packages/app-aco/src/features/folders/getDescendantFolders/GetDescendantFolders.test.ts b/packages/app-aco/src/features/folders/getDescendantFolders/GetDescendantFolders.test.ts index 194914d3470..36d1802b9a1 100644 --- a/packages/app-aco/src/features/folders/getDescendantFolders/GetDescendantFolders.test.ts +++ b/packages/app-aco/src/features/folders/getDescendantFolders/GetDescendantFolders.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { GetDescendantFolders } from "./GetDescendantFolders.js"; import { folderCacheFactory } from "../cache/FoldersCacheFactory.js"; import { Folder } from "../Folder.js"; diff --git a/packages/app-aco/src/features/folders/getFolderExtensionsFields/GetFolderExtensionsFields.test.ts b/packages/app-aco/src/features/folders/getFolderExtensionsFields/GetFolderExtensionsFields.test.ts index 0fe03792bae..0a8ac36a901 100644 --- a/packages/app-aco/src/features/folders/getFolderExtensionsFields/GetFolderExtensionsFields.test.ts +++ b/packages/app-aco/src/features/folders/getFolderExtensionsFields/GetFolderExtensionsFields.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { GetFolderExtensionsFields } from "./GetFolderExtensionsFields.js"; import type { CmsModel } from "@webiny/app-headless-cms-common/types/index.js"; diff --git a/packages/app-aco/src/features/folders/getFolderHierarchy/GetFolderHierarchy.test.ts b/packages/app-aco/src/features/folders/getFolderHierarchy/GetFolderHierarchy.test.ts index 00421698707..6a307abce4e 100644 --- a/packages/app-aco/src/features/folders/getFolderHierarchy/GetFolderHierarchy.test.ts +++ b/packages/app-aco/src/features/folders/getFolderHierarchy/GetFolderHierarchy.test.ts @@ -1,7 +1,7 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { GetFolderHierarchy } from "./GetFolderHierarchy.js"; import { folderCacheFactory } from "../cache/FoldersCacheFactory.js"; import { loadedFolderCacheFactory } from "../cache/LoadedFoldersCacheFactory.js"; -import { jest } from "@jest/globals"; import { GetFolderHierarchyGatewayResponse, IGetFolderHierarchyGateway @@ -16,7 +16,7 @@ describe("GetFolderHierarchy", () => { beforeEach(() => { foldersCache.clear(); loadedFoldersCache.clear(); - jest.resetAllMocks(); + vi.resetAllMocks(); }); class GetFolderHierarchyMockGateway implements IGetFolderHierarchyGateway { @@ -75,14 +75,16 @@ describe("GetFolderHierarchy", () => { ] }); + const spy = vi.spyOn(gateway, "execute"); + const getFolderHierarchy = GetFolderHierarchy.getInstance(type, gateway); expect(foldersCache.hasItems()).toBeFalse(); expect(loadedFoldersCache.hasItems()).toBeFalse(); await getFolderHierarchy.useCase.execute({ id: "folder-0" }); - expect(gateway.execute).toHaveBeenCalledTimes(1); - expect(gateway.execute).toHaveBeenCalledWith({ type, id: "folder-0" }); + expect(spy).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledWith({ type, id: "folder-0" }); expect(foldersCache.hasItems()).toBeTrue(); expect(foldersCache.count()).toEqual(5); @@ -117,14 +119,16 @@ describe("GetFolderHierarchy", () => { ] }); + const spy = vi.spyOn(gateway, "execute"); + const getFolderHierarchy = GetFolderHierarchy.getInstance(type, gateway); expect(foldersCache.hasItems()).toBeFalse(); expect(loadedFoldersCache.hasItems()).toBeFalse(); await getFolderHierarchy.useCase.execute({ id: "folder-0" }); - expect(gateway.execute).toHaveBeenCalledTimes(1); - expect(gateway.execute).toHaveBeenCalledWith({ type, id: "folder-0" }); + expect(spy).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledWith({ type, id: "folder-0" }); expect(foldersCache.hasItems()).toBeTrue(); expect(foldersCache.count()).toEqual(2); @@ -133,19 +137,16 @@ describe("GetFolderHierarchy", () => { }); it("should handle gateway errors gracefully", async () => { - // const errorGateway = { - // execute: jest.fn().mockRejectedValue(new Error("Gateway error")) - // }; - class GetFolderHierarchyErrorMockGateway implements IGetFolderHierarchyGateway { async execute(): Promise { throw new Error("Gateway error"); } } - const errorGateway = new GetFolderHierarchyErrorMockGateway(); + const gateway = new GetFolderHierarchyErrorMockGateway(); + const spy = vi.spyOn(gateway, "execute"); - const getFolderHierarchy = GetFolderHierarchy.getInstance(type, errorGateway); + const getFolderHierarchy = GetFolderHierarchy.getInstance(type, gateway); expect(foldersCache.hasItems()).toBeFalse(); @@ -153,7 +154,7 @@ describe("GetFolderHierarchy", () => { "Gateway error" ); - expect(errorGateway.execute).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(1); expect(foldersCache.hasItems()).toBeFalse(); }); @@ -229,13 +230,16 @@ describe("GetFolderHierarchy", () => { ] }); + const spyAbc = vi.spyOn(gatewayAbc, "execute"); + const spyXzy = vi.spyOn(gatewayXyz, "execute"); + const getFolderHierarchyAbc = GetFolderHierarchy.getInstance(type, gatewayAbc); expect(foldersCache.hasItems()).toBeFalse(); await getFolderHierarchyAbc.useCase.execute({ id: "folder-0" }); - expect(gatewayAbc.execute).toHaveBeenCalledTimes(1); + expect(spyAbc).toHaveBeenCalledTimes(1); expect(foldersCache.count()).toEqual(5); expect(loadedFoldersCache.count()).toEqual(3); @@ -248,7 +252,7 @@ describe("GetFolderHierarchy", () => { await getFolderHierarchyXyz.useCase.execute({ id: "folder-0" }); - expect(gatewayXyz.execute).toHaveBeenCalledTimes(1); + expect(spyXzy).toHaveBeenCalledTimes(1); expect(foldersCacheXyz.count()).toEqual(3); expect(loadedFoldersCacheXyz.count()).toEqual(2); }); diff --git a/packages/app-aco/src/features/folders/getFolderLevelPermission/GetFolderLevelPermission.test.ts b/packages/app-aco/src/features/folders/getFolderLevelPermission/GetFolderLevelPermission.test.ts index 9501a2c1b6d..4775e4743d3 100644 --- a/packages/app-aco/src/features/folders/getFolderLevelPermission/GetFolderLevelPermission.test.ts +++ b/packages/app-aco/src/features/folders/getFolderLevelPermission/GetFolderLevelPermission.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { GetFolderLevelPermission } from "./GetFolderLevelPermission.js"; import { folderCacheFactory } from "../cache/FoldersCacheFactory.js"; import { Folder } from "../Folder.js"; diff --git a/packages/app-aco/src/features/folders/getFolderModel/GetFolderModel.test.ts b/packages/app-aco/src/features/folders/getFolderModel/GetFolderModel.test.ts index 182f75b7980..a064c40a68e 100644 --- a/packages/app-aco/src/features/folders/getFolderModel/GetFolderModel.test.ts +++ b/packages/app-aco/src/features/folders/getFolderModel/GetFolderModel.test.ts @@ -1,5 +1,5 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { GetFolderModel } from "./GetFolderModel.js"; -import { jest } from "@jest/globals"; import type { IGetFolderModelGateway } from "~/features/folders/getFolderModel/IGetFolderModelGateway"; import type { FolderModelDto } from "~/features"; @@ -42,17 +42,19 @@ describe("GetFolderModel", () => { const gateway = new GetFolderModelMockGateway(); beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it("should be able to get the folders model", async () => { + const spy = vi.spyOn(gateway, "execute"); + const { useCase, repository } = GetFolderModel.getInstance(gateway); expect(repository.getModel()).toBeUndefined(); await useCase.execute(); - expect(gateway.execute).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(1); expect(repository.getModel()).toEqual(mockFolderModel); }); @@ -65,13 +67,15 @@ describe("GetFolderModel", () => { const errorGateway = new GetFolderModelErrorMockGateway(); + const spy = vi.spyOn(errorGateway, "execute"); + const { useCase, repository } = GetFolderModel.getInstance(errorGateway); expect(repository.getModel()).toBeUndefined(); await expect(useCase.execute()).rejects.toThrow("Gateway error"); - expect(errorGateway.execute).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(1); expect(repository.getModel()).toBeUndefined(); }); diff --git a/packages/app-aco/src/features/folders/listFolders/ListFolders.test.ts b/packages/app-aco/src/features/folders/listFolders/ListFolders.test.ts index 292d0712a3e..bf2e6ce6833 100644 --- a/packages/app-aco/src/features/folders/listFolders/ListFolders.test.ts +++ b/packages/app-aco/src/features/folders/listFolders/ListFolders.test.ts @@ -1,6 +1,6 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { ListFolders } from "./ListFolders.js"; import { folderCacheFactory } from "../cache/FoldersCacheFactory.js"; -import { jest } from "@jest/globals"; import type { IListFoldersGateway } from "~/features/folders/listFolders/IListFoldersGateway"; import type { FolderGqlDto } from "~/features/folders/listFolders/FolderGqlDto"; @@ -31,23 +31,25 @@ describe("ListFolders", () => { } const type = "abc"; - const gateway = new ListFoldersMockGateway(); const foldersCache = folderCacheFactory.getCache(type); beforeEach(() => { foldersCache.clear(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it("should be able to list folders", async () => { + const gateway = new ListFoldersMockGateway(); const listFolders = ListFolders.getInstance(type, gateway); + const spy = vi.spyOn(gateway, "execute"); + expect(foldersCache.hasItems()).toBeFalse(); await listFolders.useCase.execute(); - expect(gateway.execute).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(1); expect(foldersCache.hasItems()).toBeTrue(); const items = foldersCache.getItems(); @@ -63,12 +65,13 @@ describe("ListFolders", () => { const emptyGateway = new ListFoldersEmptyMockGateway(); const listFolders = ListFolders.getInstance(type, emptyGateway); + const spy = vi.spyOn(emptyGateway, "execute"); expect(foldersCache.hasItems()).toBeFalse(); await listFolders.useCase.execute(); - expect(emptyGateway.execute).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(1); expect(foldersCache.hasItems()).toBeFalse(); const items = foldersCache.getItems(); @@ -84,23 +87,26 @@ describe("ListFolders", () => { const errorGateway = new ListFoldersErrorMockGateway(); const listFolders = ListFolders.getInstance(type, errorGateway); + const spy = vi.spyOn(errorGateway, "execute"); expect(foldersCache.hasItems()).toBeFalse(); await expect(listFolders.useCase.execute()).rejects.toThrow("Gateway error"); - expect(errorGateway.execute).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(1); expect(foldersCache.hasItems()).toBeFalse(); }); it("should NOT cache folders after listing", async () => { + const gateway = new ListFoldersMockGateway(); const listFolders = ListFolders.getInstance(type, gateway); + const spy = vi.spyOn(gateway, "execute"); expect(foldersCache.hasItems()).toBeFalse(); await listFolders.useCase.execute(); - expect(gateway.execute).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(1); expect(foldersCache.hasItems()).toBeTrue(); const items = foldersCache.getItems(); @@ -108,17 +114,19 @@ describe("ListFolders", () => { // Execute again, it should execute the gateway again await listFolders.useCase.execute(); - expect(gateway.execute).toHaveBeenCalledTimes(2); + expect(spy).toHaveBeenCalledTimes(2); }); it("should clear cache when type changes", async () => { + const gateway = new ListFoldersMockGateway(); const listFolders = ListFolders.getInstance(type, gateway); + const spy = vi.spyOn(gateway, "execute"); expect(foldersCache.hasItems()).toBeFalse(); await listFolders.useCase.execute(); - expect(gateway.execute).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(1); expect(foldersCache.hasItems()).toBeTrue(); const newType = "xyz"; @@ -129,7 +137,7 @@ describe("ListFolders", () => { await newListFolders.useCase.execute(); - expect(gateway.execute).toHaveBeenCalledTimes(2); + expect(spy).toHaveBeenCalledTimes(2); expect(newFoldersCache.hasItems()).toBeTrue(); }); }); diff --git a/packages/app-aco/src/features/folders/listFoldersByParentIds/ListFoldersByParentIds.test.ts b/packages/app-aco/src/features/folders/listFoldersByParentIds/ListFoldersByParentIds.test.ts index 713152f18d5..d38286ae192 100644 --- a/packages/app-aco/src/features/folders/listFoldersByParentIds/ListFoldersByParentIds.test.ts +++ b/packages/app-aco/src/features/folders/listFoldersByParentIds/ListFoldersByParentIds.test.ts @@ -1,8 +1,8 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { ListFoldersByParentIds } from "./ListFoldersByParentIds.js"; import { folderCacheFactory } from "../cache/FoldersCacheFactory.js"; import { loadedFolderCacheFactory } from "../cache/LoadedFoldersCacheFactory.js"; import { ROOT_FOLDER } from "~/constants.js"; -import { jest } from "@jest/globals"; import type { IListFoldersByParentIdsGateway } from "~/features/folders/listFoldersByParentIds/IListFoldersByParentIdsGateway"; import { FolderGqlDto } from "~/features/folders/listFolders/FolderGqlDto"; @@ -15,7 +15,7 @@ describe("ListFoldersByParentIds", () => { beforeEach(() => { foldersCache.clear(); loadedFoldersCache.clear(); - jest.resetAllMocks(); + vi.resetAllMocks(); }); class ListFoldersByParentIdsMockGateway implements IListFoldersByParentIdsGateway { @@ -60,13 +60,15 @@ describe("ListFoldersByParentIds", () => { } ]); + const spy = vi.spyOn(gateway, "execute"); + const listByParentIdFolders = ListFoldersByParentIds.getInstance(type, gateway); expect(foldersCache.hasItems()).toBeFalse(); await listByParentIdFolders.useCase.execute({ parentIds: undefined }); - expect(gateway.execute).toHaveBeenCalledTimes(1); - expect(gateway.execute).toHaveBeenCalledWith({ parentIds: [ROOT_FOLDER], type }); + expect(spy).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledWith({ parentIds: [ROOT_FOLDER], type }); expect(foldersCache.hasItems()).toBeTrue(); expect(foldersCache.count()).toEqual(3); @@ -101,13 +103,15 @@ describe("ListFoldersByParentIds", () => { } ]); + const spy = vi.spyOn(gateway, "execute"); + const listByParentIdFolders = ListFoldersByParentIds.getInstance(type, gateway); expect(foldersCache.hasItems()).toBeFalse(); await listByParentIdFolders.useCase.execute({ parentIds: ["folder-0"] }); - expect(gateway.execute).toHaveBeenCalledTimes(1); - expect(gateway.execute).toHaveBeenCalledWith({ parentIds: ["folder-0"], type }); + expect(spy).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledWith({ parentIds: ["folder-0"], type }); expect(foldersCache.hasItems()).toBeTrue(); expect(foldersCache.count()).toEqual(3); @@ -159,6 +163,8 @@ describe("ListFoldersByParentIds", () => { } ]); + const spy = vi.spyOn(gateway, "execute"); + const listByParentIdFolders = ListFoldersByParentIds.getInstance(type, gateway); // Execute the useCase 3 times and check the gateway is invoked only when needed @@ -181,11 +187,11 @@ describe("ListFoldersByParentIds", () => { parentIds: ["folder-0", "folder-1", "folder-2"] }); - expect(gateway.execute).toHaveBeenNthCalledWith(1, { + expect(spy).toHaveBeenNthCalledWith(1, { parentIds: ["folder-0", "folder-1"], type }); - expect(gateway.execute).toHaveBeenNthCalledWith(2, { parentIds: ["folder-2"], type }); + expect(spy).toHaveBeenNthCalledWith(2, { parentIds: ["folder-2"], type }); expect(gateway.execute).not.toHaveBeenCalledTimes(3); }); @@ -196,15 +202,16 @@ describe("ListFoldersByParentIds", () => { } } - const emptyGateway = new ListFoldersByParentIdsEmptyMockGateway(); + const gateway = new ListFoldersByParentIdsEmptyMockGateway(); + const spy = vi.spyOn(gateway, "execute"); - const listByParentIdFolders = ListFoldersByParentIds.getInstance(type, emptyGateway); + const listByParentIdFolders = ListFoldersByParentIds.getInstance(type, gateway); expect(foldersCache.hasItems()).toBeFalse(); await listByParentIdFolders.useCase.execute({}); - expect(emptyGateway.execute).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(1); expect(foldersCache.hasItems()).toBeFalse(); const items = foldersCache.getItems(); @@ -219,6 +226,7 @@ describe("ListFoldersByParentIds", () => { } const errorGateway = new ListFoldersByParentIdsErrorMockGateway(); + const spy = vi.spyOn(errorGateway, "execute"); const listByParentIdFolders = ListFoldersByParentIds.getInstance(type, errorGateway); @@ -226,7 +234,7 @@ describe("ListFoldersByParentIds", () => { await expect(listByParentIdFolders.useCase.execute({})).rejects.toThrow("Gateway error"); - expect(errorGateway.execute).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(1); expect(foldersCache.hasItems()).toBeFalse(); }); @@ -255,6 +263,8 @@ describe("ListFoldersByParentIds", () => { } ]); + const spyA = vi.spyOn(gatewayAbc, "execute"); + const newType = "xyz"; const gatewayXyz = new ListFoldersByParentIdsMockGateway([ @@ -281,13 +291,15 @@ describe("ListFoldersByParentIds", () => { } ]); + const spyX = vi.spyOn(gatewayXyz, "execute"); + const listFoldersByParentId = ListFoldersByParentIds.getInstance(type, gatewayAbc); expect(foldersCache.hasItems()).toBeFalse(); await listFoldersByParentId.useCase.execute({}); - expect(gatewayAbc.execute).toHaveBeenCalledTimes(1); + expect(spyA).toHaveBeenCalledTimes(1); expect(foldersCache.hasItems()).toBeTrue(); const newFoldersCache = folderCacheFactory.getCache(newType); @@ -297,7 +309,7 @@ describe("ListFoldersByParentIds", () => { await newListFoldersByParentId.useCase.execute({}); - expect(gatewayXyz.execute).toHaveBeenCalledTimes(1); + expect(spyX).toHaveBeenCalledTimes(1); expect(newFoldersCache.hasItems()).toBeTrue(); }); }); diff --git a/packages/app-aco/src/features/folders/updateFolder/UpdateFolder.test.ts b/packages/app-aco/src/features/folders/updateFolder/UpdateFolder.test.ts index e8ba09df317..c029c84719b 100644 --- a/packages/app-aco/src/features/folders/updateFolder/UpdateFolder.test.ts +++ b/packages/app-aco/src/features/folders/updateFolder/UpdateFolder.test.ts @@ -1,9 +1,9 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { UpdateFolder } from "./UpdateFolder.js"; import { folderCacheFactory } from "../cache/FoldersCacheFactory.js"; import { Folder } from "../Folder.js"; import { type FolderPermission } from "@webiny/shared-aco/flp/flp.types.js"; import { ROOT_FOLDER } from "~/constants.js"; -import { jest } from "@jest/globals"; import type { IUpdateFolderGateway } from "~/features/folders/updateFolder/IUpdateFolderGateway"; import type { FolderGqlDto } from "~/features/folders/updateFolder/FolderGqlDto"; @@ -26,7 +26,7 @@ describe("UpdateFolder", () => { const foldersCache = folderCacheFactory.getCache(type); beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); foldersCache.clear(); foldersCache.addItems([ Folder.create({ @@ -50,6 +50,8 @@ describe("UpdateFolder", () => { type }); + const spy = vi.spyOn(gateway, "execute"); + const updateFolder = UpdateFolder.getInstance(type, gateway); expect(foldersCache.hasItems()).toBeTrue(); @@ -66,7 +68,7 @@ describe("UpdateFolder", () => { type }); - expect(gateway.execute).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(1); const updatedItem = foldersCache.getItem(folder => folder.id === "any-folder-id"); expect(updatedItem).toBeDefined(); @@ -79,6 +81,7 @@ describe("UpdateFolder", () => { it("should not update a folder if id is missing", async () => { const gateway = new UpdateFolderMockGateway(null); + const spy = vi.spyOn(gateway, "execute"); const updateFolder = UpdateFolder.getInstance(type, gateway); @@ -91,7 +94,7 @@ describe("UpdateFolder", () => { type }); - expect(gateway.execute).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(1); const updatedItem = foldersCache.getItem(folder => folder.id === "any-folder-id"); expect(updatedItem).toBeDefined(); @@ -423,6 +426,7 @@ describe("UpdateFolder", () => { } const gateway = new UpdateFolderErrorMockGateway(); + const spy = vi.spyOn(gateway, "execute"); const updateFolder = UpdateFolder.getInstance(type, gateway); @@ -437,6 +441,6 @@ describe("UpdateFolder", () => { }) ).rejects.toThrow("Gateway error"); - expect(gateway.execute).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledTimes(1); }); }); diff --git a/packages/app-aco/tsconfig.json b/packages/app-aco/tsconfig.json index 39acafe008c..a9e8095af5a 100644 --- a/packages/app-aco/tsconfig.json +++ b/packages/app-aco/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [ { "path": "../app" }, { "path": "../app-admin" }, diff --git a/packages/app-aco/vitest.config.ts b/packages/app-aco/vitest.config.ts new file mode 100644 index 00000000000..f12752ea827 --- /dev/null +++ b/packages/app-aco/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname, vitestConfig: { fileParallelism: true } }); +}; diff --git a/packages/app-admin/__tests__/components/BulkActions/Worker.test.ts b/packages/app-admin/__tests__/components/BulkActions/Worker.test.ts index 8b8df526879..aa0c6ddb71e 100644 --- a/packages/app-admin/__tests__/components/BulkActions/Worker.test.ts +++ b/packages/app-admin/__tests__/components/BulkActions/Worker.test.ts @@ -1,5 +1,5 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { CallbackParams, Worker } from "~/components/BulkActions/Worker"; -import { jest } from "@jest/globals"; interface Item { id: number; @@ -28,7 +28,7 @@ describe("Worker", () => { it("should process items using the provided callback", () => { const items = createMockItems(); - const mockCallback = jest.fn(); + const mockCallback = vi.fn(); worker.items = items; worker.process(mockCallback); @@ -42,7 +42,7 @@ describe("Worker", () => { const chunkSize = 5; worker.items = items; - const callbackFn = jest.fn(); + const callbackFn = vi.fn(); const mockCallback = async ({ item, diff --git a/packages/app-admin/jest.config.js b/packages/app-admin/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/app-admin/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/app-admin/src/components/IconPicker/IconPickerPresenter.test.ts b/packages/app-admin/src/components/IconPicker/IconPickerPresenter.test.ts index 168e2d493c5..c358c288c31 100644 --- a/packages/app-admin/src/components/IconPicker/IconPickerPresenter.test.ts +++ b/packages/app-admin/src/components/IconPicker/IconPickerPresenter.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { IconPickerPresenter } from "./IconPickerPresenter.js"; import { IconRepository } from "./IconRepository.js"; import { type Icon } from "./types.js"; diff --git a/packages/app-admin/src/components/IconPicker/IconRepository.test.ts b/packages/app-admin/src/components/IconPicker/IconRepository.test.ts index 42351cd3fa4..6c880898b9c 100644 --- a/packages/app-admin/src/components/IconPicker/IconRepository.test.ts +++ b/packages/app-admin/src/components/IconPicker/IconRepository.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { IconRepository } from "./IconRepository.js"; import { type Icon } from "./types.js"; diff --git a/packages/app-admin/vitest.config.ts b/packages/app-admin/vitest.config.ts new file mode 100644 index 00000000000..f12752ea827 --- /dev/null +++ b/packages/app-admin/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname, vitestConfig: { fileParallelism: true } }); +}; diff --git a/packages/app-file-manager/jest.config.js b/packages/app-file-manager/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/app-file-manager/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/app-file-manager/src/components/BulkActions/ActionEdit/ActionEditPresenter.test.ts b/packages/app-file-manager/src/components/BulkActions/ActionEdit/ActionEditPresenter.test.ts index 55791ab0d92..e5b872ed6ce 100644 --- a/packages/app-file-manager/src/components/BulkActions/ActionEdit/ActionEditPresenter.test.ts +++ b/packages/app-file-manager/src/components/BulkActions/ActionEdit/ActionEditPresenter.test.ts @@ -1,4 +1,4 @@ -import { jest } from "@jest/globals"; +import { describe, it, expect, beforeEach, vi } from "vitest"; import { ActionEditPresenter } from "./ActionEditPresenter.js"; import { type FieldRaw } from "~/components/BulkActions/ActionEdit/domain/index.js"; @@ -99,7 +99,7 @@ describe("ActionEditPresenter", () => { let presenter: ActionEditPresenter; beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); presenter = new ActionEditPresenter(); }); diff --git a/packages/app-file-manager/src/components/BulkActions/ActionEdit/BatchEditorDialog/BatchEditorDialogPresenter.test.ts b/packages/app-file-manager/src/components/BulkActions/ActionEdit/BatchEditorDialog/BatchEditorDialogPresenter.test.ts index 3921f32f719..004f6b57515 100644 --- a/packages/app-file-manager/src/components/BulkActions/ActionEdit/BatchEditorDialog/BatchEditorDialogPresenter.test.ts +++ b/packages/app-file-manager/src/components/BulkActions/ActionEdit/BatchEditorDialog/BatchEditorDialogPresenter.test.ts @@ -1,4 +1,4 @@ -import { jest } from "@jest/globals"; +import { describe, it, expect, beforeEach, vi } from "vitest"; import { BatchEditorDialogPresenter } from "./BatchEditorDialogPresenter.js"; import { type BatchDTO, @@ -89,7 +89,7 @@ describe("BatchEditorDialogPresenter", () => { let presenter: BatchEditorDialogPresenter; beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); presenter = new BatchEditorDialogPresenter(); }); @@ -351,8 +351,8 @@ describe("BatchEditorDialogPresenter", () => { it("should perform validation and call provided callbacks `onApply`", () => { presenter.load(batch, fields); - const onSuccess = jest.fn(); - const onError = jest.fn(); + const onSuccess = vi.fn(); + const onError = vi.fn(); presenter.setBatch({ operations: [ diff --git a/packages/app-file-manager/src/components/BulkActions/ActionEdit/BatchEditorDialog/BatchEditorDialogPresenter.tsx b/packages/app-file-manager/src/components/BulkActions/ActionEdit/BatchEditorDialog/BatchEditorDialogPresenter.tsx index e5fef46dfea..6289e88564a 100644 --- a/packages/app-file-manager/src/components/BulkActions/ActionEdit/BatchEditorDialog/BatchEditorDialogPresenter.tsx +++ b/packages/app-file-manager/src/components/BulkActions/ActionEdit/BatchEditorDialog/BatchEditorDialogPresenter.tsx @@ -57,7 +57,7 @@ export class BatchEditorDialogPresenter implements IBatchEditorDialogPresenter { get vm() { const operations = this.getOperations(); - const canAddOperation = operations[operations.length - 1].fieldOptions.length > 1 ?? false; + const canAddOperation = operations[operations.length - 1].fieldOptions.length > 1; return { invalidFields: this.invalidFields, diff --git a/packages/app-file-manager/src/components/BulkActions/ActionEdit/GraphQLInputMapper.test.ts b/packages/app-file-manager/src/components/BulkActions/ActionEdit/GraphQLInputMapper.test.ts index 44be6dfa508..1f0639b5117 100644 --- a/packages/app-file-manager/src/components/BulkActions/ActionEdit/GraphQLInputMapper.test.ts +++ b/packages/app-file-manager/src/components/BulkActions/ActionEdit/GraphQLInputMapper.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { GraphQLInputMapper } from "./GraphQLInputMapper.js"; import { type BatchDTO, OperatorType } from "~/components/BulkActions/ActionEdit/domain/index.js"; import { type FileItem } from "@webiny/app-admin/types.js"; diff --git a/packages/app-file-manager/vitest.config.ts b/packages/app-file-manager/vitest.config.ts new file mode 100644 index 00000000000..f12752ea827 --- /dev/null +++ b/packages/app-file-manager/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname, vitestConfig: { fileParallelism: true } }); +}; diff --git a/packages/app-headless-cms/jest.config.js b/packages/app-headless-cms/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/app-headless-cms/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/app-headless-cms/src/admin/components/ContentEntries/Filters/RefFieldRenderer/components/RefPresenter.test.ts b/packages/app-headless-cms/src/admin/components/ContentEntries/Filters/RefFieldRenderer/components/RefPresenter.test.ts index 22efef4e9dc..09c28e1e032 100644 --- a/packages/app-headless-cms/src/admin/components/ContentEntries/Filters/RefFieldRenderer/components/RefPresenter.test.ts +++ b/packages/app-headless-cms/src/admin/components/ContentEntries/Filters/RefFieldRenderer/components/RefPresenter.test.ts @@ -1,11 +1,11 @@ -import { jest } from "@jest/globals"; +import { describe, it, expect, beforeEach, vi } from "vitest"; import { RefPresenter } from "./RefPresenter.js"; import { type EntriesGatewayInterface } from "../adapters/index.js"; import { type EntryReference, EntryRepository } from "../domain/index.js"; const mockGateway: EntriesGatewayInterface = { - list: jest.fn() as EntriesGatewayInterface["list"], - get: jest.fn() as EntriesGatewayInterface["get"] + list: vi.fn() as EntriesGatewayInterface["list"], + get: vi.fn() as EntriesGatewayInterface["get"] }; const createMockGateway = ({ @@ -48,10 +48,10 @@ describe("RefPresenter", () => { }; const gateway = createMockGateway({ - list: jest.fn().mockImplementation(() => { + list: vi.fn().mockImplementation(() => { return Promise.resolve([entry1, entry2, entry3]); }) as EntriesGatewayInterface["list"], - get: jest.fn().mockImplementation(() => { + get: vi.fn().mockImplementation(() => { return Promise.resolve(entry1); }) as EntriesGatewayInterface["get"] }); @@ -59,7 +59,7 @@ describe("RefPresenter", () => { let presenter: RefPresenter; beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); const repository = new EntryRepository(gateway, [modelId]); presenter = new RefPresenter(repository); }); diff --git a/packages/app-headless-cms/vitest.config.ts b/packages/app-headless-cms/vitest.config.ts new file mode 100644 index 00000000000..f12752ea827 --- /dev/null +++ b/packages/app-headless-cms/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname, vitestConfig: { fileParallelism: true } }); +}; diff --git a/packages/app-page-builder/jest.config.js b/packages/app-page-builder/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/app-page-builder/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/app-page-builder/src/editor/contexts/EditorPageElementsProvider/__tests__/mediaToContainer.test.ts b/packages/app-page-builder/src/editor/contexts/EditorPageElementsProvider/mediaToContainer.test.ts similarity index 91% rename from packages/app-page-builder/src/editor/contexts/EditorPageElementsProvider/__tests__/mediaToContainer.test.ts rename to packages/app-page-builder/src/editor/contexts/EditorPageElementsProvider/mediaToContainer.test.ts index 76ce711967e..2eebc46cee8 100644 --- a/packages/app-page-builder/src/editor/contexts/EditorPageElementsProvider/__tests__/mediaToContainer.test.ts +++ b/packages/app-page-builder/src/editor/contexts/EditorPageElementsProvider/mediaToContainer.test.ts @@ -1,4 +1,5 @@ -import { mediaToContainer } from "../mediaToContainer.js"; +import { describe, it, expect } from "vitest"; +import { mediaToContainer } from "./mediaToContainer.js"; describe("mediaToContainer function should correctly transform @media into @container queries", () => { it("should correctly transform max-width", async () => { diff --git a/packages/app-page-builder/vitest.config.ts b/packages/app-page-builder/vitest.config.ts new file mode 100644 index 00000000000..f12752ea827 --- /dev/null +++ b/packages/app-page-builder/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname, vitestConfig: { fileParallelism: true } }); +}; diff --git a/packages/app-trash-bin/jest.config.js b/packages/app-trash-bin/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/app-trash-bin/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/app-trash-bin/src/Presentation/TrashBin/TrashBin.test.ts b/packages/app-trash-bin/src/Presentation/TrashBin/TrashBin.test.ts index 0bac68cbbfc..8caa08d1649 100644 --- a/packages/app-trash-bin/src/Presentation/TrashBin/TrashBin.test.ts +++ b/packages/app-trash-bin/src/Presentation/TrashBin/TrashBin.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { TrashBinPresenter } from "./TrashBinPresenter.js"; import { LoadingRepository, @@ -29,7 +30,6 @@ import { TrashBinItemsRepository, TrashBinItemsRepositoryWithLoading } from "~/Domain/Repositories/TrashBinItems/index.js"; -import { jest } from "@jest/globals"; interface Item { id: string; @@ -142,7 +142,7 @@ describe("TrashBin", () => { }; const listGateway = createBinListGateway({ - execute: jest + execute: vi .fn<(params: TrashBinListQueryVariables) => Promise<[Item[], TrashBinMetaResponse]>>() .mockImplementation(() => { return Promise.resolve([ @@ -153,19 +153,19 @@ describe("TrashBin", () => { }); const deleteItemGateway = createBinDeleteItemGateway({ - execute: jest.fn<(id: string) => Promise>().mockImplementation(() => { + execute: vi.fn<(id: string) => Promise>().mockImplementation(() => { return Promise.resolve(true); }) }); const restoreItemGateway = createBinRestoreItemGateway({ - execute: jest.fn<(id: string) => Promise>().mockImplementation(() => { + execute: vi.fn<(id: string) => Promise>().mockImplementation(() => { return Promise.resolve(item1); }) }); const bulkActionGateway = createBinBulkActionsGateway({ - execute: jest + execute: vi .fn< (params: TrashBinBulkActionsGatewayParams) => Promise >() @@ -222,7 +222,7 @@ describe("TrashBin", () => { }; beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it("should create a presenter and list trash bin entries from the gateway", async () => { @@ -280,7 +280,7 @@ describe("TrashBin", () => { it("should list more items from the gateway", async () => { const listGateway = createBinListGateway({ - execute: jest + execute: vi .fn< (params: TrashBinListQueryVariables) => Promise<[Item[], TrashBinMetaResponse]> >() @@ -365,7 +365,7 @@ describe("TrashBin", () => { it("should be able to sort items", async () => { const sortListGateway = createBinListGateway({ - execute: jest + execute: vi .fn< (params: TrashBinListQueryVariables) => Promise<[Item[], TrashBinMetaResponse]> >() @@ -439,7 +439,7 @@ describe("TrashBin", () => { it("should be able to search items", async () => { const searchItemsGateway = createBinListGateway({ - execute: jest + execute: vi .fn< (params: TrashBinListQueryVariables) => Promise<[Item[], TrashBinMetaResponse]> >() @@ -900,7 +900,7 @@ describe("TrashBin", () => { { // let's test the functionality by listing items that span multiple pages. const listGateway = createBinListGateway({ - execute: jest + execute: vi .fn< ( params: TrashBinListQueryVariables @@ -962,7 +962,7 @@ describe("TrashBin", () => { { // let's test the functionality by listing items that span only one page. const listGateway = createBinListGateway({ - execute: jest + execute: vi .fn< ( params: TrashBinListQueryVariables diff --git a/packages/app-trash-bin/vitest.config.ts b/packages/app-trash-bin/vitest.config.ts new file mode 100644 index 00000000000..f12752ea827 --- /dev/null +++ b/packages/app-trash-bin/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname, vitestConfig: { fileParallelism: true } }); +}; diff --git a/packages/cli/jest.config.js b/packages/cli/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/cli/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/form/__tests__/form.test.tsx b/packages/form/__tests__/form.test.tsx index 41885e33d89..115153a07a3 100644 --- a/packages/form/__tests__/form.test.tsx +++ b/packages/form/__tests__/form.test.tsx @@ -1,9 +1,6 @@ -/** -* @jest-environment jsdom -*/ +import { describe, test, expect, vi, MockedFunction, afterEach } from "vitest"; import React from "react"; -import { jest } from "@jest/globals"; -import { render, screen, waitFor, fireEvent, act } from "@testing-library/react"; +import { render, screen, waitFor, fireEvent, act, cleanup } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { Form, @@ -128,7 +125,7 @@ const FormViewWithHooks = ({ ); }; -const assert = async (view: React.ReactElement, onSubmit: jest.MockedFunction) => { +const assert = async (view: React.ReactElement, onSubmit: MockedFunction) => { render(view); const user = userEvent.setup(); const submitBtn = screen.getByRole("button", { name: /submit/i }); @@ -148,26 +145,22 @@ const assert = async (view: React.ReactElement, onSubmit: jest.MockedFunction { - // beforeEach(() => { - // jest.spyOn(window, 'requestAnimationFrame').mockImplementation(cb => cb()); - // }); - // - // afterEach(() => { - // window.requestAnimationFrame.mockRestore(); - // }); + afterEach(() => { + cleanup(); + }); test("should call `onSubmit` callback with correct field values using ``", async () => { - const onSubmit = jest.fn(); + const onSubmit = vi.fn(); await assert(, onSubmit); }); test("should call `onSubmit` callback with correct field values using `useBind()`", async () => { - const onSubmit = jest.fn(); + const onSubmit = vi.fn(); await assert(, onSubmit); }); test("should render validation error specified via the `invalidFields` prop", async () => { - const onSubmit = jest.fn(); + const onSubmit = vi.fn(); const { rerender } = render(); // anchor @@ -185,8 +178,8 @@ describe("Form", () => { test("should validate data on form submit", async () => { const user = userEvent.setup(); - const onSubmit = jest.fn(); - const onInvalid = jest.fn(); + const onSubmit = vi.fn(); + const onInvalid = vi.fn(); const formElement = ( @@ -248,7 +241,7 @@ describe("Form", () => { }); test("should validate data change immediately, without form submission", async () => { - const onInvalid = jest.fn(); + const onInvalid = vi.fn(); const formElement = ( @@ -275,7 +268,7 @@ describe("Form", () => { }); test("should submit form when Enter is pressed (if `submitOnEnter` prop is set)", async () => { - const onSubmit = jest.fn(); + const onSubmit = vi.fn(); const hitEnter = () => { const inputElement = screen.getByTestId("name"); @@ -295,7 +288,7 @@ describe("Form", () => { }); test("should execute the `onChange` callback whenever data is changed", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const user = userEvent.setup(); const formElement = ( @@ -323,7 +316,7 @@ describe("Form", () => { test("should set new data through props", async () => { const user = userEvent.setup(); - const onSubmit = jest.fn(); + const onSubmit = vi.fn(); const { rerender } = render(); @@ -341,7 +334,7 @@ describe("Form", () => { test("should set default field value on first render cycle", async () => { const ref = React.createRef(); - const onSubmit = jest.fn(); + const onSubmit = vi.fn(); render( @@ -351,9 +344,12 @@ describe("Form", () => { ); + await new Promise(resolve => setTimeout(resolve, 20)); + // Assert await act(() => ref.current?.submit()); await waitFor(() => onSubmit.mock.calls.length > 0); + expect(onSubmit).toHaveBeenLastCalledWith({ folder: { id: "root" } }); const folderDiv = screen.getByTestId("folderId"); @@ -364,7 +360,7 @@ describe("Form", () => { test("should submit the form using imperative handle", async () => { const user = userEvent.setup(); const ref = React.createRef(); - const onSubmit = jest.fn(); + const onSubmit = vi.fn(); render(); diff --git a/packages/form/__tests__/setupEnv.ts b/packages/form/__tests__/setupEnv.ts deleted file mode 100644 index acc39c345b6..00000000000 --- a/packages/form/__tests__/setupEnv.ts +++ /dev/null @@ -1,2 +0,0 @@ -// @ts-expect-error Mock `requestAnimationFrame`. -global.requestAnimationFrame = (fn: () => void) => fn(); diff --git a/packages/form/jest.config.js b/packages/form/jest.config.js deleted file mode 100644 index ef1281b54dc..00000000000 --- a/packages/form/jest.config.js +++ /dev/null @@ -1,6 +0,0 @@ -const base = require("../../jest.config.base"); - -module.exports = { - ...base({ path: __dirname }), - setupFilesAfterEnv: [require.resolve("./__tests__/setupEnv.ts")] -}; diff --git a/packages/form/src/FormPresenter.test.ts b/packages/form/src/FormPresenter.test.ts index c41ad792244..6dcb2c9291c 100644 --- a/packages/form/src/FormPresenter.test.ts +++ b/packages/form/src/FormPresenter.test.ts @@ -1,4 +1,4 @@ -import { jest } from "@jest/globals"; +import { describe, it, expect, vi } from "vitest"; import { validation } from "@webiny/validation"; import { FormPresenter } from "~/FormPresenter.js"; import { FormField } from "~/FormField.js"; @@ -26,8 +26,8 @@ describe("FormPresenter", () => { it("should register a field", async () => { const presenter = new FormPresenter(); - const beforeChangeSpy = jest.fn(); - const afterChangeSpy = jest.fn(); + const beforeChangeSpy = vi.fn(); + const afterChangeSpy = vi.fn(); presenter.init({ data: {} @@ -202,7 +202,7 @@ describe("FormPresenter", () => { }); it("should run form onChange callback", async () => { - const onChangeSpy = jest.fn(); + const onChangeSpy = vi.fn(); const presenter = new FormPresenter(); presenter.init({ @@ -226,7 +226,7 @@ describe("FormPresenter", () => { }); it("should run form onInvalid callback", async () => { - const onInvalidSpy = jest.fn(); + const onInvalidSpy = vi.fn(); const presenter = new FormPresenter(); presenter.init({ diff --git a/packages/form/vitest.config.ts b/packages/form/vitest.config.ts new file mode 100644 index 00000000000..0dd2e54dc80 --- /dev/null +++ b/packages/form/vitest.config.ts @@ -0,0 +1,11 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ + path: import.meta.dirname, + vitestConfig: { + environment: "jsdom", + fileParallelism: true + } + }); +}; diff --git a/packages/lexical-converter/__tests__/htmlToLexicalState.test.ts b/packages/lexical-converter/__tests__/htmlToLexicalState.test.ts index 945241dab41..e130e1bec78 100644 --- a/packages/lexical-converter/__tests__/htmlToLexicalState.test.ts +++ b/packages/lexical-converter/__tests__/htmlToLexicalState.test.ts @@ -1,12 +1,9 @@ -/** - * @jest-environment jsdom - */ +import { describe, it, expect } from "vitest"; import { LexicalNode } from "lexical"; import { $isHeadingNode } from "@webiny/lexical-nodes"; import { createMocks } from "./mocks/htmlMocks"; import { createHtmlToLexicalParser } from "~/index"; import { toBrowserDom, toJsDom } from "./utils/toDom"; -import { jest } from "@jest/globals"; const defaultParser = createHtmlToLexicalParser(); diff --git a/packages/lexical-converter/__tests__/stateTransformer.test.ts b/packages/lexical-converter/__tests__/stateTransformer.test.ts index 906683a509b..30de6725761 100644 --- a/packages/lexical-converter/__tests__/stateTransformer.test.ts +++ b/packages/lexical-converter/__tests__/stateTransformer.test.ts @@ -1,6 +1,4 @@ -/** - * @jest-environment jsdom - */ +import { describe, it, test, expect } from "vitest"; import { LexicalNode } from "lexical"; import { $isHeadingNode, @@ -14,7 +12,6 @@ import { } from "@webiny/lexical-nodes"; import { stateMock } from "./mocks/stateMocks"; import { createLexicalStateTransformer } from "~/createLexicalStateTransformer"; -import { jest } from "@jest/globals"; describe("Lexical State Transformer", () => { it("should flatten lexical editor state to an array of objects with HTML", () => { diff --git a/packages/lexical-converter/jest.config.js b/packages/lexical-converter/jest.config.js deleted file mode 100644 index c0266e49d71..00000000000 --- a/packages/lexical-converter/jest.config.js +++ /dev/null @@ -1,11 +0,0 @@ -const base = require("../../jest.config.base"); - -process.env.NODE_ENV = "development"; - -module.exports = { - ...base({ path: __dirname }), - moduleNameMapper: { - "\\.(css|sass)$": "identity-obj-proxy" - }, - setupFilesAfterEnv: [require.resolve("./__tests__/setup/setupEnv.ts")] -}; diff --git a/packages/lexical-converter/tsconfig.json b/packages/lexical-converter/tsconfig.json index 00de75ee3e6..273f7170b49 100644 --- a/packages/lexical-converter/tsconfig.json +++ b/packages/lexical-converter/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [{ "path": "../lexical-nodes" }], "compilerOptions": { "rootDirs": ["./src", "./__tests__"], diff --git a/packages/lexical-converter/vitest.config.ts b/packages/lexical-converter/vitest.config.ts new file mode 100644 index 00000000000..162701d6b76 --- /dev/null +++ b/packages/lexical-converter/vitest.config.ts @@ -0,0 +1,20 @@ +import * as path from "node:path"; +import { createTestConfig } from "../../testing"; + +export default async () => { + process.env.NODE_ENV = "development"; + + return createTestConfig({ + path: import.meta.dirname, + vitestConfig: { + environment: "jsdom", + alias: [ + { + find: /\.(css|sass)$/, + replacement: "identity-obj-proxy" + } + ], + setupFiles: [path.resolve(import.meta.dirname, "./__tests__/setup/setupEnv.ts")] + } + }); +}; diff --git a/packages/project-utils/testing/dynalite/index.js b/packages/project-utils/testing/dynalite/index.js index 9be9288f16c..0564e83ad5f 100644 --- a/packages/project-utils/testing/dynalite/index.js +++ b/packages/project-utils/testing/dynalite/index.js @@ -1,4 +1,4 @@ -// import "tsx"; +import { beforeAll, afterAll, beforeEach, afterEach } from "vitest"; import { logger } from "../logger.js"; import { clearStorageOps } from "../environment/index.js"; let setupInitiated = false; diff --git a/packages/project-utils/testing/presets/index.d.ts b/packages/project-utils/testing/presets/index.d.ts new file mode 100644 index 00000000000..6a553ef1cc2 --- /dev/null +++ b/packages/project-utils/testing/presets/index.d.ts @@ -0,0 +1,6 @@ +interface Preset { + setupFiles?: string[]; + setupFilesAfterEnv?: string[]; +} + +export function getPresets(...keywords: string[][]): Promise; diff --git a/packages/project-utils/testing/presets/index.js b/packages/project-utils/testing/presets/index.js index e4173b83202..c126c15bbd8 100644 --- a/packages/project-utils/testing/presets/index.js +++ b/packages/project-utils/testing/presets/index.js @@ -5,7 +5,7 @@ import yargs from "yargs"; import { hideBin } from "yargs/helpers"; import { PackageJson } from "../../utils/PackageJson.js"; -const getAllPackages = targetKeywords => { +const getAllPackages = (targetKeywords) => { const { storage = "ddb" } = yargs(hideBin(process.argv)); if (!storage) { diff --git a/packages/tasks/__tests__/crud/definitions.test.ts b/packages/tasks/__tests__/crud/definitions.test.ts index 07e21651a47..d396858314d 100644 --- a/packages/tasks/__tests__/crud/definitions.test.ts +++ b/packages/tasks/__tests__/crud/definitions.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useRawHandler } from "~tests/helpers/useRawHandler"; import { createTaskDefinition } from "~/task"; diff --git a/packages/tasks/__tests__/crud/store.test.ts b/packages/tasks/__tests__/crud/store.test.ts index fa4859ae280..91930953e27 100644 --- a/packages/tasks/__tests__/crud/store.test.ts +++ b/packages/tasks/__tests__/crud/store.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useRawHandler } from "~tests/helpers/useRawHandler"; import { createTaskDefinition } from "~/task"; import { ITask, TaskDataStatus } from "~/types"; diff --git a/packages/tasks/__tests__/crud/trigger.test.ts b/packages/tasks/__tests__/crud/trigger.test.ts index 6016717869d..b5b8eb6e555 100644 --- a/packages/tasks/__tests__/crud/trigger.test.ts +++ b/packages/tasks/__tests__/crud/trigger.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useRawHandler } from "~tests/helpers/useRawHandler"; import { createMockTaskDefinition, createMockTaskDefinitions } from "~tests/mocks/definition"; import { createMockIdentity } from "~tests/mocks/identity"; diff --git a/packages/tasks/__tests__/graphql/definitions.test.ts b/packages/tasks/__tests__/graphql/definitions.test.ts index 03badb1207d..306616e1b6f 100644 --- a/packages/tasks/__tests__/graphql/definitions.test.ts +++ b/packages/tasks/__tests__/graphql/definitions.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQLHandler } from "~tests/helpers/useGraphQLHandler"; import { createMockTaskDefinitions } from "~tests/mocks/definition"; diff --git a/packages/tasks/__tests__/graphql/logs.test.ts b/packages/tasks/__tests__/graphql/logs.test.ts index 8537d4d98d5..377d2096b6c 100644 --- a/packages/tasks/__tests__/graphql/logs.test.ts +++ b/packages/tasks/__tests__/graphql/logs.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQLHandler } from "~tests/helpers/useGraphQLHandler"; import { createMockTaskDefinitions } from "~tests/mocks/definition"; import { useRawHandler } from "~tests/helpers/useRawHandler"; diff --git a/packages/tasks/__tests__/graphql/tasks.test.ts b/packages/tasks/__tests__/graphql/tasks.test.ts index f2626628bee..c7445aa3d77 100644 --- a/packages/tasks/__tests__/graphql/tasks.test.ts +++ b/packages/tasks/__tests__/graphql/tasks.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQLHandler } from "~tests/helpers/useGraphQLHandler"; import { createMockTaskDefinitions } from "~tests/mocks/definition"; import { useRawHandler } from "~tests/helpers/useRawHandler"; diff --git a/packages/tasks/__tests__/response/response.test.ts b/packages/tasks/__tests__/response/response.test.ts index 70d11a9b94d..683884f14c5 100644 --- a/packages/tasks/__tests__/response/response.test.ts +++ b/packages/tasks/__tests__/response/response.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { Response, ResponseAbortedResult, diff --git a/packages/tasks/__tests__/runner/taskEventValidation.test.ts b/packages/tasks/__tests__/runner/taskEventValidation.test.ts index bf48d1ae7ad..4c483cba805 100644 --- a/packages/tasks/__tests__/runner/taskEventValidation.test.ts +++ b/packages/tasks/__tests__/runner/taskEventValidation.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { TaskEventValidation } from "~/runner/TaskEventValidation"; import { ITaskEvent } from "~/handler/types"; import WebinyError from "@webiny/error"; diff --git a/packages/tasks/__tests__/runner/taskRunnerAbort.test.ts b/packages/tasks/__tests__/runner/taskRunnerAbort.test.ts index de66e4ad863..fba1082964c 100644 --- a/packages/tasks/__tests__/runner/taskRunnerAbort.test.ts +++ b/packages/tasks/__tests__/runner/taskRunnerAbort.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { TaskRunner } from "~/runner"; import { createMockEvent } from "~tests/mocks"; import { ResponseAbortedResult } from "~/response"; diff --git a/packages/tasks/__tests__/runner/taskRunnerCreate.test.ts b/packages/tasks/__tests__/runner/taskRunnerCreate.test.ts index cb2da41b3d1..525bf820374 100644 --- a/packages/tasks/__tests__/runner/taskRunnerCreate.test.ts +++ b/packages/tasks/__tests__/runner/taskRunnerCreate.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { TaskRunner } from "~/runner"; import { createLiveContextFactory } from "~tests/live"; import { taskDefinition } from "~tests/runner/taskDefinition"; diff --git a/packages/tasks/__tests__/runner/taskRunnerErrorFailedState.test.ts b/packages/tasks/__tests__/runner/taskRunnerErrorFailedState.test.ts index cc91343a758..173598da5ea 100644 --- a/packages/tasks/__tests__/runner/taskRunnerErrorFailedState.test.ts +++ b/packages/tasks/__tests__/runner/taskRunnerErrorFailedState.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { TaskRunner } from "~/runner"; import { createMockEvent } from "~tests/mocks"; import { ResponseErrorResult } from "~/response"; diff --git a/packages/tasks/__tests__/runner/taskRunnerErrorSuccessState.test.ts b/packages/tasks/__tests__/runner/taskRunnerErrorSuccessState.test.ts index 9849514144f..dd022953c6b 100644 --- a/packages/tasks/__tests__/runner/taskRunnerErrorSuccessState.test.ts +++ b/packages/tasks/__tests__/runner/taskRunnerErrorSuccessState.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { TaskRunner } from "~/runner"; import { createMockEvent } from "~tests/mocks"; import { ResponseErrorResult } from "~/response"; diff --git a/packages/tasks/__tests__/runner/taskRunnerSuccess.test.ts b/packages/tasks/__tests__/runner/taskRunnerSuccess.test.ts index 2704d4325d4..cd66968fecb 100644 --- a/packages/tasks/__tests__/runner/taskRunnerSuccess.test.ts +++ b/packages/tasks/__tests__/runner/taskRunnerSuccess.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { TaskRunner } from "~/runner"; import { createMockEvent, createMockIdentity } from "~tests/mocks"; import { ResponseContinueResult, ResponseDoneResult } from "~/response"; diff --git a/packages/tasks/__tests__/runner/taskRunnerTaskNotFound.test.ts b/packages/tasks/__tests__/runner/taskRunnerTaskNotFound.test.ts index 74abe641cbe..469c22871dd 100644 --- a/packages/tasks/__tests__/runner/taskRunnerTaskNotFound.test.ts +++ b/packages/tasks/__tests__/runner/taskRunnerTaskNotFound.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { TaskRunner } from "~/runner"; import { createMockEvent } from "~tests/mocks"; import { ResponseErrorResult } from "~/response"; diff --git a/packages/tasks/__tests__/runner/taskTenantAndLocale.test.ts b/packages/tasks/__tests__/runner/taskTenantAndLocale.test.ts index 221c8995bc5..e4ad0f1ec5f 100644 --- a/packages/tasks/__tests__/runner/taskTenantAndLocale.test.ts +++ b/packages/tasks/__tests__/runner/taskTenantAndLocale.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { createMockEvent } from "~tests/mocks"; import { createLiveContextFactory } from "~tests/live"; import { createTaskDefinition } from "~/task"; diff --git a/packages/tasks/__tests__/task/input.test.ts b/packages/tasks/__tests__/task/input.test.ts index 1e860a7ad84..3a5526760c9 100644 --- a/packages/tasks/__tests__/task/input.test.ts +++ b/packages/tasks/__tests__/task/input.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { createTaskInput } from "~/task"; interface MyInput { diff --git a/packages/tasks/__tests__/task/plugin.test.ts b/packages/tasks/__tests__/task/plugin.test.ts index c0ac9f63e8f..e4ac4f430be 100644 --- a/packages/tasks/__tests__/task/plugin.test.ts +++ b/packages/tasks/__tests__/task/plugin.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import WebinyError from "@webiny/error"; import { Context } from "../types"; import { ITaskDefinition, ITaskDefinitionField, ITaskRunParams } from "~/types"; diff --git a/packages/tasks/jest.setup.js b/packages/tasks/jest.setup.js deleted file mode 100644 index 049095053ae..00000000000 --- a/packages/tasks/jest.setup.js +++ /dev/null @@ -1,11 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/tasks/tsconfig.json b/packages/tasks/tsconfig.json index 18bc6e09ee4..9030dbed621 100644 --- a/packages/tasks/tsconfig.json +++ b/packages/tasks/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.setup.ts"], "references": [ { "path": "../api" }, { "path": "../api-headless-cms" }, diff --git a/packages/tasks/vitest.setup.ts b/packages/tasks/vitest.setup.ts new file mode 100644 index 00000000000..c6e2ef77e91 --- /dev/null +++ b/packages/tasks/vitest.setup.ts @@ -0,0 +1,16 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ + path: import.meta.dirname, + presets + }); +}; diff --git a/packages/ui/src/Input/__tests__/Input.test.tsx b/packages/ui/src/Input/__tests__/Input.test.tsx deleted file mode 100644 index e70011505c1..00000000000 --- a/packages/ui/src/Input/__tests__/Input.test.tsx +++ /dev/null @@ -1,90 +0,0 @@ -/** -* @jest-environment jsdom -*/ -import React from "react"; -import { jest } from "@jest/globals"; -import { cleanup, render } from "@testing-library/react"; -import { Input } from "../index.js"; - -afterEach(cleanup); - -interface SetupProps { - onChange?: () => void; -} - -function setup(props: SetupProps = {}) { - const renderArg = { - // eslint-disable-next-line - onChange: (_: string) => {}, - value: null - }; - - // We cast "as unknown as React.ReactNode" here because renderProp has a "jest.Mock" type, - // but the "Input" component expect React.ReactNode to be the type of the "children" property. - const renderProp = jest.fn(controllerArg => { - Object.assign(renderArg, controllerArg); - return null; - }) as unknown as React.ReactNode; - - const onChange = props.onChange - ? props.onChange - : () => { - return void 0; - }; - - class Test extends React.Component { - public override state = { value: "init-value" }; - - onChange = (value: string) => { - this.setState({ value }); - }; - - public override render() { - return ( - - {renderProp} - - ); - } - } - - const utils = render(); - - return { renderArg, ...utils }; -} - -/** - * This return a function that will call all the given functions with - * the arguments with which it's called. It does a null-check before - * attempting to call the functions and can take any number of functions. - * @param {...Function} fns the functions to call - * @return {Function} the function that calls all the functions - */ -function callAll(...fns: ((...params: any) => void)[]) { - return (...args: any) => { - fns.forEach(fn => { - fn && fn(...args); - }); - }; -} - -describe("Input tests", () => { - test("passes expected props to render prop", () => { - const { renderArg } = setup(); - - expect(renderArg).toContainKeys(["value", "validation", "onChange", "onBlur"]); - }); - - test("updates value via onChange", () => { - const { renderArg } = setup(); - expect(renderArg.value).toBe("init-value"); - renderArg.onChange("new-value"); - expect(renderArg.value).toBe("new-value"); - renderArg.onChange("third-value"); - expect(renderArg.value).toBe("third-value"); - }); -}); diff --git a/packages/utils/__tests__/compose.test.ts b/packages/utils/__tests__/compose.test.ts index 57880353f8b..5a32119fe29 100644 --- a/packages/utils/__tests__/compose.test.ts +++ b/packages/utils/__tests__/compose.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { AsyncProcessor, composeAsync, SyncProcessor, composeSync } from "~/compose"; interface ValueFnParams { diff --git a/packages/utils/__tests__/compression/gzip.test.ts b/packages/utils/__tests__/compression/gzip.test.ts index 548bbe00afd..5a933d91025 100644 --- a/packages/utils/__tests__/compression/gzip.test.ts +++ b/packages/utils/__tests__/compression/gzip.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { compress, decompress } from "~/compression/gzip"; const testingData = Object.freeze({ diff --git a/packages/utils/__tests__/compression/jsonpack.test.ts b/packages/utils/__tests__/compression/jsonpack.test.ts index 84865d6ad91..570d0e2380e 100644 --- a/packages/utils/__tests__/compression/jsonpack.test.ts +++ b/packages/utils/__tests__/compression/jsonpack.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { compress, decompress } from "~/compression/jsonpack"; const testingData = Object.freeze({ diff --git a/packages/utils/__tests__/createIdentifier.test.ts b/packages/utils/__tests__/createIdentifier.test.ts index f4818c14861..3f61e3f2f3f 100644 --- a/packages/utils/__tests__/createIdentifier.test.ts +++ b/packages/utils/__tests__/createIdentifier.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { createIdentifier } from "~/createIdentifier"; describe("create identifier", () => { diff --git a/packages/utils/__tests__/createZodError.test.ts b/packages/utils/__tests__/createZodError.test.ts index 6967cc6202c..8adbcd99119 100644 --- a/packages/utils/__tests__/createZodError.test.ts +++ b/packages/utils/__tests__/createZodError.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import zod from "zod"; import { createZodError } from "~/createZodError"; diff --git a/packages/utils/__tests__/cursor.test.ts b/packages/utils/__tests__/cursor.test.ts index 268cca364b0..7dfa40c13bf 100644 --- a/packages/utils/__tests__/cursor.test.ts +++ b/packages/utils/__tests__/cursor.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { encodeCursor, decodeCursor, CursorInput, CursorOutput } from "~/cursor"; describe("Cursor", () => { diff --git a/packages/utils/__tests__/generateId.test.ts b/packages/utils/__tests__/generateId.test.ts index 6770b05979d..25ead578939 100644 --- a/packages/utils/__tests__/generateId.test.ts +++ b/packages/utils/__tests__/generateId.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { generateAlphaLowerCaseId, generateAlphaNumericId, diff --git a/packages/utils/__tests__/headers.test.ts b/packages/utils/__tests__/headers.test.ts index 9ba34897092..d64d095ecd2 100644 --- a/packages/utils/__tests__/headers.test.ts +++ b/packages/utils/__tests__/headers.test.ts @@ -1,3 +1,4 @@ +import { describe, test, it, expect } from "vitest"; import { getWebinyVersionHeaders } from "~/index"; import { WEBINY_VERSION_HEADER } from "~/headers"; diff --git a/packages/utils/__tests__/parseIdentifier.test.ts b/packages/utils/__tests__/parseIdentifier.test.ts index c7771834a4a..d03c86ee49e 100644 --- a/packages/utils/__tests__/parseIdentifier.test.ts +++ b/packages/utils/__tests__/parseIdentifier.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { parseIdentifier, ParseIdentifierResult } from "~/parseIdentifier"; type Input = [string, ParseIdentifierResult]; diff --git a/packages/utils/__tests__/zeroPad.test.ts b/packages/utils/__tests__/zeroPad.test.ts index daf689c993e..1eef2274aac 100644 --- a/packages/utils/__tests__/zeroPad.test.ts +++ b/packages/utils/__tests__/zeroPad.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { zeroPad } from "~/zeroPad"; describe("zero pad", () => { diff --git a/packages/utils/jest.config.js b/packages/utils/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/utils/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json index f1a4a0672eb..741af2b71da 100644 --- a/packages/utils/tsconfig.json +++ b/packages/utils/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [{ "path": "../error" }, { "path": "../plugins" }], "compilerOptions": { "rootDirs": ["./src", "./__tests__"], diff --git a/packages/utils/vitest.config.ts b/packages/utils/vitest.config.ts new file mode 100644 index 00000000000..77c26269023 --- /dev/null +++ b/packages/utils/vitest.config.ts @@ -0,0 +1,10 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ + path: import.meta.dirname, + vitestConfig: { + fileParallelism: true + } + }); +}; diff --git a/packages/validation/__tests__/create.test.js b/packages/validation/__tests__/create.test.js index bd4b1cec537..776f2702ea8 100644 --- a/packages/validation/__tests__/create.test.js +++ b/packages/validation/__tests__/create.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation } from "../src"; describe("create test", () => { diff --git a/packages/validation/__tests__/creditCard.test.js b/packages/validation/__tests__/creditCard.test.js index 9bf1f9dc899..a39e20e9af2 100644 --- a/packages/validation/__tests__/creditCard.test.js +++ b/packages/validation/__tests__/creditCard.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("creditCard test", () => { diff --git a/packages/validation/__tests__/dateGte.test.js b/packages/validation/__tests__/dateGte.test.js index a8b88647759..c360b30f6a0 100644 --- a/packages/validation/__tests__/dateGte.test.js +++ b/packages/validation/__tests__/dateGte.test.js @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { validation } from "../src"; const gteValidationDateCorrectValues = [ diff --git a/packages/validation/__tests__/dateLte.test.js b/packages/validation/__tests__/dateLte.test.js index ed84e978716..18f56e627f5 100644 --- a/packages/validation/__tests__/dateLte.test.js +++ b/packages/validation/__tests__/dateLte.test.js @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { validation } from "../src"; const lteValidationDateCorrectValues = [ diff --git a/packages/validation/__tests__/email.test.js b/packages/validation/__tests__/email.test.js index d0683b2dac6..5444435dbe7 100644 --- a/packages/validation/__tests__/email.test.js +++ b/packages/validation/__tests__/email.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("email test", () => { diff --git a/packages/validation/__tests__/empty.test.js b/packages/validation/__tests__/empty.test.js index 49c15c4a599..92648d22a07 100644 --- a/packages/validation/__tests__/empty.test.js +++ b/packages/validation/__tests__/empty.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation } from "../src"; describe("empty validators test", () => { diff --git a/packages/validation/__tests__/eq.test.js b/packages/validation/__tests__/eq.test.js index e499fd4723b..4bc3f73a3fb 100644 --- a/packages/validation/__tests__/eq.test.js +++ b/packages/validation/__tests__/eq.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("eq test", () => { diff --git a/packages/validation/__tests__/errors.test.js b/packages/validation/__tests__/errors.test.js index 3d6be591446..9eb7cfe0ab8 100644 --- a/packages/validation/__tests__/errors.test.js +++ b/packages/validation/__tests__/errors.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("disabling error throwing test", () => { diff --git a/packages/validation/__tests__/gt.test.js b/packages/validation/__tests__/gt.test.js index e852aa67145..864e75935e0 100644 --- a/packages/validation/__tests__/gt.test.js +++ b/packages/validation/__tests__/gt.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("gt test", () => { diff --git a/packages/validation/__tests__/gte.test.js b/packages/validation/__tests__/gte.test.js index 5b1fd12de07..d08452fbaac 100644 --- a/packages/validation/__tests__/gte.test.js +++ b/packages/validation/__tests__/gte.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("gte test", () => { diff --git a/packages/validation/__tests__/in.test.js b/packages/validation/__tests__/in.test.js index 69bda1b5e3f..fbcc97c2368 100644 --- a/packages/validation/__tests__/in.test.js +++ b/packages/validation/__tests__/in.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("in test", () => { diff --git a/packages/validation/__tests__/integer.test.js b/packages/validation/__tests__/integer.test.js index 92573e1a0fb..88f1e4ca5a8 100644 --- a/packages/validation/__tests__/integer.test.js +++ b/packages/validation/__tests__/integer.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("integer test", () => { diff --git a/packages/validation/__tests__/invalidValidators.test.js b/packages/validation/__tests__/invalidValidators.test.js index a59e6b28d2c..067bc17e25b 100644 --- a/packages/validation/__tests__/invalidValidators.test.js +++ b/packages/validation/__tests__/invalidValidators.test.js @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("invalid validators test", () => { diff --git a/packages/validation/__tests__/json.test.js b/packages/validation/__tests__/json.test.js index d14452887c4..e870cd1a98e 100644 --- a/packages/validation/__tests__/json.test.js +++ b/packages/validation/__tests__/json.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("JSON test", () => { diff --git a/packages/validation/__tests__/lt.test.js b/packages/validation/__tests__/lt.test.js index c371f6f25b6..a750b1a657a 100644 --- a/packages/validation/__tests__/lt.test.js +++ b/packages/validation/__tests__/lt.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("lt test", () => { diff --git a/packages/validation/__tests__/lte.test.js b/packages/validation/__tests__/lte.test.js index d5cc6fcf221..4c37da0bce7 100644 --- a/packages/validation/__tests__/lte.test.js +++ b/packages/validation/__tests__/lte.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("lte test", () => { diff --git a/packages/validation/__tests__/maxLength.test.js b/packages/validation/__tests__/maxLength.test.js index a8f384ba1e3..7232424643d 100644 --- a/packages/validation/__tests__/maxLength.test.js +++ b/packages/validation/__tests__/maxLength.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("maxLength test", () => { diff --git a/packages/validation/__tests__/minLength.test.js b/packages/validation/__tests__/minLength.test.js index 652b1c27df7..f76bf0a7c9d 100644 --- a/packages/validation/__tests__/minLength.test.js +++ b/packages/validation/__tests__/minLength.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("minLength test", () => { diff --git a/packages/validation/__tests__/multipleValidators.test.js b/packages/validation/__tests__/multipleValidators.test.js index 88c1f6b5cab..6a7f0651513 100644 --- a/packages/validation/__tests__/multipleValidators.test.js +++ b/packages/validation/__tests__/multipleValidators.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("multiple validators test", () => { diff --git a/packages/validation/__tests__/number.test.js b/packages/validation/__tests__/number.test.js index ee567fb1c84..84a0f9aa36d 100644 --- a/packages/validation/__tests__/number.test.js +++ b/packages/validation/__tests__/number.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("number test", () => { diff --git a/packages/validation/__tests__/numeric.test.js b/packages/validation/__tests__/numeric.test.js index 3e4099b372e..de1179b3f40 100644 --- a/packages/validation/__tests__/numeric.test.js +++ b/packages/validation/__tests__/numeric.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("numeric test", () => { diff --git a/packages/validation/__tests__/password.test.js b/packages/validation/__tests__/password.test.js index 7c764a69ebe..86deeb4caf6 100644 --- a/packages/validation/__tests__/password.test.js +++ b/packages/validation/__tests__/password.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("password test", () => { diff --git a/packages/validation/__tests__/phone.test.js b/packages/validation/__tests__/phone.test.js index ea000ae936b..8a36b5c7a08 100644 --- a/packages/validation/__tests__/phone.test.js +++ b/packages/validation/__tests__/phone.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("phone test", () => { diff --git a/packages/validation/__tests__/required.test.js b/packages/validation/__tests__/required.test.js index 92e2783188c..a9e2cf60bf3 100644 --- a/packages/validation/__tests__/required.test.js +++ b/packages/validation/__tests__/required.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("required test", () => { diff --git a/packages/validation/__tests__/slug.test.js b/packages/validation/__tests__/slug.test.js index 54d915395da..8ad9cd1c512 100644 --- a/packages/validation/__tests__/slug.test.js +++ b/packages/validation/__tests__/slug.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("slug test", () => { diff --git a/packages/validation/__tests__/syncAsyncValidation.test.js b/packages/validation/__tests__/syncAsyncValidation.test.js index 1e37cf5e47e..7edce331e8b 100644 --- a/packages/validation/__tests__/syncAsyncValidation.test.js +++ b/packages/validation/__tests__/syncAsyncValidation.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("async/sync validation test", () => { diff --git a/packages/validation/__tests__/timeGte.test.js b/packages/validation/__tests__/timeGte.test.js index e5991bee458..d38ab4b200d 100644 --- a/packages/validation/__tests__/timeGte.test.js +++ b/packages/validation/__tests__/timeGte.test.js @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { validation } from "../src"; const gteValidationTimeCorrectValues = [ diff --git a/packages/validation/__tests__/timeLte.test.js b/packages/validation/__tests__/timeLte.test.js index 85a73b4f0bb..7a7c64c9c6c 100644 --- a/packages/validation/__tests__/timeLte.test.js +++ b/packages/validation/__tests__/timeLte.test.js @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { validation } from "../src"; const lteValidationTimeCorrectValues = [ diff --git a/packages/validation/__tests__/url.test.js b/packages/validation/__tests__/url.test.js index 9445a3dd22b..2fb3e2f9f51 100644 --- a/packages/validation/__tests__/url.test.js +++ b/packages/validation/__tests__/url.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { validation, ValidationError } from "../src"; describe("url test", () => { diff --git a/packages/validation/__tests__/validationError.test.js b/packages/validation/__tests__/validationError.test.js index 28a7d8b1220..6b2bf0ce043 100644 --- a/packages/validation/__tests__/validationError.test.js +++ b/packages/validation/__tests__/validationError.test.js @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { ValidationError } from "../src"; describe("ValidationError class test", function () { diff --git a/packages/validation/__tests__/validatorRegistration.test.js b/packages/validation/__tests__/validatorRegistration.test.js index 267c4a383fa..90b0d23d8d9 100644 --- a/packages/validation/__tests__/validatorRegistration.test.js +++ b/packages/validation/__tests__/validatorRegistration.test.js @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { validation, ValidationError } from "../src"; validation.setValidator("gender", value => { diff --git a/packages/validation/jest.config.js b/packages/validation/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/validation/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/validation/tsconfig.json b/packages/validation/tsconfig.json index 6ca26f3c929..3f3851da295 100644 --- a/packages/validation/tsconfig.json +++ b/packages/validation/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [], "compilerOptions": { "rootDirs": ["./src", "./__tests__"], diff --git a/packages/validation/vitest.config.ts b/packages/validation/vitest.config.ts new file mode 100644 index 00000000000..77c26269023 --- /dev/null +++ b/packages/validation/vitest.config.ts @@ -0,0 +1,10 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ + path: import.meta.dirname, + vitestConfig: { + fileParallelism: true + } + }); +}; diff --git a/testing/createTestConfig.ts b/testing/createTestConfig.ts new file mode 100644 index 00000000000..b3b8dd2b731 --- /dev/null +++ b/testing/createTestConfig.ts @@ -0,0 +1,75 @@ +import { basename, join } from "path"; +import fs from "fs"; +import type { ViteUserConfig } from "vitest/config"; + +type Alias = Extract["alias"], { find: any }>; + +type TestPreset = { + setupFiles?: string[]; + setupFilesAfterEnv?: string[]; +}; + +type CreateTestConfigParams = { + path: string; + presets?: TestPreset[]; + vitestConfig?: ViteUserConfig["test"]; +}; + +export const createTestConfig = async ({ + path, + presets = [], + vitestConfig = {} +}: CreateTestConfigParams): Promise> => { + const name = basename(path); + + const { PackageJson } = await import("@webiny/project-utils/utils/PackageJson.js"); + const cliPackage = await PackageJson.fromPackage("@webiny/cli"); + const version = cliPackage.getJson().version; + + process.env.DB_TABLE = "DynamoDB"; + process.env.DB_TABLE_ELASTICSEARCH = "ElasticsearchStream"; + process.env.DB_TABLE_LOG = "DynamoDBLog"; + process.env.WEBINY_VERSION = version; + process.env.WEBINY_ELASTICSEARCH_INDEX_LOCALE = "true"; + + // Enables us to run tests of only a specific type (for example "integration" or "e2e"). + let type = ""; + if (process.env.TEST_TYPE) { + type = `.${process.env.TEST_TYPE}`; + } + + process.env.JEST_DYNALITE_CONFIG_DIRECTORY = path; + + const project: ViteUserConfig["test"] = { + name: name, + include: [`${path}/**/*${type}.test.[jt]s?(x)`], + dir: path, + ...vitestConfig, + alias: [ + { + find: /^~tests(.*)/, + replacement: `${path}/__tests__$1` + }, + { find: /^~(.*)/, replacement: `${path}/src$1` }, + ...((vitestConfig.alias ?? []) as Alias) + ] + // globals: { TODO: add this via a setupFile + // WEBINY_VERSION: version + // }, + }; + + const setupAfterEnv = join(path, "__tests__", "setup", "setupAfterEnv.js"); + const setupAfterEnvExists = fs.existsSync(setupAfterEnv); + + project.setupFiles = [ + ...presets.map(preset => preset.setupFiles || []), + ...presets.map(preset => preset.setupFilesAfterEnv || []), + setupAfterEnvExists ? setupAfterEnv : undefined + ] + .flat() + .filter(Boolean) as string[]; + + process.stdout.write(`\n---------------------------\n`); + + return project; +}; diff --git a/testing/index.ts b/testing/index.ts new file mode 100644 index 00000000000..cbe7d3ef40b --- /dev/null +++ b/testing/index.ts @@ -0,0 +1 @@ +export { createTestConfig } from "./createTestConfig"; diff --git a/testing/setupFile.ts b/testing/setupFile.ts new file mode 100644 index 00000000000..dc7c31721a0 --- /dev/null +++ b/testing/setupFile.ts @@ -0,0 +1,4 @@ +import { expect } from "vitest"; +import * as matchers from "jest-extended"; + +expect.extend(matchers as any); diff --git a/testing/vitest.config.ts b/testing/vitest.config.ts new file mode 100644 index 00000000000..40d8387ce63 --- /dev/null +++ b/testing/vitest.config.ts @@ -0,0 +1,124 @@ +import "tsx"; +import { defineConfig } from "vitest/config"; +import fg from "fast-glob"; +import path from "path"; +import chalk from "chalk"; +import * as dotenv from "dotenv"; + +const { blueBright } = chalk; + +function sanitizeEsIndexName(name: string | undefined) { + if (!name) { + return undefined; + } + + if ("GITHUB_RUN_ID" in process.env) { + return `${process.env["GITHUB_RUN_ID"]}_${name}_`; + } + + return name; +} + +const findOneOf = (names: string[], dir: string) => { + const matches = fg.sync([`**/{${names.join(",")}}`], { + cwd: dir, + absolute: true, + onlyFiles: true + }); + + return matches[0]; +}; + +const createPackageTestConfigPath = (pkg: string) => { + const found = findOneOf(["vitest.config.ts", "vitest.config.js", "jest.config.js"], pkg); + if (!found) { + return null; + } + return found; +}; + +const createPackageJestSetupPath = (pkg: string) => { + const found = findOneOf(["vitest.setup.ts", "vitest.setup.js", "jest.setup.js"], pkg); + + if (!found) { + return null; + } + return found; +}; + +const importConfig = async (configPath: string) => { + return import(configPath) + .then(m => m.default ?? m) + .then(config => { + if (typeof config === "function") { + return config(); + } + return config; + }); +}; + +const getPackageTestSetup = async (pkg: string) => { + const setupPath = createPackageJestSetupPath(pkg); + if (!setupPath) { + return null; + } + return await importConfig(setupPath); +}; + +export default async () => { + // Sanitize ElasticsearchPrefix + const esIndexPrefix = sanitizeEsIndexName(process.env.ELASTIC_SEARCH_INDEX_PREFIX); + + if (esIndexPrefix) { + process.env.ELASTIC_SEARCH_INDEX_PREFIX = esIndexPrefix; + process.stdout.write(`\nES index prefix: ${blueBright(esIndexPrefix)}\n\n`); + } + + // Loads environment variables defined in the project root ".env" file. + const { parsed } = dotenv.config({ path: path.join(import.meta.dirname, ".env") }); + if (parsed) { + ["WCP_PROJECT_ID", "WCP_PROJECT_ENVIRONMENT", "WCP_PROJECT_LICENSE"].forEach(key => { + delete parsed[key]; + delete process.env[key]; + }); + + console.log('The following environment variables were included from the root ".env" file:'); + console.log( + Object.keys(parsed).reduce((current, item) => { + return current + `‣ ${item}\n`; + }, "") + ); + } + + const { getPackageMeta } = await import("./vitest.project.js"); + + const packageMeta = await getPackageMeta(); + + const configPath = createPackageTestConfigPath(packageMeta.packageRoot); + const setup = await getPackageTestSetup(packageMeta.packageRoot); + + if (!configPath && !setup) { + throw new Error( + `${packageMeta.packageName} is missing a jest.config.js or a jest.setup.js file!` + ); + } + + const project = configPath ? await importConfig(configPath) : setup; + + project.rootDir = process.cwd(); + + return defineConfig({ + resolve: { + alias: { + "graphql/language/index.js": "graphql/language/index.js", + "graphql/language/ast.js": "graphql/language/ast.js", + graphql: "graphql/index.js" + } + }, + test: { + fileParallelism: process.env.CI === "true", + ...project, + setupFiles: [path.resolve(import.meta.dirname, "./setupFile.js"), ...project.setupFiles] + } + }); +}; diff --git a/testing/vitest.project.ts b/testing/vitest.project.ts new file mode 100644 index 00000000000..85c29fb752c --- /dev/null +++ b/testing/vitest.project.ts @@ -0,0 +1,56 @@ +import fs from "fs-extra"; +import path from "path"; + +const getPackageMetaFromPackageJson = (pkgJson: any) => { + return { + packageName: pkgJson.getJson().name, + packageRoot: path.dirname(pkgJson.getLocation()) + }; +}; + +const getPackageMetaFromPath = async (value: string) => { + const { PackageJson } = await import("@webiny/project-utils/utils/PackageJson.js"); + // The exact test file path usually happens when we run tests via IDE. + const request = path.resolve(value); + + if (fs.existsSync(request)) { + const pkgJson = await PackageJson.findClosest(request); + const stat = fs.lstatSync(request); + + const testMatch = stat.isFile() ? [request] : [`${request}/**/*.test.[jt]s?(x)`]; + + return { ...getPackageMetaFromPackageJson(pkgJson), testMatch }; + } + + // `yarn test api-headless-cms` + if (!value.includes(".") && !value.includes("/")) { + // Means we're testing a package from `packages` folder. + const request = path.resolve("packages", value); + const pkgJson = await PackageJson.findClosest(request); + + return { + ...getPackageMetaFromPackageJson(pkgJson), + testMatch: [`${request}/**/*.test.[jt]s?(x)`] + }; + } + + // For all other use cases, we simply assume it's a relative path from project root. + //E.g., packages/validation, scripts/cjsToEsm + const pkgJson = await PackageJson.findClosest(request); + return { + ...getPackageMetaFromPackageJson(pkgJson), + testMatch: [`${request}/**/*.test.[jt]s?(x)`] + }; +}; + +export const getPackageMeta = async () => { + const target = process.argv.find(param => param.includes("packages/")); + + if (target) { + return getPackageMetaFromPath(target); + } + + throw new Error( + `Unable to parse package to test! Make sure the package path includes "packages/{name}"` + ); +}; diff --git a/typings/jest-extended/index.d.ts b/typings/jest-extended/index.d.ts index b3d6c47969a..3b47093f482 100644 --- a/typings/jest-extended/index.d.ts +++ b/typings/jest-extended/index.d.ts @@ -1 +1 @@ -import 'jest-extended'; \ No newline at end of file +import "jest-extended"; diff --git a/typings/vitest/index.d.ts b/typings/vitest/index.d.ts new file mode 100644 index 00000000000..d05fb45adf3 --- /dev/null +++ b/typings/vitest/index.d.ts @@ -0,0 +1,8 @@ +import "vitest"; +import * as matchers from "jest-extended"; + +type CustomMatchers = typeof matchers; + +declare module "vitest" { + interface Matchers extends CustomMatchers {} +} diff --git a/yarn.lock b/yarn.lock index 89cf6b499d6..e9f9eec2767 100644 --- a/yarn.lock +++ b/yarn.lock @@ -87,19 +87,6 @@ __metadata: languageName: node linkType: hard -"@asamuzakjp/css-color@npm:^3.1.2": - version: 3.2.0 - resolution: "@asamuzakjp/css-color@npm:3.2.0" - dependencies: - "@csstools/css-calc": "npm:^2.1.3" - "@csstools/css-color-parser": "npm:^3.0.9" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - lru-cache: "npm:^10.4.3" - checksum: 10/870f661460173174fef8bfebea0799ba26566f3aa7b307e5adabb7aae84fed2da68e40080104ed0c83b43c5be632ee409e65396af13bfe948a3ef4c2c729ecd9 - languageName: node - linkType: hard - "@auth0/auth0-react@npm:^2.2.4": version: 2.2.4 resolution: "@auth0/auth0-react@npm:2.2.4" @@ -2321,14 +2308,7 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.27.7, @babel/compat-data@npm:^7.28.0": - version: 7.28.4 - resolution: "@babel/compat-data@npm:7.28.4" - checksum: 10/95b7864e6b210c84c069743966da448c0cb50015a4de5e18dd755776a0b5e53c4653e74f26700aed8de922eaa3b8844fc5fc5b29bc64830249d2abe914aec832 - languageName: node - linkType: hard - -"@babel/core@npm:7.27.4, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.19.6, @babel/core@npm:^7.23.9, @babel/core@npm:^7.27.4": +"@babel/core@npm:7.27.4, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.19.6, @babel/core@npm:^7.23.9": version: 7.27.4 resolution: "@babel/core@npm:7.27.4" dependencies: @@ -2351,29 +2331,6 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.28.3": - version: 7.28.4 - resolution: "@babel/core@npm:7.28.4" - dependencies: - "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.28.3" - "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-module-transforms": "npm:^7.28.3" - "@babel/helpers": "npm:^7.28.4" - "@babel/parser": "npm:^7.28.4" - "@babel/template": "npm:^7.27.2" - "@babel/traverse": "npm:^7.28.4" - "@babel/types": "npm:^7.28.4" - "@jridgewell/remapping": "npm:^2.3.5" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10/0593295241fac9be567145ef16f3858d34fc91390a9438c6d47476be9823af4cc0488c851c59702dd46b968e9fd46d17ddf0105ea30195ca85f5a66b4044c519 - languageName: node - linkType: hard - "@babel/generator@npm:^7.27.3": version: 7.27.3 resolution: "@babel/generator@npm:7.27.3" @@ -2387,32 +2344,6 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.27.5": - version: 7.27.5 - resolution: "@babel/generator@npm:7.27.5" - dependencies: - "@babel/parser": "npm:^7.27.5" - "@babel/types": "npm:^7.27.3" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^3.0.2" - checksum: 10/f5e6942670cb32156b3ac2d75ce09b373558823387f15dd1413c27fe9eb5756a7c6011fc7f956c7acc53efb530bfb28afffa24364d46c4e9ffccc4e5c8b3b094 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/generator@npm:7.28.3" - dependencies: - "@babel/parser": "npm:^7.28.3" - "@babel/types": "npm:^7.28.2" - "@jridgewell/gen-mapping": "npm:^0.3.12" - "@jridgewell/trace-mapping": "npm:^0.3.28" - jsesc: "npm:^3.0.2" - checksum: 10/d00d1e6b51059e47594aab7920b88ec6fcef6489954a9172235ab57ad2e91b39c95376963a6e2e4cc7e8b88fa4f931018f71f9ab32bbc9c0bc0de35a0231f26c - languageName: node - linkType: hard - "@babel/generator@npm:^7.7.2": version: 7.20.14 resolution: "@babel/generator@npm:7.20.14" @@ -2442,7 +2373,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.27.1, @babel/helper-annotate-as-pure@npm:^7.27.3": +"@babel/helper-annotate-as-pure@npm:^7.27.1": version: 7.27.3 resolution: "@babel/helper-annotate-as-pure@npm:7.27.3" dependencies: @@ -2572,23 +2503,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/helper-create-class-features-plugin@npm:7.28.3" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.3" - "@babel/helper-member-expression-to-functions": "npm:^7.27.1" - "@babel/helper-optimise-call-expression": "npm:^7.27.1" - "@babel/helper-replace-supers": "npm:^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.3" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/32d01bdd601b4d129b1d510058a19644abc764badcc543adaec9e71443e874ef252783cceb2809645bdf0e92b07f206fd439c75a2a48cf702c627aba7f3ee34a - languageName: node - linkType: hard - "@babel/helper-create-regexp-features-plugin@npm:^7.18.6": version: 7.20.5 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.20.5" @@ -2657,21 +2571,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.5": - version: 0.6.5 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.5" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-plugin-utils": "npm:^7.27.1" - debug: "npm:^4.4.1" - lodash.debounce: "npm:^4.0.8" - resolve: "npm:^1.22.10" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/0bdd2d9654d2f650c33976caa1a2afac2c23cf07e83856acdb482423c7bf4542c499ca0bdc723f2961bb36883501f09e9f4fe061ba81c07996daacfba82a6f62 - languageName: node - linkType: hard - "@babel/helper-environment-visitor@npm:^7.18.9, @babel/helper-environment-visitor@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-environment-visitor@npm:7.24.7" @@ -2691,13 +2590,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-globals@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/helper-globals@npm:7.28.0" - checksum: 10/91445f7edfde9b65dcac47f4f858f68dc1661bf73332060ab67ad7cc7b313421099a2bfc4bda30c3db3842cfa1e86fffbb0d7b2c5205a177d91b22c8d7d9cb47 - languageName: node - linkType: hard - "@babel/helper-member-expression-to-functions@npm:^7.20.7": version: 7.20.7 resolution: "@babel/helper-member-expression-to-functions@npm:7.20.7" @@ -2782,19 +2674,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/helper-module-transforms@npm:7.28.3" - dependencies: - "@babel/helper-module-imports": "npm:^7.27.1" - "@babel/helper-validator-identifier": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.3" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/598fdd8aa5b91f08542d0ba62a737847d0e752c8b95ae2566bc9d11d371856d6867d93e50db870fb836a6c44cfe481c189d8a2b35ca025a224f070624be9fa87 - languageName: node - linkType: hard - "@babel/helper-optimise-call-expression@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-optimise-call-expression@npm:7.18.6" @@ -3042,17 +2921,7 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.28.4": - version: 7.28.4 - resolution: "@babel/helpers@npm:7.28.4" - dependencies: - "@babel/template": "npm:^7.27.2" - "@babel/types": "npm:^7.28.4" - checksum: 10/5a70a82e196cf8808f8a449cc4780c34d02edda2bb136d39ce9d26e63b615f18e89a95472230c3ce7695db0d33e7026efeee56f6454ed43480f223007ed205eb - languageName: node - linkType: hard - -"@babel/parser@npm:7.27.5, @babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.27.3, @babel/parser@npm:^7.27.4, @babel/parser@npm:^7.27.5, @babel/parser@npm:^7.6.4": +"@babel/parser@npm:7.27.5, @babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.27.3, @babel/parser@npm:^7.27.4, @babel/parser@npm:^7.6.4": version: 7.27.5 resolution: "@babel/parser@npm:7.27.5" dependencies: @@ -3063,17 +2932,6 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.28.3, @babel/parser@npm:^7.28.4": - version: 7.28.4 - resolution: "@babel/parser@npm:7.28.4" - dependencies: - "@babel/types": "npm:^7.28.4" - bin: - parser: ./bin/babel-parser.js - checksum: 10/f54c46213ef180b149f6a17ea765bf40acc1aebe2009f594e2a283aec69a190c6dda1fdf24c61a258dbeb903abb8ffb7a28f1a378f8ab5d333846ce7b7e23bf1 - languageName: node - linkType: hard - "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9" @@ -3192,18 +3050,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.28.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.3" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/eeacdb7fa5ae19e366cbc4da98736b898e05b9abe572aa23093e6be842c6c8284d08af538528ec771073a3749718033be3713ff455ca008d11a7b0e90e62a53d - languageName: node - linkType: hard - "@babel/plugin-proposal-class-properties@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" @@ -3273,7 +3119,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-class-properties@npm:^7.12.13, @babel/plugin-syntax-class-properties@npm:^7.8.3": +"@babel/plugin-syntax-class-properties@npm:^7.8.3": version: 7.12.13 resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" dependencies: @@ -3284,17 +3130,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-class-static-block@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/3e80814b5b6d4fe17826093918680a351c2d34398a914ce6e55d8083d72a9bdde4fbaf6a2dcea0e23a03de26dc2917ae3efd603d27099e2b98380345703bf948 - languageName: node - linkType: hard - "@babel/plugin-syntax-import-assertions@npm:^7.26.0": version: 7.26.0 resolution: "@babel/plugin-syntax-import-assertions@npm:7.26.0" @@ -3317,29 +3152,29 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.24.7, @babel/plugin-syntax-import-attributes@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.27.1" +"@babel/plugin-syntax-import-attributes@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/97973982fff1bbf86b3d1df13380567042887c50e2ae13a400d02a8ff2c9742a60a75e279bfb73019e1cd9710f04be5e6ab81f896e6678dcfcec8b135e8896cf + checksum: 10/c122aa577166c80ee67f75aebebeef4150a132c4d3109d25d7fc058bf802946f883e330f20b78c1d3e3a5ada631c8780c263d2d01b5dbaecc69efefeedd42916 languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" +"@babel/plugin-syntax-import-attributes@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c122aa577166c80ee67f75aebebeef4150a132c4d3109d25d7fc058bf802946f883e330f20b78c1d3e3a5ada631c8780c263d2d01b5dbaecc69efefeedd42916 + checksum: 10/97973982fff1bbf86b3d1df13380567042887c50e2ae13a400d02a8ff2c9742a60a75e279bfb73019e1cd9710f04be5e6ab81f896e6678dcfcec8b135e8896cf languageName: node linkType: hard -"@babel/plugin-syntax-import-meta@npm:^7.10.4, @babel/plugin-syntax-import-meta@npm:^7.8.3": +"@babel/plugin-syntax-import-meta@npm:^7.8.3": version: 7.10.4 resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" dependencies: @@ -3394,7 +3229,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4, @babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": version: 7.10.4 resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" dependencies: @@ -3416,7 +3251,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4, @babel/plugin-syntax-numeric-separator@npm:^7.8.3": +"@babel/plugin-syntax-numeric-separator@npm:^7.8.3": version: 7.10.4 resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" dependencies: @@ -3460,18 +3295,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/b317174783e6e96029b743ccff2a67d63d38756876e7e5d0ba53a322e38d9ca452c13354a57de1ad476b4c066dbae699e0ca157441da611117a47af88985ecda - languageName: node - linkType: hard - -"@babel/plugin-syntax-top-level-await@npm:^7.14.5, @babel/plugin-syntax-top-level-await@npm:^7.8.3": +"@babel/plugin-syntax-top-level-await@npm:^7.8.3": version: 7.14.5 resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" dependencies: @@ -3575,19 +3399,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.28.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-remap-async-to-generator": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/8ad31b9969b203dec572738a872e17b14ef76ca45b4ef5ffa76f3514be417ca233d1a0978e5f8de166412a8a745619eb22b07cc5df96f5ebad8ca500f920f61b - languageName: node - linkType: hard - "@babel/plugin-transform-async-to-generator@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9" @@ -3658,17 +3469,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.28.0": - version: 7.28.4 - resolution: "@babel/plugin-transform-block-scoping@npm:7.28.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/0848c681b0229ebb98da8a1fab53a29a94f79c4b80e536cb00dcedc08ca29341a48ebdf34d846f4d738376aa8e36830fa7f444bae3e85c8761cab96e9ad72a0f - languageName: node - linkType: hard - "@babel/plugin-transform-class-properties@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-class-properties@npm:7.25.9" @@ -3717,18 +3517,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/plugin-transform-class-static-block@npm:7.28.3" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.28.3" - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.12.0 - checksum: 10/c0ba8f0cbf3699287e5a711907dab3b29f346d9c107faa4e424aa26252e45845d74ca08ee6245bfccf32a8c04bc1d07a89b635e51522592c6044b810a48d3f58 - languageName: node - linkType: hard - "@babel/plugin-transform-classes@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-classes@npm:7.25.9" @@ -3761,22 +3549,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.28.3": - version: 7.28.4 - resolution: "@babel/plugin-transform-classes@npm:7.28.4" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.3" - "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-globals": "npm:^7.28.0" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-replace-supers": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/1f8423d0ba287ba4ae3aac89299e704a666ef2fc5950cd581e056c068486917a460efd5731fdd0d0fb0a8a08852e13b31c1add089028e89a8991a7fdfaff5c43 - languageName: node - linkType: hard - "@babel/plugin-transform-computed-properties@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-computed-properties@npm:7.25.9" @@ -3823,18 +3595,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/plugin-transform-destructuring@npm:7.28.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/cddab2520ff32d18005670fc6646396a253d3811d1ccc49f6f858469f05985ee896c346a0cb34d1cf25155c9be76d1068ff878cf8e8459bd3fa27513ec5a6802 - languageName: node - linkType: hard - "@babel/plugin-transform-dotall-regex@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.9" @@ -3927,18 +3687,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-explicit-resource-management@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.28.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/plugin-transform-destructuring": "npm:^7.28.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/93d7835160bf8623c7b7072898046c9a2a46cf911f38fa2a002de40a11045a65bf9c1663c98f2e4e04615037f63391832c20b45d7bc26a16d39a97995d0669bc - languageName: node - linkType: hard - "@babel/plugin-transform-exponentiation-operator@npm:^7.26.3": version: 7.26.3 resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.26.3" @@ -4338,21 +4086,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.28.0": - version: 7.28.4 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.28.4" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/plugin-transform-destructuring": "npm:^7.28.0" - "@babel/plugin-transform-parameters": "npm:^7.27.7" - "@babel/traverse": "npm:^7.28.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/aebe464e368cefa5c3ba40316c47b61eb25f891d436b2241021efef5bd0b473c4aa5ba4b9fa0f4b4d5ce4f6bc6b727628d1ca79d54e7b8deebb5369f7dff2984 - languageName: node - linkType: hard - "@babel/plugin-transform-object-super@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-object-super@npm:7.25.9" @@ -4456,17 +4189,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.27.7": - version: 7.27.7 - resolution: "@babel/plugin-transform-parameters@npm:7.27.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/ba0aa8c977a03bf83030668f64c1d721e4e82d8cce89cdde75a2755862b79dbe9e7f58ca955e68c721fd494d6ee3826e46efad3fbf0855fcc92cb269477b4777 - languageName: node - linkType: hard - "@babel/plugin-transform-private-methods@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" @@ -4671,17 +4393,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.28.3": - version: 7.28.4 - resolution: "@babel/plugin-transform-regenerator@npm:7.28.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/24da51a659d882e02bd4353da9d8e045e58d967c1cddaf985ad699a9fc9f920a45eff421c4283a248d83dc16590b8956e66fd710be5db8723b274cfea0b51b2f - languageName: node - linkType: hard - "@babel/plugin-transform-regexp-modifiers@npm:^7.26.0": version: 7.26.0 resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.26.0" @@ -5148,86 +4859,6 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/preset-env@npm:7.28.3" - dependencies: - "@babel/compat-data": "npm:^7.28.0" - "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-validator-option": "npm:^7.27.1" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.27.1" - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.27.1" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.27.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.27.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.28.3" - "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions": "npm:^7.27.1" - "@babel/plugin-syntax-import-attributes": "npm:^7.27.1" - "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.27.1" - "@babel/plugin-transform-async-generator-functions": "npm:^7.28.0" - "@babel/plugin-transform-async-to-generator": "npm:^7.27.1" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.27.1" - "@babel/plugin-transform-block-scoping": "npm:^7.28.0" - "@babel/plugin-transform-class-properties": "npm:^7.27.1" - "@babel/plugin-transform-class-static-block": "npm:^7.28.3" - "@babel/plugin-transform-classes": "npm:^7.28.3" - "@babel/plugin-transform-computed-properties": "npm:^7.27.1" - "@babel/plugin-transform-destructuring": "npm:^7.28.0" - "@babel/plugin-transform-dotall-regex": "npm:^7.27.1" - "@babel/plugin-transform-duplicate-keys": "npm:^7.27.1" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.27.1" - "@babel/plugin-transform-dynamic-import": "npm:^7.27.1" - "@babel/plugin-transform-explicit-resource-management": "npm:^7.28.0" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.27.1" - "@babel/plugin-transform-export-namespace-from": "npm:^7.27.1" - "@babel/plugin-transform-for-of": "npm:^7.27.1" - "@babel/plugin-transform-function-name": "npm:^7.27.1" - "@babel/plugin-transform-json-strings": "npm:^7.27.1" - "@babel/plugin-transform-literals": "npm:^7.27.1" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.27.1" - "@babel/plugin-transform-member-expression-literals": "npm:^7.27.1" - "@babel/plugin-transform-modules-amd": "npm:^7.27.1" - "@babel/plugin-transform-modules-commonjs": "npm:^7.27.1" - "@babel/plugin-transform-modules-systemjs": "npm:^7.27.1" - "@babel/plugin-transform-modules-umd": "npm:^7.27.1" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.27.1" - "@babel/plugin-transform-new-target": "npm:^7.27.1" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.27.1" - "@babel/plugin-transform-numeric-separator": "npm:^7.27.1" - "@babel/plugin-transform-object-rest-spread": "npm:^7.28.0" - "@babel/plugin-transform-object-super": "npm:^7.27.1" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.27.1" - "@babel/plugin-transform-optional-chaining": "npm:^7.27.1" - "@babel/plugin-transform-parameters": "npm:^7.27.7" - "@babel/plugin-transform-private-methods": "npm:^7.27.1" - "@babel/plugin-transform-private-property-in-object": "npm:^7.27.1" - "@babel/plugin-transform-property-literals": "npm:^7.27.1" - "@babel/plugin-transform-regenerator": "npm:^7.28.3" - "@babel/plugin-transform-regexp-modifiers": "npm:^7.27.1" - "@babel/plugin-transform-reserved-words": "npm:^7.27.1" - "@babel/plugin-transform-shorthand-properties": "npm:^7.27.1" - "@babel/plugin-transform-spread": "npm:^7.27.1" - "@babel/plugin-transform-sticky-regex": "npm:^7.27.1" - "@babel/plugin-transform-template-literals": "npm:^7.27.1" - "@babel/plugin-transform-typeof-symbol": "npm:^7.27.1" - "@babel/plugin-transform-unicode-escapes": "npm:^7.27.1" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.27.1" - "@babel/plugin-transform-unicode-regex": "npm:^7.27.1" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.27.1" - "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.14" - babel-plugin-polyfill-corejs3: "npm:^0.13.0" - babel-plugin-polyfill-regenerator: "npm:^0.6.5" - core-js-compat: "npm:^3.43.0" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/b09991276a5ea4f2f95077bb451420f683e19d59405bc1fbbb392bb3571592edc922daac4eaa50b2b407c0b24c4e1e9df0f76738c3c573dac4e6bcf028daa8c5 - languageName: node - linkType: hard - "@babel/preset-modules@npm:0.1.6-no-external-plugins": version: 0.1.6-no-external-plugins resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" @@ -5241,7 +4872,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-react@npm:7.27.1, @babel/preset-react@npm:^7.27.1": +"@babel/preset-react@npm:7.27.1": version: 7.27.1 resolution: "@babel/preset-react@npm:7.27.1" dependencies: @@ -5273,7 +4904,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:7.27.1, @babel/preset-typescript@npm:^7.27.1": +"@babel/preset-typescript@npm:7.27.1": version: 7.27.1 resolution: "@babel/preset-typescript@npm:7.27.1" dependencies: @@ -5334,13 +4965,6 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/runtime@npm:7.28.3" - checksum: 10/f2415e4dbface7496f6fc561d640b44be203071fb0dfb63fbe338c7d2d2047419cb054ef13d1ebb8fc11e35d2b55aa3045def4b985e8b82aea5d7e58e1133e52 - languageName: node - linkType: hard - "@babel/template@npm:7.27.2, @babel/template@npm:^7.27.1, @babel/template@npm:^7.27.2": version: 7.27.2 resolution: "@babel/template@npm:7.27.2" @@ -5378,21 +5002,6 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.28.0, @babel/traverse@npm:^7.28.3, @babel/traverse@npm:^7.28.4": - version: 7.28.4 - resolution: "@babel/traverse@npm:7.28.4" - dependencies: - "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.28.3" - "@babel/helper-globals": "npm:^7.28.0" - "@babel/parser": "npm:^7.28.4" - "@babel/template": "npm:^7.27.2" - "@babel/types": "npm:^7.28.4" - debug: "npm:^4.3.1" - checksum: 10/c3099364b7b1c36bcd111099195d4abeef16499e5defb1e56766b754e8b768c252e856ed9041665158aa1b31215fc6682632756803c8fa53405381ec08c4752b - languageName: node - linkType: hard - "@babel/types@npm:7.27.3, @babel/types@npm:^7.0.0, @babel/types@npm:^7.18.6, @babel/types@npm:^7.19.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": version: 7.27.3 resolution: "@babel/types@npm:7.27.3" @@ -5403,16 +5012,6 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.28.2, @babel/types@npm:^7.28.4": - version: 7.28.4 - resolution: "@babel/types@npm:7.28.4" - dependencies: - "@babel/helper-string-parser": "npm:^7.27.1" - "@babel/helper-validator-identifier": "npm:^7.27.1" - checksum: 10/db50bf257aafa5d845ad16dae0587f57d596e4be4cbb233ea539976a4c461f9fbcc0bf3d37adae3f8ce5dcb4001462aa608f3558161258b585f6ce6ce21a2e45 - languageName: node - linkType: hard - "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -5630,13 +5229,6 @@ __metadata: languageName: node linkType: hard -"@csstools/color-helpers@npm:^5.0.2": - version: 5.0.2 - resolution: "@csstools/color-helpers@npm:5.0.2" - checksum: 10/8763079c54578bd2215c68de0795edb9cfa29bffa29625bff89f3c47d9df420d86296ff3a6fa8c29ca037bbaa64dc10a963461233341de0516a3161a3b549e7b - languageName: node - linkType: hard - "@csstools/css-calc@npm:^1.2.0": version: 1.2.0 resolution: "@csstools/css-calc@npm:1.2.0" @@ -5647,16 +5239,6 @@ __metadata: languageName: node linkType: hard -"@csstools/css-calc@npm:^2.1.3, @csstools/css-calc@npm:^2.1.4": - version: 2.1.4 - resolution: "@csstools/css-calc@npm:2.1.4" - peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.5 - "@csstools/css-tokenizer": ^3.0.4 - checksum: 10/06975b650c0f44c60eeb7afdb3fd236f2dd607b2c622e0bc908d3f54de39eb84e0692833320d03dac04bd6c1ab0154aa3fa0dd442bd9e5f917cf14d8e2ba8d74 - languageName: node - linkType: hard - "@csstools/css-color-parser@npm:^1.6.2": version: 1.6.2 resolution: "@csstools/css-color-parser@npm:1.6.2" @@ -5670,19 +5252,6 @@ __metadata: languageName: node linkType: hard -"@csstools/css-color-parser@npm:^3.0.9": - version: 3.0.10 - resolution: "@csstools/css-color-parser@npm:3.0.10" - dependencies: - "@csstools/color-helpers": "npm:^5.0.2" - "@csstools/css-calc": "npm:^2.1.4" - peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.5 - "@csstools/css-tokenizer": ^3.0.4 - checksum: 10/d5619639f067c0a6ac95ecce6ad6adce55a5500599a4444817ac6bb5ed2a9928a08f0978a148d4687de7ebf05c068c1a1c7f9eaa039984830a84148e011cbc05 - languageName: node - linkType: hard - "@csstools/css-parser-algorithms@npm:^2.6.1": version: 2.6.1 resolution: "@csstools/css-parser-algorithms@npm:2.6.1" @@ -5692,15 +5261,6 @@ __metadata: languageName: node linkType: hard -"@csstools/css-parser-algorithms@npm:^3.0.4": - version: 3.0.5 - resolution: "@csstools/css-parser-algorithms@npm:3.0.5" - peerDependencies: - "@csstools/css-tokenizer": ^3.0.4 - checksum: 10/e93083b5cb36a3c1e7a47ce10cf62961d05bd1e4c608bb3ee50186ff740157ab0ec16a3956f7b86251efd10703034d849693201eea858ae904848c68d2d46ada - languageName: node - linkType: hard - "@csstools/css-tokenizer@npm:^2.2.4": version: 2.2.4 resolution: "@csstools/css-tokenizer@npm:2.2.4" @@ -5708,13 +5268,6 @@ __metadata: languageName: node linkType: hard -"@csstools/css-tokenizer@npm:^3.0.3": - version: 3.0.4 - resolution: "@csstools/css-tokenizer@npm:3.0.4" - checksum: 10/eb6c84c086312f6bb8758dfe2c85addd7475b0927333c5e39a4d59fb210b9810f8c346972046f95e60a721329cffe98895abe451e51de753ad1ca7a8c24ec65f - languageName: node - linkType: hard - "@csstools/media-query-list-parser@npm:^2.1.9": version: 2.1.9 resolution: "@csstools/media-query-list-parser@npm:2.1.9" @@ -6178,6 +5731,55 @@ __metadata: languageName: node linkType: hard +"@dnd-kit/accessibility@npm:^3.1.1": + version: 3.1.1 + resolution: "@dnd-kit/accessibility@npm:3.1.1" + dependencies: + tslib: "npm:^2.0.0" + peerDependencies: + react: ">=16.8.0" + checksum: 10/961000456a36700a9cd13be51147a818bc100f7dfabb332b80438d02e06f3b556aa0ff46ddf13bdff3b70bc8f9b63dd5a392cc285597ab1f7026e672660c54b6 + languageName: node + linkType: hard + +"@dnd-kit/core@npm:^6.1.0": + version: 6.3.1 + resolution: "@dnd-kit/core@npm:6.3.1" + dependencies: + "@dnd-kit/accessibility": "npm:^3.1.1" + "@dnd-kit/utilities": "npm:^3.2.2" + tslib: "npm:^2.0.0" + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 10/a5ae6fa8404765712aa80e308f58cb79bac9a306c274ec8272c405c2a59dd277d24b966348fe8ca6340bb3f0d75f90b8a021fa781edcf65255114d3cf2bef891 + languageName: node + linkType: hard + +"@dnd-kit/sortable@npm:^8.0.0": + version: 8.0.0 + resolution: "@dnd-kit/sortable@npm:8.0.0" + dependencies: + "@dnd-kit/utilities": "npm:^3.2.2" + tslib: "npm:^2.0.0" + peerDependencies: + "@dnd-kit/core": ^6.1.0 + react: ">=16.8.0" + checksum: 10/e2e0d37ace13db2e6aceb65a803195ef29e1a33a37e7722a988d7a9c1aacce77472a93b2adcd8e6780ac98b3d5640c5481892f530177c2eb966df235726942ad + languageName: node + linkType: hard + +"@dnd-kit/utilities@npm:^3.2.2": + version: 3.2.2 + resolution: "@dnd-kit/utilities@npm:3.2.2" + dependencies: + tslib: "npm:^2.0.0" + peerDependencies: + react: ">=16.8.0" + checksum: 10/6cfe46a5fcdaced943982e7ae66b08b89235493e106eb5bc833737c25905e13375c6ecc3aa0c357d136cb21dae3966213dba063f19b7a60b1235a29a7b05ff84 + languageName: node + linkType: hard + "@editorjs/editorjs@npm:2.26.5": version: 2.26.5 resolution: "@editorjs/editorjs@npm:2.26.5" @@ -6204,34 +5806,6 @@ __metadata: languageName: node linkType: hard -"@emnapi/core@npm:^1.4.3": - version: 1.4.3 - resolution: "@emnapi/core@npm:1.4.3" - dependencies: - "@emnapi/wasi-threads": "npm:1.0.2" - tslib: "npm:^2.4.0" - checksum: 10/b511f66b897d2019835391544fdf11f4fa0ce06cc1181abfa17c7d4cf03aaaa4fc8a64fcd30bb3f901de488d0a6f370b53a8de2215a898f5a4ac98015265b3b7 - languageName: node - linkType: hard - -"@emnapi/runtime@npm:^1.4.3": - version: 1.4.3 - resolution: "@emnapi/runtime@npm:1.4.3" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10/4f90852a1a5912982cc4e176b6420556971bcf6a85ee23e379e2455066d616219751367dcf43e6a6eaf41ea7e95ba9dc830665a52b5d979dfe074237d19578f8 - languageName: node - linkType: hard - -"@emnapi/wasi-threads@npm:1.0.2": - version: 1.0.2 - resolution: "@emnapi/wasi-threads@npm:1.0.2" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10/e82941776665eb958c2084728191d6b15a94383449975c4621b67a1c8217e1c0ec11056a693906c76863cb96f782f8be500510ecec6874e3f5da35a8e7968cfd - languageName: node - linkType: hard - "@emotion/babel-plugin@npm:^11.10.6": version: 11.13.5 resolution: "@emotion/babel-plugin@npm:11.13.5" @@ -6601,6 +6175,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/aix-ppc64@npm:0.25.9" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/android-arm64@npm:0.25.5" @@ -6608,6 +6189,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/android-arm64@npm:0.25.9" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/android-arm@npm:0.25.5" @@ -6615,6 +6203,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/android-arm@npm:0.25.9" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/android-x64@npm:0.25.5" @@ -6622,6 +6217,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/android-x64@npm:0.25.9" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/darwin-arm64@npm:0.25.5" @@ -6629,6 +6231,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/darwin-arm64@npm:0.25.9" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/darwin-x64@npm:0.25.5" @@ -6636,6 +6245,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/darwin-x64@npm:0.25.9" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/freebsd-arm64@npm:0.25.5" @@ -6643,6 +6259,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/freebsd-arm64@npm:0.25.9" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/freebsd-x64@npm:0.25.5" @@ -6650,6 +6273,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/freebsd-x64@npm:0.25.9" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/linux-arm64@npm:0.25.5" @@ -6657,6 +6287,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-arm64@npm:0.25.9" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/linux-arm@npm:0.25.5" @@ -6664,6 +6301,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-arm@npm:0.25.9" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/linux-ia32@npm:0.25.5" @@ -6671,6 +6315,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-ia32@npm:0.25.9" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/linux-loong64@npm:0.25.5" @@ -6678,6 +6329,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-loong64@npm:0.25.9" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/linux-mips64el@npm:0.25.5" @@ -6685,6 +6343,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-mips64el@npm:0.25.9" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/linux-ppc64@npm:0.25.5" @@ -6692,6 +6357,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-ppc64@npm:0.25.9" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/linux-riscv64@npm:0.25.5" @@ -6699,6 +6371,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-riscv64@npm:0.25.9" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/linux-s390x@npm:0.25.5" @@ -6706,6 +6385,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-s390x@npm:0.25.9" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/linux-x64@npm:0.25.5" @@ -6713,6 +6399,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-x64@npm:0.25.9" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-arm64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/netbsd-arm64@npm:0.25.5" @@ -6720,6 +6413,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/netbsd-arm64@npm:0.25.9" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/netbsd-x64@npm:0.25.5" @@ -6727,6 +6427,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/netbsd-x64@npm:0.25.9" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/openbsd-arm64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/openbsd-arm64@npm:0.25.5" @@ -6734,6 +6441,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/openbsd-arm64@npm:0.25.9" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/openbsd-x64@npm:0.25.5" @@ -6741,6 +6455,20 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/openbsd-x64@npm:0.25.9" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openharmony-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/openharmony-arm64@npm:0.25.9" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/sunos-x64@npm:0.25.5" @@ -6748,6 +6476,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/sunos-x64@npm:0.25.9" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/win32-arm64@npm:0.25.5" @@ -6755,6 +6490,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/win32-arm64@npm:0.25.9" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/win32-ia32@npm:0.25.5" @@ -6762,6 +6504,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/win32-ia32@npm:0.25.9" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/win32-x64@npm:0.25.5" @@ -6769,6 +6518,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/win32-x64@npm:0.25.9" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -7126,246 +6882,6 @@ __metadata: languageName: node linkType: hard -"@inquirer/checkbox@npm:^4.2.2": - version: 4.2.2 - resolution: "@inquirer/checkbox@npm:4.2.2" - dependencies: - "@inquirer/core": "npm:^10.2.0" - "@inquirer/figures": "npm:^1.0.13" - "@inquirer/type": "npm:^3.0.8" - ansi-escapes: "npm:^4.3.2" - yoctocolors-cjs: "npm:^2.1.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10/55774fe57f3e2f2aaa72618a46b3227d44db12c18be55469450a73c3e4a5e8be1787e2d830d374fca33b8d51e9a6d3b419aed42f14e8aae28cf8b4b035e18b31 - languageName: node - linkType: hard - -"@inquirer/confirm@npm:^5.1.16": - version: 5.1.16 - resolution: "@inquirer/confirm@npm:5.1.16" - dependencies: - "@inquirer/core": "npm:^10.2.0" - "@inquirer/type": "npm:^3.0.8" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10/c81a1394125a68e47a82cd819392f9ee0dcbd736b49ab1907197e032718c2f8e03e31b5fdf65ca6f9b5d512155e8df19be9eca258e9c38ed3a36628a54584a2a - languageName: node - linkType: hard - -"@inquirer/core@npm:^10.2.0": - version: 10.2.0 - resolution: "@inquirer/core@npm:10.2.0" - dependencies: - "@inquirer/figures": "npm:^1.0.13" - "@inquirer/type": "npm:^3.0.8" - ansi-escapes: "npm:^4.3.2" - cli-width: "npm:^4.1.0" - mute-stream: "npm:^2.0.0" - signal-exit: "npm:^4.1.0" - wrap-ansi: "npm:^6.2.0" - yoctocolors-cjs: "npm:^2.1.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10/872206a64ae3765283ac89d27c138cc347510fff6d6b12152860e2eb3cdbf7cbb171eb690be5b6fd9954a9731e6a2f3198730357d5d24bdbf91ae50e40f50d63 - languageName: node - linkType: hard - -"@inquirer/editor@npm:^4.2.18": - version: 4.2.18 - resolution: "@inquirer/editor@npm:4.2.18" - dependencies: - "@inquirer/core": "npm:^10.2.0" - "@inquirer/external-editor": "npm:^1.0.1" - "@inquirer/type": "npm:^3.0.8" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10/f11d95ef531bf14fd4b618c24c83f9ce0c251d1aea443fe354e9f1e0adc470cddff7f2fb16227d65368cc3826c6db44f35e45f1ad55cab3fbf8fcf51721e7adb - languageName: node - linkType: hard - -"@inquirer/expand@npm:^4.0.18": - version: 4.0.18 - resolution: "@inquirer/expand@npm:4.0.18" - dependencies: - "@inquirer/core": "npm:^10.2.0" - "@inquirer/type": "npm:^3.0.8" - yoctocolors-cjs: "npm:^2.1.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10/87b4b6d84ff547a511037332a45adf8a7aaabe2ef359a22208afae1adbcdb49f19fe88314cad4256128930ecbedc41db216c3342bc172da735037a512aa0bc59 - languageName: node - linkType: hard - -"@inquirer/external-editor@npm:^1.0.1": - version: 1.0.1 - resolution: "@inquirer/external-editor@npm:1.0.1" - dependencies: - chardet: "npm:^2.1.0" - iconv-lite: "npm:^0.6.3" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10/d07419dc8448413071e6c674984505873510580b0e0ee81d488c1fea4372e30ee88aa124f76118899dccd58137b78f39d5d40efb2696d999df48c7420f1b6256 - languageName: node - linkType: hard - -"@inquirer/figures@npm:^1.0.13": - version: 1.0.13 - resolution: "@inquirer/figures@npm:1.0.13" - checksum: 10/725bdfa08dffa69861fdca57cfccdb8573c2ea95f9803e8bb16f4789fa4290043775c9286c7d810241bd8c1ea938521649fdf8e776a96cf2a701f9d77613f807 - languageName: node - linkType: hard - -"@inquirer/input@npm:^4.2.2": - version: 4.2.2 - resolution: "@inquirer/input@npm:4.2.2" - dependencies: - "@inquirer/core": "npm:^10.2.0" - "@inquirer/type": "npm:^3.0.8" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10/4e23e407940b7ab2a9e3ab38138bda8872370fd0f04a4edc9afbd07dbf6e341151eb110ca7b09fcd11be392de8f54eb79217f962718a9ec814a90d34eba23297 - languageName: node - linkType: hard - -"@inquirer/number@npm:^3.0.18": - version: 3.0.18 - resolution: "@inquirer/number@npm:3.0.18" - dependencies: - "@inquirer/core": "npm:^10.2.0" - "@inquirer/type": "npm:^3.0.8" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10/f2ff42debdefdf73e78cbe41c1301df2498866bc5ff9fde07d7004d1d7ee8709d22e4130f59c58b1296252afc001a910f444c93b370cb7746445c3b76accd5da - languageName: node - linkType: hard - -"@inquirer/password@npm:^4.0.18": - version: 4.0.18 - resolution: "@inquirer/password@npm:4.0.18" - dependencies: - "@inquirer/core": "npm:^10.2.0" - "@inquirer/type": "npm:^3.0.8" - ansi-escapes: "npm:^4.3.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10/d0cddd69ee0fe9ff4eef18088fb9510eac801ae3d8433c8a2a5bc4b4eba79e66a06878c7e670e98537f0d46eee3100d8ff053b46301fc7c230db6498b7cb8aaf - languageName: node - linkType: hard - -"@inquirer/prompts@npm:^7.8.4": - version: 7.8.4 - resolution: "@inquirer/prompts@npm:7.8.4" - dependencies: - "@inquirer/checkbox": "npm:^4.2.2" - "@inquirer/confirm": "npm:^5.1.16" - "@inquirer/editor": "npm:^4.2.18" - "@inquirer/expand": "npm:^4.0.18" - "@inquirer/input": "npm:^4.2.2" - "@inquirer/number": "npm:^3.0.18" - "@inquirer/password": "npm:^4.0.18" - "@inquirer/rawlist": "npm:^4.1.6" - "@inquirer/search": "npm:^3.1.1" - "@inquirer/select": "npm:^4.3.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10/00c1e5f167c015dce21b5a7fbe858464e9592f5c78840c2947d1a9954b9e8f705ce72c969dfd2f066933fe35382c09bd855d29a76d9f82994bda7483baf790e7 - languageName: node - linkType: hard - -"@inquirer/rawlist@npm:^4.1.6": - version: 4.1.6 - resolution: "@inquirer/rawlist@npm:4.1.6" - dependencies: - "@inquirer/core": "npm:^10.2.0" - "@inquirer/type": "npm:^3.0.8" - yoctocolors-cjs: "npm:^2.1.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10/0411de4260ba315e398f60d87488aaa86b247c213b59170de2217478bbfea5d4125db33bf8d7c3225b0dcbbb706346f37c25b6e94ecd8bf86fe2599bd2658073 - languageName: node - linkType: hard - -"@inquirer/search@npm:^3.1.1": - version: 3.1.1 - resolution: "@inquirer/search@npm:3.1.1" - dependencies: - "@inquirer/core": "npm:^10.2.0" - "@inquirer/figures": "npm:^1.0.13" - "@inquirer/type": "npm:^3.0.8" - yoctocolors-cjs: "npm:^2.1.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10/86a786e7a66f9284de3362ffe487ed1d17b154ab2e795636082985ed5ac27da9cbc511e246eecc39e7c94734eb117176b4ddad09336af859c1eaa1097c436268 - languageName: node - linkType: hard - -"@inquirer/select@npm:^4.3.2": - version: 4.3.2 - resolution: "@inquirer/select@npm:4.3.2" - dependencies: - "@inquirer/core": "npm:^10.2.0" - "@inquirer/figures": "npm:^1.0.13" - "@inquirer/type": "npm:^3.0.8" - ansi-escapes: "npm:^4.3.2" - yoctocolors-cjs: "npm:^2.1.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10/95fc5dc91ec151ac4c5f6dd6c2602dafafc124ca9f0492fc1b7370610cc8c9e6d7e00dc32e36caf8fd05b581be7728ff770f2f0a247e5cc76d7713cc3847ac3f - languageName: node - linkType: hard - -"@inquirer/type@npm:^3.0.8": - version: 3.0.8 - resolution: "@inquirer/type@npm:3.0.8" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10/361fa75c98f274462aaa3f2baf40ee43f284daaa64e3689a92863ed4ff63236ca3d40c6e715b3ff80c45feb6ab679792a6162e2d4521daff3929c490b0dddfcf - languageName: node - linkType: hard - "@inversifyjs/common@npm:1.4.0": version: 1.4.0 resolution: "@inversifyjs/common@npm:1.4.0" @@ -7433,20 +6949,6 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/console@npm:30.0.0" - dependencies: - "@jest/types": "npm:30.0.0" - "@types/node": "npm:*" - chalk: "npm:^4.1.2" - jest-message-util: "npm:30.0.0" - jest-util: "npm:30.0.0" - slash: "npm:^3.0.0" - checksum: 10/e57961e91088404de6028c29cfcdac3ff523c21ae2903b153d6f8c1127524405d20ba2628bca967a1c807d401d246b8fc4ea00755f34d61a4657b796f58d4c94 - languageName: node - linkType: hard - "@jest/console@npm:^29.7.0": version: 29.7.0 resolution: "@jest/console@npm:29.7.0" @@ -7461,47 +6963,6 @@ __metadata: languageName: node linkType: hard -"@jest/core@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/core@npm:30.0.0" - dependencies: - "@jest/console": "npm:30.0.0" - "@jest/pattern": "npm:30.0.0" - "@jest/reporters": "npm:30.0.0" - "@jest/test-result": "npm:30.0.0" - "@jest/transform": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - "@types/node": "npm:*" - ansi-escapes: "npm:^4.3.2" - chalk: "npm:^4.1.2" - ci-info: "npm:^4.2.0" - exit-x: "npm:^0.2.2" - graceful-fs: "npm:^4.2.11" - jest-changed-files: "npm:30.0.0" - jest-config: "npm:30.0.0" - jest-haste-map: "npm:30.0.0" - jest-message-util: "npm:30.0.0" - jest-regex-util: "npm:30.0.0" - jest-resolve: "npm:30.0.0" - jest-resolve-dependencies: "npm:30.0.0" - jest-runner: "npm:30.0.0" - jest-runtime: "npm:30.0.0" - jest-snapshot: "npm:30.0.0" - jest-util: "npm:30.0.0" - jest-validate: "npm:30.0.0" - jest-watcher: "npm:30.0.0" - micromatch: "npm:^4.0.8" - pretty-format: "npm:30.0.0" - slash: "npm:^3.0.0" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: 10/b61b8419ea913228c39284f1b1e57154ef4fc5c7ede683ccfc8ba9a5915bef37286b97dd66debc15e0f93d184c6052991e7d5d24c871833e81e56068440708f9 - languageName: node - linkType: hard - "@jest/core@npm:^29.7.0": version: 29.7.0 resolution: "@jest/core@npm:29.7.0" @@ -7543,46 +7004,6 @@ __metadata: languageName: node linkType: hard -"@jest/diff-sequences@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/diff-sequences@npm:30.0.0" - checksum: 10/aed609b2285d651b3b532b8ee594e9d3182e997e9aca6f942505ae0471407f232cc40def2a42828c79f3bf9fb5f68bbd012a087be58c9a7332be026316e9c1cb - languageName: node - linkType: hard - -"@jest/environment-jsdom-abstract@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/environment-jsdom-abstract@npm:30.0.0" - dependencies: - "@jest/environment": "npm:30.0.0" - "@jest/fake-timers": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - "@types/jsdom": "npm:^21.1.7" - "@types/node": "npm:*" - jest-mock: "npm:30.0.0" - jest-util: "npm:30.0.0" - peerDependencies: - canvas: ^3.0.0 - jsdom: "*" - peerDependenciesMeta: - canvas: - optional: true - checksum: 10/a1ae23d8995bca0717eef8c69bedcfa70d1914bc980585546b0ab2a5f691b20aec979a903d701c38c5450a7cda36ef795749d82425674961637bc94307df9634 - languageName: node - linkType: hard - -"@jest/environment@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/environment@npm:30.0.0" - dependencies: - "@jest/fake-timers": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - "@types/node": "npm:*" - jest-mock: "npm:30.0.0" - checksum: 10/1f8cf7b0d67281c82441706e3e650cf61958861a75f61a410f32aba0283ad7c02ea9f0749322d1623da931ace7826c22d42fc31f0c82ab3ba86364725dbef724 - languageName: node - linkType: hard - "@jest/environment@npm:^29.7.0": version: 29.7.0 resolution: "@jest/environment@npm:29.7.0" @@ -7595,15 +7016,6 @@ __metadata: languageName: node linkType: hard -"@jest/expect-utils@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/expect-utils@npm:30.0.0" - dependencies: - "@jest/get-type": "npm:30.0.0" - checksum: 10/442b926f885f8c3c29b01b1bf27df47d1fcf17bb2def951430c310aba14ade4a3e1b2cfd59317619181416883f91bb4f5d6d793e108851c851df507bf51e9550 - languageName: node - linkType: hard - "@jest/expect-utils@npm:^29.7.0": version: 29.7.0 resolution: "@jest/expect-utils@npm:29.7.0" @@ -7613,16 +7025,6 @@ __metadata: languageName: node linkType: hard -"@jest/expect@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/expect@npm:30.0.0" - dependencies: - expect: "npm:30.0.0" - jest-snapshot: "npm:30.0.0" - checksum: 10/84a6cc640e8f076b6e227103e0b410b1b0a14fda74c60fb6f95ca750b7393d56cbac1caa09302041b4ebb86262fc3f50e3f5888d6d2b333e7c3cf7bddf771ece - languageName: node - linkType: hard - "@jest/expect@npm:^29.7.0": version: 29.7.0 resolution: "@jest/expect@npm:29.7.0" @@ -7633,20 +7035,6 @@ __metadata: languageName: node linkType: hard -"@jest/fake-timers@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/fake-timers@npm:30.0.0" - dependencies: - "@jest/types": "npm:30.0.0" - "@sinonjs/fake-timers": "npm:^13.0.0" - "@types/node": "npm:*" - jest-message-util: "npm:30.0.0" - jest-mock: "npm:30.0.0" - jest-util: "npm:30.0.0" - checksum: 10/7a7a80a4bbacb2574e144d28fd20a8178f7934fa92fbb5b9213415085af328d28402881bfa9e1f4724691bec0f4d38b91534f322b0837fb6139d20c259a7e85f - languageName: node - linkType: hard - "@jest/fake-timers@npm:^29.7.0": version: 29.7.0 resolution: "@jest/fake-timers@npm:29.7.0" @@ -7661,25 +7049,6 @@ __metadata: languageName: node linkType: hard -"@jest/get-type@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/get-type@npm:30.0.0" - checksum: 10/6dc432caac3371f1555c68ac28af473ec79cfb508e7bafb50c473af34bee997b87fd5ae11efc201eb1af32ca48f94d0ce406981a7802150597030105b19aa8cc - languageName: node - linkType: hard - -"@jest/globals@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/globals@npm:30.0.0" - dependencies: - "@jest/environment": "npm:30.0.0" - "@jest/expect": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - jest-mock: "npm:30.0.0" - checksum: 10/50e1d80a78adc0e5774b55fce2d9df645106fe6483b153d07eb3df872a7fd32aa631e014c0ab789c1450272491b410ed12e230f2b4d32e231a3f1f2e93a89f5c - languageName: node - linkType: hard - "@jest/globals@npm:^29.7.0": version: 29.7.0 resolution: "@jest/globals@npm:29.7.0" @@ -7692,52 +7061,6 @@ __metadata: languageName: node linkType: hard -"@jest/pattern@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/pattern@npm:30.0.0" - dependencies: - "@types/node": "npm:*" - jest-regex-util: "npm:30.0.0" - checksum: 10/4c21a48b1d6cd719b87b730848ecbc0bfde0224576787cdd78d3b63f2696fac7c23cb1c3ab96fc1a3cef5f93a4f020fd782cfb934568a21f3b76aa1cfc47211d - languageName: node - linkType: hard - -"@jest/reporters@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/reporters@npm:30.0.0" - dependencies: - "@bcoe/v8-coverage": "npm:^0.2.3" - "@jest/console": "npm:30.0.0" - "@jest/test-result": "npm:30.0.0" - "@jest/transform": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - "@jridgewell/trace-mapping": "npm:^0.3.25" - "@types/node": "npm:*" - chalk: "npm:^4.1.2" - collect-v8-coverage: "npm:^1.0.2" - exit-x: "npm:^0.2.2" - glob: "npm:^10.3.10" - graceful-fs: "npm:^4.2.11" - istanbul-lib-coverage: "npm:^3.0.0" - istanbul-lib-instrument: "npm:^6.0.0" - istanbul-lib-report: "npm:^3.0.0" - istanbul-lib-source-maps: "npm:^5.0.0" - istanbul-reports: "npm:^3.1.3" - jest-message-util: "npm:30.0.0" - jest-util: "npm:30.0.0" - jest-worker: "npm:30.0.0" - slash: "npm:^3.0.0" - string-length: "npm:^4.0.2" - v8-to-istanbul: "npm:^9.0.1" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: 10/f4d037e1c9436027e48074935c16a37646e5e7e958b7927c740de9a2882e9b5312c37ab74b3521625e8ae1661c058dea63d01a749ce936f94a659447235c4ea7 - languageName: node - linkType: hard - "@jest/reporters@npm:^29.7.0": version: 29.7.0 resolution: "@jest/reporters@npm:29.7.0" @@ -7775,15 +7098,6 @@ __metadata: languageName: node linkType: hard -"@jest/schemas@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/schemas@npm:30.0.0" - dependencies: - "@sinclair/typebox": "npm:^0.34.0" - checksum: 10/b97944e582c7e3dc883a01823a89e826b09b54b52298a20cb2b21b8e9931a296c25d5fd74e5312a9db930285464c399b70def7d5dad2cd30fba06fb8f35648d6 - languageName: node - linkType: hard - "@jest/schemas@npm:^29.4.3": version: 29.4.3 resolution: "@jest/schemas@npm:29.4.3" @@ -7802,29 +7116,6 @@ __metadata: languageName: node linkType: hard -"@jest/snapshot-utils@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/snapshot-utils@npm:30.0.0" - dependencies: - "@jest/types": "npm:30.0.0" - chalk: "npm:^4.1.2" - graceful-fs: "npm:^4.2.11" - natural-compare: "npm:^1.4.0" - checksum: 10/99b596a563eb8ac433ba8f019fdb3921668f54c2a9d2f31a446a4e72eafd2c40cf6bcd34a2c807bbec9825a5e25daa397325c2d56516a896920bb7bf97f945d9 - languageName: node - linkType: hard - -"@jest/source-map@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/source-map@npm:30.0.0" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.25" - callsites: "npm:^3.1.0" - graceful-fs: "npm:^4.2.11" - checksum: 10/d84c22337cf9d7033eeb613f82a24fe6c5bbeb852a9da92e3757b5d3f896540c95e0eb08b855e40273d888116c2806776c4bbdce05ad46c51821423281503ce1 - languageName: node - linkType: hard - "@jest/source-map@npm:^29.6.3": version: 29.6.3 resolution: "@jest/source-map@npm:29.6.3" @@ -7836,18 +7127,6 @@ __metadata: languageName: node linkType: hard -"@jest/test-result@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/test-result@npm:30.0.0" - dependencies: - "@jest/console": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - "@types/istanbul-lib-coverage": "npm:^2.0.6" - collect-v8-coverage: "npm:^1.0.2" - checksum: 10/2a9f72d63918921ca2a1a629ba3b12cc84b11475124b0c49589075983200838b35daca8304fe53f1529ba8508ce7a32f57494d71231cdec2d776dc9c469cbbf1 - languageName: node - linkType: hard - "@jest/test-result@npm:^29.7.0": version: 29.7.0 resolution: "@jest/test-result@npm:29.7.0" @@ -7860,18 +7139,6 @@ __metadata: languageName: node linkType: hard -"@jest/test-sequencer@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/test-sequencer@npm:30.0.0" - dependencies: - "@jest/test-result": "npm:30.0.0" - graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.0.0" - slash: "npm:^3.0.0" - checksum: 10/df62cd193b381b5cf37aa4e36e1aed11fa2db0a28d81ff41efb94db158ff85d061e823589e990b9e3dfdc1835620f200f9505f70fa34ca2e74b4347ec009b497 - languageName: node - linkType: hard - "@jest/test-sequencer@npm:^29.7.0": version: 29.7.0 resolution: "@jest/test-sequencer@npm:29.7.0" @@ -7884,29 +7151,6 @@ __metadata: languageName: node linkType: hard -"@jest/transform@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/transform@npm:30.0.0" - dependencies: - "@babel/core": "npm:^7.27.4" - "@jest/types": "npm:30.0.0" - "@jridgewell/trace-mapping": "npm:^0.3.25" - babel-plugin-istanbul: "npm:^7.0.0" - chalk: "npm:^4.1.2" - convert-source-map: "npm:^2.0.0" - fast-json-stable-stringify: "npm:^2.1.0" - graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.0.0" - jest-regex-util: "npm:30.0.0" - jest-util: "npm:30.0.0" - micromatch: "npm:^4.0.8" - pirates: "npm:^4.0.7" - slash: "npm:^3.0.0" - write-file-atomic: "npm:^5.0.1" - checksum: 10/1b54cfa069a7b2339a287b25d1defb42c3e978b840dcb908b6496363b4b06604c5585a5c1aa546a2d45fede5cd2e82148126eb732f6f9139f4fa0279eff506fb - languageName: node - linkType: hard - "@jest/transform@npm:^29.7.0": version: 29.7.0 resolution: "@jest/transform@npm:29.7.0" @@ -7930,35 +7174,6 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:30.0.0": - version: 30.0.0 - resolution: "@jest/types@npm:30.0.0" - dependencies: - "@jest/pattern": "npm:30.0.0" - "@jest/schemas": "npm:30.0.0" - "@types/istanbul-lib-coverage": "npm:^2.0.6" - "@types/istanbul-reports": "npm:^3.0.4" - "@types/node": "npm:*" - "@types/yargs": "npm:^17.0.33" - chalk: "npm:^4.1.2" - checksum: 10/647481170c2c2f0b61920c3dcaab3a049fc098b544c6bbf3b5a6f8c3c65667af1c29a1f601f9c0115cd4dfdedd9fad82423feaedc5259a47fa5f2c34de5f8ec1 - languageName: node - linkType: hard - -"@jest/types@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/types@npm:29.5.0" - dependencies: - "@jest/schemas": "npm:^29.4.3" - "@types/istanbul-lib-coverage": "npm:^2.0.0" - "@types/istanbul-reports": "npm:^3.0.0" - "@types/node": "npm:*" - "@types/yargs": "npm:^17.0.8" - chalk: "npm:^4.0.0" - checksum: 10/910a134cd1c2cd7d74dfcf9981c2f1a6c1d9772edecb7738947b059c4e0bb843a0d26a3c7dfff112f2fc4a473ecc18679edda498416f0048a8d181ff43a08bee - languageName: node - linkType: hard - "@jest/types@npm:^29.6.3": version: 29.6.3 resolution: "@jest/types@npm:29.6.3" @@ -7984,16 +7199,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.12": - version: 0.3.13 - resolution: "@jridgewell/gen-mapping@npm:0.3.13" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.0" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10/902f8261dcf450b4af7b93f9656918e02eec80a2169e155000cb2059f90113dd98f3ccf6efc6072cee1dd84cac48cade51da236972d942babc40e4c23da4d62a - languageName: node - linkType: hard - "@jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.5 resolution: "@jridgewell/gen-mapping@npm:0.3.5" @@ -8005,16 +7210,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/remapping@npm:^2.3.5": - version: 2.3.5 - resolution: "@jridgewell/remapping@npm:2.3.5" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10/c2bb01856e65b506d439455f28aceacf130d6c023d1d4e3b48705e88def3571753e1a887daa04b078b562316c92d26ce36408a60534bceca3f830aec88a339ad - languageName: node - linkType: hard - "@jridgewell/resolve-uri@npm:3.1.0, @jridgewell/resolve-uri@npm:^3.0.3": version: 3.1.0 resolution: "@jridgewell/resolve-uri@npm:3.1.0" @@ -8043,6 +7238,26 @@ __metadata: languageName: node linkType: hard +"@jridgewell/source-map@npm:^0.3.2": + version: 0.3.2 + resolution: "@jridgewell/source-map@npm:0.3.2" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.0" + "@jridgewell/trace-mapping": "npm:^0.3.9" + checksum: 10/1aaa42075bac32a551708025da0c07b11c11fb05ccd10fb70df2cb0db88773338ab0f33f175d9865379cb855bb3b1cda478367747a1087309fda40a7b9214bfa + languageName: node + linkType: hard + +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.6 + resolution: "@jridgewell/source-map@npm:0.3.6" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + checksum: 10/0a9aca9320dc9044014ba0ef989b3a8411b0d778895553e3b7ca2ac0a75a20af4a5ad3f202acfb1879fa40466036a4417e1d5b38305baed8b9c1ebe6e4b3e7f5 + languageName: node + linkType: hard + "@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": version: 1.4.14 resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" @@ -8057,7 +7272,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.5.0": +"@jridgewell/sourcemap-codec@npm:^1.5.5": version: 1.5.5 resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" checksum: 10/5d9d207b462c11e322d71911e55e21a4e2772f71ffe8d6f1221b8eb5ae6774458c1d242f897fb0814e8714ca9a6b498abfa74dfe4f434493342902b1a48b33a5 @@ -8084,7 +7299,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": +"@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -8094,16 +7309,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.28": - version: 0.3.30 - resolution: "@jridgewell/trace-mapping@npm:0.3.30" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10/f9fabe1122058f4fedc242bdc43fcaacb6b222c6fb712b7904c37704dcb16e50e07ca137ff99043da44292b18a8720296ff97f7703e960678b8ef51d0db4d250 - languageName: node - linkType: hard - "@js-sdsl/ordered-map@npm:^4.4.2": version: 4.4.2 resolution: "@js-sdsl/ordered-map@npm:4.4.2" @@ -9400,17 +8605,6 @@ __metadata: languageName: node linkType: hard -"@napi-rs/wasm-runtime@npm:^0.2.11": - version: 0.2.11 - resolution: "@napi-rs/wasm-runtime@npm:0.2.11" - dependencies: - "@emnapi/core": "npm:^1.4.3" - "@emnapi/runtime": "npm:^1.4.3" - "@tybys/wasm-util": "npm:^0.9.0" - checksum: 10/e30fe3060474c5018e160231df0531d62b5e22f4736ecd49c04ca6cadacb2acf59b9205435794cd5b898e41e2e3ddb6523e93b97799bd1f4d0751557de6e38e4 - languageName: node - linkType: hard - "@nicolo-ribaudo/chokidar-2@npm:2.1.8-no-fsevents.3": version: 2.1.8-no-fsevents.3 resolution: "@nicolo-ribaudo/chokidar-2@npm:2.1.8-no-fsevents.3" @@ -10367,13 +9561,6 @@ __metadata: languageName: node linkType: hard -"@pkgr/core@npm:^0.2.4": - version: 0.2.7 - resolution: "@pkgr/core@npm:0.2.7" - checksum: 10/b16959878940f3d3016b79a4b2c23fd518aaec6b47295baa3154fbcf6574fee644c51023bb69069fa3ea9cdcaca40432818f54695f11acc0ae326cf56676e4d1 - languageName: node - linkType: hard - "@pm2/agent@npm:~2.0.0": version: 2.0.4 resolution: "@pm2/agent@npm:2.0.4" @@ -10433,6 +9620,43 @@ __metadata: languageName: node linkType: hard +"@pmmmwh/react-refresh-webpack-plugin@npm:^0.5.15": + version: 0.5.15 + resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.5.15" + dependencies: + ansi-html: "npm:^0.0.9" + core-js-pure: "npm:^3.23.3" + error-stack-parser: "npm:^2.0.6" + html-entities: "npm:^2.1.0" + loader-utils: "npm:^2.0.4" + schema-utils: "npm:^4.2.0" + source-map: "npm:^0.7.3" + peerDependencies: + "@types/webpack": 4.x || 5.x + react-refresh: ">=0.10.0 <1.0.0" + sockjs-client: ^1.4.0 + type-fest: ">=0.17.0 <5.0.0" + webpack: ">=4.43.0 <6.0.0" + webpack-dev-server: 3.x || 4.x || 5.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + "@types/webpack": + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + checksum: 10/d8c978654c4c6873edc3336bca87d359d3a7f32571e8404af8a3defd0e515aa34d9dc8324a9157d0220d72fb8a6a350660301c2757df964f845422a898714bc7 + languageName: node + linkType: hard + "@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": version: 1.1.2 resolution: "@protobufjs/aspromise@npm:1.1.2" @@ -10615,12 +9839,12 @@ __metadata: languageName: node linkType: hard -"@pulumi/random@npm:^4.18.3": - version: 4.18.3 - resolution: "@pulumi/random@npm:4.18.3" +"@pulumi/random@npm:4.17.0": + version: 4.17.0 + resolution: "@pulumi/random@npm:4.17.0" dependencies: "@pulumi/pulumi": "npm:^3.142.0" - checksum: 10/0b2f176c6d339362ca3c573d8176fbe2a25c1a37e0a636e5ee882e871e5b314706e5aec29790650ec0379afbbd513222e5ed261ccd5e891eb15cbedfbb7ca7f2 + checksum: 10/56e923b5c013101999102d3aef6a3620e6a2b54588cd3375c8aea3efa65d54244f7af989659fe687a71cce4f8177c2f132d25c625275f3302aa3e9909ebe5674 languageName: node linkType: hard @@ -11161,6 +10385,118 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm-eabi@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.50.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-android-arm64@npm:4.50.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.50.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.50.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.50.0" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-freebsd-x64@npm:4.50.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.50.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.50.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.50.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.50.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-loongarch64-gnu@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.50.0" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-ppc64-gnu@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.50.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.50.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-musl@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.50.0" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.50.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.50.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-x64-gnu@npm:^4.24.0": version: 4.44.1 resolution: "@rollup/rollup-linux-x64-gnu@npm:4.44.1" @@ -11168,6 +10504,41 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-x64-musl@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.50.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-openharmony-arm64@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.50.0" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.50.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.50.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.50.0": + version: 4.50.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.50.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@rspack/binding-darwin-arm64@npm:1.3.13": version: 1.3.13 resolution: "@rspack/binding-darwin-arm64@npm:1.3.13" @@ -11283,9 +10654,9 @@ __metadata: languageName: node linkType: hard -"@rspack/dev-server@npm:^1.1.4": - version: 1.1.4 - resolution: "@rspack/dev-server@npm:1.1.4" +"@rspack/dev-server@npm:^1.1.3": + version: 1.1.3 + resolution: "@rspack/dev-server@npm:1.1.3" dependencies: chokidar: "npm:^3.6.0" http-proxy-middleware: "npm:^2.0.9" @@ -11294,7 +10665,7 @@ __metadata: ws: "npm:^8.18.0" peerDependencies: "@rspack/core": "*" - checksum: 10/9409af5b9cd6f3de70caea7f82595a5e99e39ec203ef93fc9973fefdcacf6b7d264d07e927a2331d73d7d606f211865d82386bdde410f6be506ff91a1af89d99 + checksum: 10/31cef80a602acf9468a94c31b1f09239cae9c47cf0ed25c6bcddd057bbaff5a220a1dead068a255d35d0addfea21d81a574069d63ea258c2807d84a02d4fe966 languageName: node linkType: hard @@ -11449,13 +10820,6 @@ __metadata: languageName: node linkType: hard -"@sinclair/typebox@npm:^0.34.0": - version: 0.34.33 - resolution: "@sinclair/typebox@npm:0.34.33" - checksum: 10/7948758249860cb6d6d093bea5902ab2e8cfd5095f4882d5a709773f69e4678a6e8f2b384d3116c021c4ebc11727e033882b791d146691a7d388dd78f36e611d - languageName: node - linkType: hard - "@sindresorhus/is@npm:^4.0.0": version: 4.6.0 resolution: "@sindresorhus/is@npm:4.6.0" @@ -11499,15 +10863,6 @@ __metadata: languageName: node linkType: hard -"@sinonjs/fake-timers@npm:^13.0.0": - version: 13.0.5 - resolution: "@sinonjs/fake-timers@npm:13.0.5" - dependencies: - "@sinonjs/commons": "npm:^3.0.1" - checksum: 10/11ee417968fc4dce1896ab332ac13f353866075a9d2a88ed1f6258f17cc4f7d93e66031b51fcddb8c203aa4d53fd980b0ae18aba06269f4682164878a992ec3f - languageName: node - linkType: hard - "@sinonjs/fake-timers@npm:^13.0.1": version: 13.0.2 resolution: "@sinonjs/fake-timers@npm:13.0.2" @@ -12570,15 +11925,6 @@ __metadata: languageName: node linkType: hard -"@tybys/wasm-util@npm:^0.9.0": - version: 0.9.0 - resolution: "@tybys/wasm-util@npm:0.9.0" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10/aa58e64753a420ad1eefaf7bacef3dda61d74f9336925943d9244132d5b48d9242f734f1e707fd5ccfa6dd1d8ec8e6debc234b4dedb3a5b0d8486d1f373350b2 - languageName: node - linkType: hard - "@types/accept-language-parser@npm:^1.5.3": version: 1.5.3 resolution: "@types/accept-language-parser@npm:1.5.3" @@ -12652,19 +11998,6 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7.20.5": - version: 7.20.5 - resolution: "@types/babel__core@npm:7.20.5" - dependencies: - "@babel/parser": "npm:^7.20.7" - "@babel/types": "npm:^7.20.7" - "@types/babel__generator": "npm:*" - "@types/babel__template": "npm:*" - "@types/babel__traverse": "npm:*" - checksum: 10/c32838d280b5ab59d62557f9e331d3831f8e547ee10b4f85cb78753d97d521270cebfc73ce501e9fb27fe71884d1ba75e18658692c2f4117543f0fc4e3e118b3 - languageName: node - linkType: hard - "@types/babel__generator@npm:*": version: 7.6.4 resolution: "@types/babel__generator@npm:7.6.4" @@ -12703,7 +12036,7 @@ __metadata: languageName: node linkType: hard -"@types/bonjour@npm:^3.5.13": +"@types/bonjour@npm:^3.5.13, @types/bonjour@npm:^3.5.9": version: 3.5.13 resolution: "@types/bonjour@npm:3.5.13" dependencies: @@ -12738,7 +12071,25 @@ __metadata: languageName: node linkType: hard -"@types/connect-history-api-fallback@npm:^1.5.4": +"@types/chai@npm:^5.2.2": + version: 5.2.2 + resolution: "@types/chai@npm:5.2.2" + dependencies: + "@types/deep-eql": "npm:*" + checksum: 10/de425e7b02cc1233a93923866e019dffbafa892774813940b780ebb1ac9f8a8c57b7438c78686bf4e5db05cd3fc8a970fedf6b83638543995ecca88ef2060668 + languageName: node + linkType: hard + +"@types/cli-progress@npm:^3.11.6": + version: 3.11.6 + resolution: "@types/cli-progress@npm:3.11.6" + dependencies: + "@types/node": "npm:*" + checksum: 10/0209929b252e61260cd9212ac220dfff97471cfe345323f35b37a65a83fcfa3117d129fea08824e2bd9841075db74ac04a8cc63d0d474493ef810d30e217bf7e + languageName: node + linkType: hard + +"@types/connect-history-api-fallback@npm:^1.3.5, @types/connect-history-api-fallback@npm:^1.5.4": version: 1.5.4 resolution: "@types/connect-history-api-fallback@npm:1.5.4" dependencies: @@ -12778,6 +12129,33 @@ __metadata: languageName: node linkType: hard +"@types/deep-eql@npm:*": + version: 4.0.2 + resolution: "@types/deep-eql@npm:4.0.2" + checksum: 10/249a27b0bb22f6aa28461db56afa21ec044fa0e303221a62dff81831b20c8530502175f1a49060f7099e7be06181078548ac47c668de79ff9880241968d43d0c + languageName: node + linkType: hard + +"@types/eslint-scope@npm:^3.7.7": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" + dependencies: + "@types/eslint": "npm:*" + "@types/estree": "npm:*" + checksum: 10/e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e + languageName: node + linkType: hard + +"@types/eslint@npm:*": + version: 9.6.1 + resolution: "@types/eslint@npm:9.6.1" + dependencies: + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 10/719fcd255760168a43d0e306ef87548e1e15bffe361d5f4022b0f266575637acc0ecb85604ac97879ee8ae83c6a6d0613b0ed31d0209ddf22a0fe6d608fc56fe + languageName: node + linkType: hard + "@types/eslint@npm:^8.56.10": version: 8.56.12 resolution: "@types/eslint@npm:8.56.12" @@ -12795,6 +12173,20 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:1.0.8, @types/estree@npm:^1.0.0": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: 10/25a4c16a6752538ffde2826c2cc0c6491d90e69cd6187bef4a006dd2c3c45469f049e643d7e516c515f21484dc3d48fd5c870be158a5beb72f5baf3dc43e4099 + languageName: node + linkType: hard + +"@types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": version: 4.17.43 resolution: "@types/express-serve-static-core@npm:4.17.43" @@ -12831,7 +12223,7 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:^4.17.21": +"@types/express@npm:^4.17.13, @types/express@npm:^4.17.21": version: 4.17.22 resolution: "@types/express@npm:4.17.22" dependencies: @@ -12917,6 +12309,13 @@ __metadata: languageName: node linkType: hard +"@types/html-minifier-terser@npm:^6.0.0": + version: 6.1.0 + resolution: "@types/html-minifier-terser@npm:6.1.0" + checksum: 10/06bb3e1e8ebff43602c826d67f53f1fd3a6b9c751bfbc67d7ea4e85679446a639e20e60adad8c9d44ab4baf1337b3861b91e7e5e2be798575caf0cc1a5712552 + languageName: node + linkType: hard + "@types/http-cache-semantics@npm:*": version: 4.0.4 resolution: "@types/http-cache-semantics@npm:4.0.4" @@ -12975,13 +12374,6 @@ __metadata: languageName: node linkType: hard -"@types/istanbul-lib-coverage@npm:^2.0.6": - version: 2.0.6 - resolution: "@types/istanbul-lib-coverage@npm:2.0.6" - checksum: 10/3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 - languageName: node - linkType: hard - "@types/istanbul-lib-report@npm:*": version: 3.0.0 resolution: "@types/istanbul-lib-report@npm:3.0.0" @@ -13000,32 +12392,6 @@ __metadata: languageName: node linkType: hard -"@types/istanbul-reports@npm:^3.0.4": - version: 3.0.4 - resolution: "@types/istanbul-reports@npm:3.0.4" - dependencies: - "@types/istanbul-lib-report": "npm:*" - checksum: 10/93eb18835770b3431f68ae9ac1ca91741ab85f7606f310a34b3586b5a34450ec038c3eed7ab19266635499594de52ff73723a54a72a75b9f7d6a956f01edee95 - languageName: node - linkType: hard - -"@types/jest@npm:^29.5.14": - version: 29.5.14 - resolution: "@types/jest@npm:29.5.14" - dependencies: - expect: "npm:^29.0.0" - pretty-format: "npm:^29.0.0" - checksum: 10/59ec7a9c4688aae8ee529316c43853468b6034f453d08a2e1064b281af9c81234cec986be796288f1bbb29efe943bc950e70c8fa8faae1e460d50e3cf9760f9b - languageName: node - linkType: hard - -"@types/js-yaml@npm:^4.0.5": - version: 4.0.9 - resolution: "@types/js-yaml@npm:4.0.9" - checksum: 10/a0ce595db8a987904badd21fc50f9f444cb73069f4b95a76cc222e0a17b3ff180669059c763ec314bc4c3ce284379177a9da80e83c5f650c6c1310cafbfaa8e6 - languageName: node - linkType: hard - "@types/jsdom@link:./typings/void::locator=root-workspace-0b6124%40workspace%3A.": version: 0.0.0-use.local resolution: "@types/jsdom@link:./typings/void::locator=root-workspace-0b6124%40workspace%3A." @@ -13418,15 +12784,6 @@ __metadata: languageName: node linkType: hard -"@types/readable-stream@npm:^4.0.0, @types/readable-stream@npm:^4.0.21": - version: 4.0.21 - resolution: "@types/readable-stream@npm:4.0.21" - dependencies: - "@types/node": "npm:*" - checksum: 10/8cd8bb384931dc6e40e5517443c4d7d369ee1bfdd2200c844dd428190d886e3093b5d40808d007df336377f5d9ac4e7d1546e3e843d02a3bdf1d1477ecb0f4d2 - languageName: node - linkType: hard - "@types/resize-observer-browser@npm:^0.1.4": version: 0.1.7 resolution: "@types/resize-observer-browser@npm:0.1.7" @@ -13476,7 +12833,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12, @types/semver@npm:^7.3.4": +"@types/semver@npm:^7.3.4": version: 7.3.13 resolution: "@types/semver@npm:7.3.13" checksum: 10/0064efd7a0515a539062b71630c72ca2b058501b957326c285cdff82f42c1716d9f9f831332ccf719d5ee8cc3ef24f9ff62122d7a7140c73959a240b49b0f62d @@ -13500,7 +12857,7 @@ __metadata: languageName: node linkType: hard -"@types/serve-index@npm:^1.9.4": +"@types/serve-index@npm:^1.9.1, @types/serve-index@npm:^1.9.4": version: 1.9.4 resolution: "@types/serve-index@npm:1.9.4" dependencies: @@ -13520,7 +12877,7 @@ __metadata: languageName: node linkType: hard -"@types/serve-static@npm:^1.15.5": +"@types/serve-static@npm:^1.13.10, @types/serve-static@npm:^1.15.5": version: 1.15.7 resolution: "@types/serve-static@npm:1.15.7" dependencies: @@ -13568,7 +12925,7 @@ __metadata: languageName: node linkType: hard -"@types/sockjs@npm:^0.3.36": +"@types/sockjs@npm:^0.3.33, @types/sockjs@npm:^0.3.36": version: 0.3.36 resolution: "@types/sockjs@npm:0.3.36" dependencies: @@ -13584,13 +12941,6 @@ __metadata: languageName: node linkType: hard -"@types/stack-utils@npm:^2.0.3": - version: 2.0.3 - resolution: "@types/stack-utils@npm:2.0.3" - checksum: 10/72576cc1522090fe497337c2b99d9838e320659ac57fa5560fcbdcbafcf5d0216c6b3a0a8a4ee4fdb3b1f5e3420aa4f6223ab57b82fef3578bec3206425c6cf5 - languageName: node - linkType: hard - "@types/store@npm:^2.0.2": version: 2.0.2 resolution: "@types/store@npm:2.0.2" @@ -13628,13 +12978,6 @@ __metadata: languageName: node linkType: hard -"@types/validate-npm-package-name@npm:^3.0.0": - version: 3.0.3 - resolution: "@types/validate-npm-package-name@npm:3.0.3" - checksum: 10/6c68d9e83a144c2b328985ac42adb8acd2f21ed540eac210fbbdac7037885648b1e629d2e906c200e0b9043ed95317b0032685a66284bb4a5153bda14c75328c - languageName: node - linkType: hard - "@types/warning@npm:^3.0.0": version: 3.0.0 resolution: "@types/warning@npm:3.0.0" @@ -13649,7 +12992,7 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^8.18.1, @types/ws@npm:^8.5.10": +"@types/ws@npm:^8.5.10, @types/ws@npm:^8.5.5": version: 8.18.1 resolution: "@types/ws@npm:8.18.1" dependencies: @@ -13665,15 +13008,6 @@ __metadata: languageName: node linkType: hard -"@types/yargs@npm:^17.0.33": - version: 17.0.33 - resolution: "@types/yargs@npm:17.0.33" - dependencies: - "@types/yargs-parser": "npm:*" - checksum: 10/16f6681bf4d99fb671bf56029141ed01db2862e3db9df7fc92d8bea494359ac96a1b4b1c35a836d1e95e665fb18ad753ab2015fc0db663454e8fd4e5d5e2ef91 - languageName: node - linkType: hard - "@types/yargs@npm:^17.0.8": version: 17.0.22 resolution: "@types/yargs@npm:17.0.22" @@ -13724,17 +13058,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/experimental-utils@npm:^5.0.0": - version: 5.51.0 - resolution: "@typescript-eslint/experimental-utils@npm:5.51.0" - dependencies: - "@typescript-eslint/utils": "npm:5.51.0" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10/109f80c534a4079f4120075bdf460ccccb3941f1d795d449a9ad1e78d2234be56297b00243e180f36b877baf354404fa290453ab16dd45042f31d133d6e2d02c - languageName: node - linkType: hard - "@typescript-eslint/parser@npm:^6.21.0": version: 6.21.0 resolution: "@typescript-eslint/parser@npm:6.21.0" @@ -13753,16 +13076,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.51.0": - version: 5.51.0 - resolution: "@typescript-eslint/scope-manager@npm:5.51.0" - dependencies: - "@typescript-eslint/types": "npm:5.51.0" - "@typescript-eslint/visitor-keys": "npm:5.51.0" - checksum: 10/f60867cacfb05c3a0a94b04863b0abaaf33c686ea95c1ebb719dd07edaca2f4fb28e3f1bb10d44e453ec75e75f5c8cd4ee90c07b42d587a890c1a11c86e4d536 - languageName: node - linkType: hard - "@typescript-eslint/scope-manager@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/scope-manager@npm:6.21.0" @@ -13790,13 +13103,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:5.51.0": - version: 5.51.0 - resolution: "@typescript-eslint/types@npm:5.51.0" - checksum: 10/dfc3ee381bf2defcd36ef24895a9e1215127b5baf64b5130e59b52308f4f297c8992932597386f74e8b899ef77e5a1d39096373e1011fe58f20fa62cc5f2869d - languageName: node - linkType: hard - "@typescript-eslint/types@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/types@npm:6.21.0" @@ -13804,24 +13110,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.51.0": - version: 5.51.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.51.0" - dependencies: - "@typescript-eslint/types": "npm:5.51.0" - "@typescript-eslint/visitor-keys": "npm:5.51.0" - debug: "npm:^4.3.4" - globby: "npm:^11.1.0" - is-glob: "npm:^4.0.3" - semver: "npm:^7.3.7" - tsutils: "npm:^3.21.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/96d2771d744db63e08c5e7c9a1f61e92444cf63f152552e4e0fa321e2fc0979b15f32b8c54084a845d9d5097493d32edc3bf1ce1b4d4f3a0924b2fb9687ae712 - languageName: node - linkType: hard - "@typescript-eslint/typescript-estree@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" @@ -13841,24 +13129,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.51.0": - version: 5.51.0 - resolution: "@typescript-eslint/utils@npm:5.51.0" - dependencies: - "@types/json-schema": "npm:^7.0.9" - "@types/semver": "npm:^7.3.12" - "@typescript-eslint/scope-manager": "npm:5.51.0" - "@typescript-eslint/types": "npm:5.51.0" - "@typescript-eslint/typescript-estree": "npm:5.51.0" - eslint-scope: "npm:^5.1.1" - eslint-utils: "npm:^3.0.0" - semver: "npm:^7.3.7" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10/bf43e82649ff27e26c84bb7bb9aff5efb29157d95251b93af980c1574f8967432464740139afc02623ad40630c6024b6584036eef0b4079af7111a158b565b4f - languageName: node - linkType: hard - "@typescript-eslint/utils@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/utils@npm:6.21.0" @@ -13876,16 +13146,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.51.0": - version: 5.51.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.51.0" - dependencies: - "@typescript-eslint/types": "npm:5.51.0" - eslint-visitor-keys: "npm:^3.3.0" - checksum: 10/4da80b8d110bce4ca8b162b2c96183dff35dd1a2262d96ae4a384e2a70fe9f499d63b91dafec2fb4ae408770302dc7620f04b9a66952c8dc96ed956b3b2a32c6 - languageName: node - linkType: hard - "@typescript-eslint/visitor-keys@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" @@ -13903,134 +13163,6 @@ __metadata: languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.3.0": - version: 1.3.0 - resolution: "@ungap/structured-clone@npm:1.3.0" - checksum: 10/80d6910946f2b1552a2406650051c91bbd1f24a6bf854354203d84fe2714b3e8ce4618f49cc3410494173a1c1e8e9777372fe68dce74bd45faf0a7a1a6ccf448 - languageName: node - linkType: hard - -"@unrs/resolver-binding-darwin-arm64@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.7.13" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@unrs/resolver-binding-darwin-x64@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-darwin-x64@npm:1.7.13" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@unrs/resolver-binding-freebsd-x64@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.7.13" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.13" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.13" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.13" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@unrs/resolver-binding-linux-arm64-musl@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.7.13" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.13" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.13" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.13" - conditions: os=linux & cpu=riscv64 & libc=musl - languageName: node - linkType: hard - -"@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.13" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@unrs/resolver-binding-linux-x64-gnu@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.7.13" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@unrs/resolver-binding-linux-x64-musl@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.7.13" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@unrs/resolver-binding-wasm32-wasi@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.7.13" - dependencies: - "@napi-rs/wasm-runtime": "npm:^0.2.11" - conditions: cpu=wasm32 - languageName: node - linkType: hard - -"@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.13" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.13" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@unrs/resolver-binding-win32-x64-msvc@npm:1.7.13": - version: 1.7.13 - resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.7.13" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@verdaccio/auth@npm:8.0.0-next-8.7": version: 8.0.0-next-8.7 resolution: "@verdaccio/auth@npm:8.0.0-next-8.7" @@ -14278,6 +13410,240 @@ __metadata: languageName: node linkType: hard +"@vitest/expect@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/expect@npm:3.2.4" + dependencies: + "@types/chai": "npm:^5.2.2" + "@vitest/spy": "npm:3.2.4" + "@vitest/utils": "npm:3.2.4" + chai: "npm:^5.2.0" + tinyrainbow: "npm:^2.0.0" + checksum: 10/dc69ce886c13714dfbbff78f2d2cb7eb536017e82301a73c42d573a9e9d2bf91005ac7abd9b977adf0a3bd431209f45a8ac2418029b68b0a377e092607c843ce + languageName: node + linkType: hard + +"@vitest/mocker@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/mocker@npm:3.2.4" + dependencies: + "@vitest/spy": "npm:3.2.4" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.17" + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10/5e92431b6ed9fc1679060e4caef3e4623f4750542a5d7cd944774f8217c4d231e273202e8aea00bab33260a5a9222ecb7005d80da0348c3c829bd37d123071a8 + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:3.2.4, @vitest/pretty-format@npm:^3.2.4": + version: 3.2.4 + resolution: "@vitest/pretty-format@npm:3.2.4" + dependencies: + tinyrainbow: "npm:^2.0.0" + checksum: 10/8dd30cbf956e01fbab042fe651fb5175d9f0cd00b7b569a46cd98df89c4fec47dab12916201ad6e09a4f25f2a2ec8927a4bfdc61118593097f759c90b18a51d4 + languageName: node + linkType: hard + +"@vitest/runner@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/runner@npm:3.2.4" + dependencies: + "@vitest/utils": "npm:3.2.4" + pathe: "npm:^2.0.3" + strip-literal: "npm:^3.0.0" + checksum: 10/197bd55def519ef202f990b7c1618c212380831827c116240871033e4973decb780503c705ba9245a12bd8121f3ac4086ffcb3e302148b62d9bd77fd18dd1deb + languageName: node + linkType: hard + +"@vitest/snapshot@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/snapshot@npm:3.2.4" + dependencies: + "@vitest/pretty-format": "npm:3.2.4" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.3" + checksum: 10/acfb682491b9ca9345bf9fed02c2779dec43e0455a380c1966b0aad8dd81c79960902cf34621ab48fe80a0eaf8c61cc42dec186a1321dc3c9897ef2ebd5f1bc4 + languageName: node + linkType: hard + +"@vitest/spy@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/spy@npm:3.2.4" + dependencies: + tinyspy: "npm:^4.0.3" + checksum: 10/7d38c299f42a8c7e5e41652b203af98ca54e63df69c3b072d0e401d5a57fbbba3e39d8538ac1b3022c26718a6388d0bcc222bc2f07faab75942543b9247c007d + languageName: node + linkType: hard + +"@vitest/utils@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/utils@npm:3.2.4" + dependencies: + "@vitest/pretty-format": "npm:3.2.4" + loupe: "npm:^3.1.4" + tinyrainbow: "npm:^2.0.0" + checksum: 10/7f12ef63bd8ee13957744d1f336b0405f164ade4358bf9dfa531f75bbb58ffac02bf61aba65724311ddbc50b12ba54853a169e59c6b837c16086173b9a480710 + languageName: node + linkType: hard + +"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/ast@npm:1.14.1" + dependencies: + "@webassemblyjs/helper-numbers": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + checksum: 10/f83e6abe38057f5d87c1fb356513a371a8b43c9b87657f2790741a66b1ef8ecf958d1391bc42f27c5fb33f58ab8286a38ea849fdd21f433cd4df1307424bab45 + languageName: node + linkType: hard + +"@webassemblyjs/floating-point-hex-parser@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2" + checksum: 10/e866ec8433f4a70baa511df5e8f2ebcd6c24f4e2cc6274c7c5aabe2bcce3459ea4680e0f35d450e1f3602acf3913b6b8e4f15069c8cfd34ae8609fb9a7d01795 + languageName: node + linkType: hard + +"@webassemblyjs/helper-api-error@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-api-error@npm:1.13.2" + checksum: 10/48b5df7fd3095bb252f59a139fe2cbd999a62ac9b488123e9a0da3906ad8a2f2da7b2eb21d328c01a90da987380928706395c2897d1f3ed9e2125b6d75a920d0 + languageName: node + linkType: hard + +"@webassemblyjs/helper-buffer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.14.1" + checksum: 10/9690afeafa5e765a34620aa6216e9d40f9126d4e37e9726a2594bf60cab6b211ef20ab6670fd3c4449dd4a3497e69e49b2b725c8da0fb213208c7f45f15f5d5b + languageName: node + linkType: hard + +"@webassemblyjs/helper-numbers@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-numbers@npm:1.13.2" + dependencies: + "@webassemblyjs/floating-point-hex-parser": "npm:1.13.2" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@xtuc/long": "npm:4.2.2" + checksum: 10/e4c7d0b09811e1cda8eec644a022b560b28f4e974f50195375ccd007df5ee48a922a6dcff5ac40b6a8ec850d56d0ea6419318eee49fec7819ede14e90417a6a4 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-bytecode@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2" + checksum: 10/3edd191fff7296df1ef3b023bdbe6cb5ea668f6386fd197ccfce46015c6f2a8cc9763cfb86503a0b94973ad27996645afff2252ee39a236513833259a47af6ed + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-section@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + checksum: 10/6b73874f906532512371181d7088460f767966f26309e836060c5a8e4e4bfe6d523fb5f4c034b34aa22ebb1192815f95f0e264298769485c1f0980fdd63ae0ce + languageName: node + linkType: hard + +"@webassemblyjs/ieee754@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/ieee754@npm:1.13.2" + dependencies: + "@xtuc/ieee754": "npm:^1.2.0" + checksum: 10/d7e3520baa37a7309fa7db4d73d69fb869878853b1ebd4b168821bd03fcc4c0e1669c06231315b0039035d9a7a462e53de3ad982da4a426a4b0743b5888e8673 + languageName: node + linkType: hard + +"@webassemblyjs/leb128@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/leb128@npm:1.13.2" + dependencies: + "@xtuc/long": "npm:4.2.2" + checksum: 10/3a10542c86807061ec3230bac8ee732289c852b6bceb4b88ebd521a12fbcecec7c432848284b298154f28619e2746efbed19d6904aef06c49ef20a0b85f650cf + languageName: node + linkType: hard + +"@webassemblyjs/utf8@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/utf8@npm:1.13.2" + checksum: 10/27885e5d19f339501feb210867d69613f281eda695ac508f04d69fa3398133d05b6870969c0242b054dc05420ed1cc49a64dea4fe0588c18d211cddb0117cc54 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-edit@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/helper-wasm-section": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-opt": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + "@webassemblyjs/wast-printer": "npm:1.14.1" + checksum: 10/c62c50eadcf80876713f8c9f24106b18cf208160ab842fcb92060fd78c37bf37e7fcf0b7cbf1afc05d230277c2ce0f3f728432082c472dd1293e184a95f9dbdd + languageName: node + linkType: hard + +"@webassemblyjs/wasm-gen@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 10/6085166b0987d3031355fe17a4f9ef0f412e08098d95454059aced2bd72a4c3df2bc099fa4d32d640551fc3eca1ac1a997b44432e46dc9d84642688e42c17ed4 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-opt@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + checksum: 10/fa5d1ef8d2156e7390927f938f513b7fb4440dd6804b3d6c8622b7b1cf25a3abf1a5809f615896d4918e04b27b52bc3cbcf18faf2d563cb563ae0a9204a492db + languageName: node + linkType: hard + +"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 10/07d9805fda88a893c984ed93d5a772d20d671e9731358ab61c6c1af8e0e58d1c42fc230c18974dfddebc9d2dd7775d514ba4d445e70080b16478b4b16c39c7d9 + languageName: node + linkType: hard + +"@webassemblyjs/wast-printer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wast-printer@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@xtuc/long": "npm:4.2.2" + checksum: 10/cef09aad2fcd291bfcf9efdae2ea1e961a1ba0f925d1d9dcdd8c746d32fbaf431b6d26a0241699c0e39f82139018aa720b4ceb84ac6f4c78f13072747480db69 + languageName: node + linkType: hard + "@webiny-scripts/build-packages@workspace:scripts/buildPackages": version: 0.0.0-use.local resolution: "@webiny-scripts/build-packages@workspace:scripts/buildPackages" @@ -14291,7 +13657,6 @@ __metadata: listr2: "npm:^5.0.8" load-json-file: "npm:^6.2.0" serialize-error: "npm:^12.0.0" - tsx: "npm:^4.16.2" write-json-file: "npm:^4.3.0" yargs: "npm:^17.7.2" bin: @@ -14303,13 +13668,11 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny-scripts/cjs-to-esm@workspace:scripts/cjsToEsm" dependencies: + "@types/cli-progress": "npm:^3.11.6" cli-progress: "npm:^3.12.0" - fast-glob: "npm:^3.2.7" - find-up: "npm:5.0.0" + glob: "npm:^11.0.0" p-limit: "npm:^6.2.0" - read-json-sync: "npm:2.0.1" ts-morph: "npm:^24.0.0" - tsx: "npm:^4.16.2" bin: cjs-to-esm: ./src/bin.js languageName: unknown @@ -14336,7 +13699,6 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/api-aco@workspace:packages/api-aco" dependencies: - "@jest/globals": "npm:^29.7.0" "@webiny/api": "npm:0.0.0" "@webiny/api-admin-users": "npm:0.0.0" "@webiny/api-authentication": "npm:0.0.0" @@ -14350,7 +13712,6 @@ __metadata: "@webiny/api-tenancy-so-ddb": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" @@ -14378,7 +13739,6 @@ __metadata: dependencies: "@webiny/api-tenancy": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" @@ -14394,13 +13754,12 @@ __metadata: languageName: unknown linkType: soft -"@webiny/api-admin-users-so-ddb@npm:0.0.0, @webiny/api-admin-users-so-ddb@workspace:packages/api-admin-users-so-ddb": +"@webiny/api-admin-users-so-ddb@workspace:packages/api-admin-users-so-ddb": version: 0.0.0-use.local resolution: "@webiny/api-admin-users-so-ddb@workspace:packages/api-admin-users-so-ddb" dependencies: "@webiny/api-admin-users": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/project-utils": "npm:0.0.0" @@ -14422,9 +13781,9 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler-graphql": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/pubsub": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" dataloader: "npm:^2.2.2" @@ -14436,7 +13795,7 @@ __metadata: languageName: unknown linkType: soft -"@webiny/api-apw-scheduler-so-ddb@workspace:packages/api-apw-scheduler-so-ddb": +"@webiny/api-apw-scheduler-so-ddb@npm:0.0.0, @webiny/api-apw-scheduler-so-ddb@workspace:packages/api-apw-scheduler-so-ddb": version: 0.0.0-use.local resolution: "@webiny/api-apw-scheduler-so-ddb@workspace:packages/api-apw-scheduler-so-ddb" dependencies: @@ -14444,7 +13803,6 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" @@ -14463,7 +13821,6 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/api-apw@workspace:packages/api-apw" dependencies: - "@jest/globals": "npm:^29.7.0" "@webiny/api": "npm:0.0.0" "@webiny/api-admin-settings": "npm:0.0.0" "@webiny/api-headless-cms": "npm:0.0.0" @@ -14474,7 +13831,6 @@ __metadata: "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" @@ -14515,7 +13871,6 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" @@ -14536,7 +13891,7 @@ __metadata: "@webiny/api": "npm:0.0.0" "@webiny/api-authentication": "npm:0.0.0" "@webiny/api-cognito-authenticator": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" languageName: unknown @@ -14547,48 +13902,48 @@ __metadata: resolution: "@webiny/api-authentication@workspace:packages/api-authentication" dependencies: "@webiny/api": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" jest-dynalite: "npm:^3.6.1" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" languageName: unknown linkType: soft -"@webiny/api-background-tasks-ddb@npm:0.0.0, @webiny/api-background-tasks-ddb@workspace:packages/api-background-tasks-ddb": +"@webiny/api-background-tasks-ddb@workspace:packages/api-background-tasks-ddb": version: 0.0.0-use.local resolution: "@webiny/api-background-tasks-ddb@workspace:packages/api-background-tasks-ddb" dependencies: - "@webiny/build-tools": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/tasks": "npm:0.0.0" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" languageName: unknown linkType: soft -"@webiny/api-background-tasks-es@npm:0.0.0, @webiny/api-background-tasks-es@workspace:packages/api-background-tasks-es": +"@webiny/api-background-tasks-es@workspace:packages/api-background-tasks-es": version: 0.0.0-use.local resolution: "@webiny/api-background-tasks-es@workspace:packages/api-background-tasks-es" dependencies: "@webiny/api-elasticsearch-tasks": "npm:0.0.0" "@webiny/api-headless-cms-es-tasks": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/tasks": "npm:0.0.0" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" languageName: unknown linkType: soft -"@webiny/api-background-tasks-os@npm:0.0.0, @webiny/api-background-tasks-os@workspace:packages/api-background-tasks-os": +"@webiny/api-background-tasks-os@workspace:packages/api-background-tasks-os": version: 0.0.0-use.local resolution: "@webiny/api-background-tasks-os@workspace:packages/api-background-tasks-os" dependencies: "@webiny/api-elasticsearch-tasks": "npm:0.0.0" "@webiny/api-headless-cms-es-tasks": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/tasks": "npm:0.0.0" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" @@ -14602,7 +13957,7 @@ __metadata: "@types/jsonwebtoken": "npm:^9.0.2" "@types/jwk-to-pem": "npm:^2.0.1" "@types/node-fetch": "npm:^2.6.1" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" jsonwebtoken: "npm:^9.0.1" jwk-to-pem: "npm:^2.0.1" node-fetch: "npm:2.6.7" @@ -14619,10 +13974,10 @@ __metadata: "@webiny/api-elasticsearch": "npm:0.0.0" "@webiny/api-log": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "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" p-retry: "npm:^4.6.2" typescript: "npm:5.3.3" @@ -14633,7 +13988,6 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/api-elasticsearch-tasks@workspace:packages/api-elasticsearch-tasks" dependencies: - "@jest/globals": "npm:^29.7.0" "@webiny/api": "npm:0.0.0" "@webiny/api-dynamodb-to-elasticsearch": "npm:0.0.0" "@webiny/api-elasticsearch": "npm:0.0.0" @@ -14644,7 +13998,6 @@ __metadata: "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" @@ -14667,9 +14020,7 @@ __metadata: resolution: "@webiny/api-elasticsearch@workspace:packages/api-elasticsearch" dependencies: "@elastic/elasticsearch": "npm:7.12.0" - "@jest/globals": "npm:^29.7.0" "@webiny/api": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" "@webiny/project-utils": "npm:0.0.0" @@ -14692,7 +14043,6 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" "@webiny/handler-graphql": "npm:0.0.0" @@ -14712,10 +14062,10 @@ __metadata: "@webiny/api": "npm:0.0.0" "@webiny/api-file-manager": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" jest: "npm:^29.7.0" jest-dynalite: "npm:^3.6.1" jsonpack: "npm:^1.1.5" @@ -14735,12 +14085,12 @@ __metadata: "@webiny/api-wcp": "npm:0.0.0" "@webiny/api-websockets": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" "@webiny/handler-graphql": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/tasks": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" "@webiny/validation": "npm:0.0.0" @@ -14767,7 +14117,6 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" @@ -14799,7 +14148,6 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" @@ -14816,7 +14164,6 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/api-headless-cms-bulk-actions@workspace:packages/api-headless-cms-bulk-actions" dependencies: - "@jest/globals": "npm:^29.7.0" "@webiny/api": "npm:0.0.0" "@webiny/api-admin-users": "npm:0.0.0" "@webiny/api-headless-cms": "npm:0.0.0" @@ -14824,7 +14171,6 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" "@webiny/handler-graphql": "npm:0.0.0" @@ -14843,7 +14189,6 @@ __metadata: resolution: "@webiny/api-headless-cms-ddb-es@workspace:packages/api-headless-cms-ddb-es" dependencies: "@elastic/elasticsearch": "npm:7.12.0" - "@jest/globals": "npm:^29.7.0" "@types/jsonpack": "npm:^1.1.6" "@webiny/api": "npm:0.0.0" "@webiny/api-dynamodb-to-elasticsearch": "npm:0.0.0" @@ -14856,7 +14201,6 @@ __metadata: "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" @@ -14885,7 +14229,6 @@ __metadata: "@webiny/api": "npm:0.0.0" "@webiny/api-headless-cms": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler-db": "npm:0.0.0" @@ -14906,7 +14249,6 @@ __metadata: resolution: "@webiny/api-headless-cms-es-tasks@workspace:packages/api-headless-cms-es-tasks" dependencies: "@faker-js/faker": "npm:^9.3.0" - "@jest/globals": "npm:^29.7.0" "@webiny/api": "npm:0.0.0" "@webiny/api-elasticsearch": "npm:0.0.0" "@webiny/api-headless-cms": "npm:0.0.0" @@ -14915,7 +14257,6 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" "@webiny/handler-graphql": "npm:0.0.0" @@ -14931,7 +14272,6 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/api-headless-cms-import-export@workspace:packages/api-headless-cms-import-export" dependencies: - "@jest/globals": "npm:^29.7.0" "@smithy/node-http-handler": "npm:^2.1.6" "@types/adm-zip": "npm:^0.5.5" "@types/unzipper": "npm:^0.10.10" @@ -14944,7 +14284,6 @@ __metadata: "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" @@ -14966,14 +14305,14 @@ __metadata: languageName: unknown linkType: soft -"@webiny/api-headless-cms-tasks-ddb-es@npm:0.0.0, @webiny/api-headless-cms-tasks-ddb-es@workspace:packages/api-headless-cms-tasks-ddb-es": +"@webiny/api-headless-cms-tasks-ddb-es@workspace:packages/api-headless-cms-tasks-ddb-es": version: 0.0.0-use.local resolution: "@webiny/api-headless-cms-tasks-ddb-es@workspace:packages/api-headless-cms-tasks-ddb-es" dependencies: "@webiny/api-headless-cms-bulk-actions": "npm:0.0.0" "@webiny/api-headless-cms-import-export": "npm:0.0.0" "@webiny/api-headless-cms-tasks": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" typescript: "npm:5.3.3" languageName: unknown linkType: soft @@ -14991,7 +14330,6 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" @@ -15013,7 +14351,6 @@ __metadata: "@babel/code-frame": "npm:7.27.1" "@graphql-tools/merge": "npm:9.0.24" "@graphql-tools/schema": "npm:10.0.23" - "@jest/globals": "npm:^29.7.0" "@types/babel__code-frame": "npm:^7.0.6" "@types/pluralize": "npm:^0.0.33" "@webiny/api": "npm:0.0.0" @@ -15022,9 +14359,7 @@ __metadata: "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" - "@webiny/di-container": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" @@ -15032,7 +14367,6 @@ __metadata: "@webiny/handler-graphql": "npm:0.0.0" "@webiny/lexical-converter": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" - "@webiny/project": "npm:0.0.0" "@webiny/project-utils": "npm:0.0.0" "@webiny/pubsub": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" @@ -15064,7 +14398,7 @@ __metadata: "@webiny/api": "npm:0.0.0" "@webiny/api-i18n": "npm:0.0.0" "@webiny/api-security": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" graphql: "npm:^15.9.0" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" @@ -15081,7 +14415,6 @@ __metadata: "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" @@ -15105,7 +14438,6 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" @@ -15126,13 +14458,11 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/api-log@workspace:packages/api-log" dependencies: - "@jest/globals": "npm:^29.7.0" "@webiny/api": "npm:0.0.0" "@webiny/api-i18n": "npm:0.0.0" "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" @@ -15154,7 +14484,6 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/api-mailer@workspace:packages/api-mailer" dependencies: - "@jest/globals": "npm:^29.7.0" "@types/crypto-js": "npm:^4.2.2" "@types/nodemailer": "npm:^6.4.17" "@webiny/api": "npm:0.0.0" @@ -15162,7 +14491,6 @@ __metadata: "@webiny/api-i18n": "npm:0.0.0" "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" @@ -15197,7 +14525,6 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" @@ -15219,7 +14546,6 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" @@ -15249,7 +14575,6 @@ __metadata: "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" @@ -15276,12 +14601,11 @@ __metadata: languageName: unknown linkType: soft -"@webiny/api-page-builder-so-ddb-es@workspace:packages/api-page-builder-so-ddb-es": +"@webiny/api-page-builder-so-ddb-es@npm:0.0.0, @webiny/api-page-builder-so-ddb-es@workspace:packages/api-page-builder-so-ddb-es": version: 0.0.0-use.local resolution: "@webiny/api-page-builder-so-ddb-es@workspace:packages/api-page-builder-so-ddb-es" dependencies: "@elastic/elasticsearch": "npm:7.12.0" - "@jest/globals": "npm:^29.7.0" "@webiny/api": "npm:0.0.0" "@webiny/api-aco": "npm:0.0.0" "@webiny/api-dynamodb-to-elasticsearch": "npm:0.0.0" @@ -15300,7 +14624,6 @@ __metadata: "@webiny/api-tenancy-so-ddb": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" @@ -15321,7 +14644,7 @@ __metadata: languageName: unknown linkType: soft -"@webiny/api-page-builder-so-ddb@workspace:packages/api-page-builder-so-ddb": +"@webiny/api-page-builder-so-ddb@npm:0.0.0, @webiny/api-page-builder-so-ddb@workspace:packages/api-page-builder-so-ddb": version: 0.0.0-use.local resolution: "@webiny/api-page-builder-so-ddb@workspace:packages/api-page-builder-so-ddb" dependencies: @@ -15330,7 +14653,6 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" @@ -15351,7 +14673,6 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/api-page-builder@workspace:packages/api-page-builder" dependencies: - "@jest/globals": "npm:^29.7.0" "@types/extract-zip": "npm:^1.6.2" "@types/node-fetch": "npm:^2.6.1" "@types/rimraf": "npm:^3.0.2" @@ -15364,7 +14685,6 @@ __metadata: "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/feature-flags": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" @@ -15394,7 +14714,7 @@ __metadata: languageName: unknown linkType: soft -"@webiny/api-prerendering-service-aws@workspace:packages/api-prerendering-service-aws": +"@webiny/api-prerendering-service-aws@npm:0.0.0, @webiny/api-prerendering-service-aws@workspace:packages/api-prerendering-service-aws": version: 0.0.0-use.local resolution: "@webiny/api-prerendering-service-aws@workspace:packages/api-prerendering-service-aws" dependencies: @@ -15402,10 +14722,10 @@ __metadata: "@webiny/api-log": "npm:0.0.0" "@webiny/api-prerendering-service": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" "@webiny/handler-client": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" lodash: "npm:^4.17.21" rimraf: "npm:^6.0.1" @@ -15413,13 +14733,12 @@ __metadata: languageName: unknown linkType: soft -"@webiny/api-prerendering-service-so-ddb@workspace:packages/api-prerendering-service-so-ddb": +"@webiny/api-prerendering-service-so-ddb@npm:0.0.0, @webiny/api-prerendering-service-so-ddb@workspace:packages/api-prerendering-service-so-ddb": version: 0.0.0-use.local resolution: "@webiny/api-prerendering-service-so-ddb@workspace:packages/api-prerendering-service-so-ddb" dependencies: "@webiny/api-prerendering-service": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" @@ -15441,7 +14760,6 @@ __metadata: "@webiny/api": "npm:0.0.0" "@webiny/api-log": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" @@ -15467,7 +14785,6 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/api-record-locking@workspace:packages/api-record-locking" dependencies: - "@jest/globals": "npm:^29.7.0" "@webiny/api": "npm:0.0.0" "@webiny/api-headless-cms": "npm:0.0.0" "@webiny/api-i18n": "npm:0.0.0" @@ -15475,7 +14792,6 @@ __metadata: "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/api-websockets": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" @@ -15503,10 +14819,10 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-tenant-manager": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-graphql": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" jsonwebtoken: "npm:^9.0.1" jwk-to-pem: "npm:^2.0.1" node-fetch: "npm:2.6.7" @@ -15515,7 +14831,7 @@ __metadata: languageName: unknown linkType: soft -"@webiny/api-security-cognito@npm:0.0.0, @webiny/api-security-cognito@workspace:packages/api-security-cognito": +"@webiny/api-security-cognito@workspace:packages/api-security-cognito": version: 0.0.0-use.local resolution: "@webiny/api-security-cognito@workspace:packages/api-security-cognito" dependencies: @@ -15528,7 +14844,6 @@ __metadata: "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" @@ -15553,9 +14868,9 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-tenant-manager": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler-graphql": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" jsonwebtoken: "npm:^9.0.1" jwk-to-pem: "npm:^2.0.1" node-fetch: "npm:2.6.7" @@ -15570,7 +14885,6 @@ __metadata: dependencies: "@webiny/api-security": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/project-utils": "npm:0.0.0" @@ -15585,14 +14899,12 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/api-security@workspace:packages/api-security" dependencies: - "@jest/globals": "npm:^29.7.0" "@types/jsonwebtoken": "npm:^9.0.2" "@webiny/api": "npm:0.0.0" "@webiny/api-authentication": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" @@ -15617,7 +14929,6 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/api-serverless-cms@workspace:packages/api-serverless-cms" dependencies: - "@jest/globals": "npm:^29.7.0" "@webiny/api": "npm:0.0.0" "@webiny/api-aco": "npm:0.0.0" "@webiny/api-admin-users": "npm:0.0.0" @@ -15641,7 +14952,6 @@ __metadata: "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/api-websockets": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" @@ -15663,7 +14973,6 @@ __metadata: dependencies: "@webiny/api-tenancy": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/project-utils": "npm:0.0.0" @@ -15680,7 +14989,6 @@ __metadata: dependencies: "@webiny/api": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-db": "npm:0.0.0" @@ -15704,7 +15012,6 @@ __metadata: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" "@webiny/handler-graphql": "npm:0.0.0" @@ -15723,8 +15030,8 @@ __metadata: dependencies: "@webiny/api-security": "npm:0.0.0" "@webiny/api-tenancy": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/handler-graphql": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" jest: "npm:^29.7.0" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" @@ -15736,9 +15043,9 @@ __metadata: resolution: "@webiny/api-wcp@workspace:packages/api-wcp" dependencies: "@webiny/api": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler-graphql": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/wcp": "npm:0.0.0" jest-dynalite: "npm:^3.6.1" node-fetch: "npm:2.6.7" @@ -15751,7 +15058,6 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/api-websockets@workspace:packages/api-websockets" dependencies: - "@jest/globals": "npm:^29.7.0" "@webiny/api": "npm:0.0.0" "@webiny/api-headless-cms": "npm:0.0.0" "@webiny/api-i18n": "npm:0.0.0" @@ -15759,7 +15065,6 @@ __metadata: "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" @@ -15781,18 +15086,13 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/api@workspace:packages/api" dependencies: - "@jest/globals": "npm:^29.7.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" "@webiny/project": "npm:0.0.0" "@webiny/project-utils": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" - case: "npm:^1.6.3" rimraf: "npm:^6.0.1" - ts-morph: "npm:^24.0.0" typescript: "npm:5.3.3" - zod: "npm:^3.23.8" languageName: unknown linkType: soft @@ -15803,7 +15103,6 @@ __metadata: "@apollo/react-hooks": "npm:^3.1.5" "@emotion/react": "npm:11.10.8" "@emotion/styled": "npm:11.10.6" - "@jest/globals": "npm:^29.7.0" "@material-design-icons/svg": "npm:^0.14.13" "@material-symbols/svg-400": "npm:^0.4.1" "@minoru/react-dnd-treeview": "npm:3.2.1" @@ -15814,9 +15113,9 @@ __metadata: "@webiny/app-security": "npm:0.0.0" "@webiny/app-utils": "npm:0.0.0" "@webiny/app-wcp": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-properties": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" "@webiny/shared-aco": "npm:0.0.0" @@ -15857,9 +15156,9 @@ __metadata: "@webiny/app-serverless-cms": "npm:0.0.0" "@webiny/app-tenancy": "npm:0.0.0" "@webiny/app-tenant-manager": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" "@webiny/validation": "npm:0.0.0" @@ -15888,9 +15187,9 @@ __metadata: "@webiny/app-admin": "npm:0.0.0" "@webiny/app-cognito-authenticator": "npm:0.0.0" "@webiny/app-security": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-composition": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" "@webiny/validation": "npm:0.0.0" @@ -15919,9 +15218,9 @@ __metadata: "@webiny/app-serverless-cms": "npm:0.0.0" "@webiny/app-tenancy": "npm:0.0.0" "@webiny/app-tenant-manager": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" "@webiny/validation": "npm:0.0.0" apollo-client: "npm:^2.6.10" @@ -15953,9 +15252,9 @@ __metadata: "@webiny/app-admin": "npm:0.0.0" "@webiny/app-plugin-admin-welcome-screen": "npm:0.0.0" "@webiny/app-security": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/feature-flags": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" babel-plugin-named-asset-import: "npm:^1.0.0-next.3e165448" @@ -15973,7 +15272,7 @@ __metadata: languageName: unknown linkType: soft -"@webiny/app-admin-users-cognito@npm:0.0.0, @webiny/app-admin-users-cognito@workspace:packages/app-admin-users-cognito": +"@webiny/app-admin-users-cognito@workspace:packages/app-admin-users-cognito": version: 0.0.0-use.local resolution: "@webiny/app-admin-users-cognito@workspace:packages/app-admin-users-cognito" dependencies: @@ -15985,9 +15284,9 @@ __metadata: "@webiny/app-security": "npm:0.0.0" "@webiny/app-security-access-management": "npm:0.0.0" "@webiny/app-tenancy": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" "@webiny/validation": "npm:0.0.0" @@ -16015,7 +15314,6 @@ __metadata: "@emotion/react": "npm:11.10.8" "@emotion/styled": "npm:11.10.6" "@iconify/json": "npm:^2.2.142" - "@jest/globals": "npm:^29.7.0" "@material-design-icons/svg": "npm:^0.14.13" "@monaco-editor/react": "npm:^4.7.0" "@svgr/webpack": "npm:^6.1.1" @@ -16030,12 +15328,11 @@ __metadata: "@webiny/app-security": "npm:0.0.0" "@webiny/app-theme": "npm:0.0.0" "@webiny/app-wcp": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/lexical-editor": "npm:0.0.0" "@webiny/lexical-theme": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" - "@webiny/project": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-composition": "npm:0.0.0" "@webiny/react-properties": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" @@ -16073,10 +15370,8 @@ __metadata: reset-css: "npm:^5.0.1" rimraf: "npm:^6.0.1" store: "npm:^2.0.12" - ts-morph: "npm:^24.0.0" typescript: "npm:5.3.3" unicode-emoji-json: "npm:^0.4.0" - zod: "npm:^3.23.8" languageName: unknown linkType: soft @@ -16096,9 +15391,9 @@ __metadata: "@webiny/app-i18n": "npm:0.0.0" "@webiny/app-page-builder": "npm:0.0.0" "@webiny/app-security": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" @@ -16138,9 +15433,9 @@ __metadata: "@webiny/app-aco": "npm:0.0.0" "@webiny/app-admin": "npm:0.0.0" "@webiny/app-security": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-properties": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" @@ -16162,7 +15457,7 @@ __metadata: dependencies: "@aws-amplify/auth": "npm:^5.6.15" "@types/lodash": "npm:^4.17.13" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" lodash: "npm:^4.17.21" react: "npm:18.2.0" react-dom: "npm:18.2.0" @@ -16187,8 +15482,8 @@ __metadata: "@webiny/app-headless-cms": "npm:0.0.0" "@webiny/app-page-builder": "npm:0.0.0" "@webiny/app-page-builder-elements": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" apollo-client: "npm:^2.6.10" @@ -16209,7 +15504,7 @@ __metadata: resolution: "@webiny/app-file-manager-s3@workspace:packages/app-file-manager-s3" dependencies: "@webiny/app": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" graphql-tag: "npm:^2.12.6" p-retry: "npm:^4.6.2" rimraf: "npm:^6.0.1" @@ -16226,7 +15521,6 @@ __metadata: "@apollo/react-hooks": "npm:^3.1.5" "@emotion/react": "npm:11.10.8" "@emotion/styled": "npm:11.10.6" - "@jest/globals": "npm:^29.7.0" "@material-design-icons/svg": "npm:^0.14.13" "@svgr/webpack": "npm:^6.1.1" "@types/react": "npm:18.2.79" @@ -16239,10 +15533,10 @@ __metadata: "@webiny/app-security": "npm:0.0.0" "@webiny/app-tenancy": "npm:0.0.0" "@webiny/app-websockets": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-composition": "npm:0.0.0" "@webiny/react-properties": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" @@ -16288,8 +15582,8 @@ __metadata: "@webiny/app-admin": "npm:0.0.0" "@webiny/app-i18n": "npm:0.0.0" "@webiny/app-security": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" apollo-cache: "npm:^1.3.5" apollo-client: "npm:^2.6.10" @@ -16318,9 +15612,9 @@ __metadata: "@webiny/app": "npm:0.0.0" "@webiny/app-admin": "npm:0.0.0" "@webiny/app-security": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-composition": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" "@webiny/validation": "npm:0.0.0" @@ -16352,7 +15646,6 @@ __metadata: "@fortawesome/free-regular-svg-icons": "npm:^6.0.0" "@fortawesome/free-solid-svg-icons": "npm:^6.0.0" "@fortawesome/react-fontawesome": "npm:^0.1.17" - "@jest/globals": "npm:^29.7.0" "@lexical/utils": "npm:0.23.1" "@material-design-icons/svg": "npm:^0.14.13" "@svgr/webpack": "npm:^6.1.1" @@ -16367,7 +15660,6 @@ __metadata: "@webiny/app-security": "npm:0.0.0" "@webiny/app-tenancy": "npm:0.0.0" "@webiny/app-trash-bin": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/feature-flags": "npm:0.0.0" "@webiny/form": "npm:0.0.0" @@ -16375,6 +15667,7 @@ __metadata: "@webiny/lexical-nodes": "npm:0.0.0" "@webiny/lexical-theme": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-composition": "npm:0.0.0" "@webiny/react-properties": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" @@ -16422,9 +15715,9 @@ __metadata: "@webiny/app-admin": "npm:0.0.0" "@webiny/app-i18n": "npm:0.0.0" "@webiny/app-security": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" emotion: "npm:10.0.27" react: "npm:18.2.0" @@ -16446,9 +15739,9 @@ __metadata: "@webiny/app": "npm:0.0.0" "@webiny/app-admin": "npm:0.0.0" "@webiny/app-security": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" "@webiny/validation": "npm:0.0.0" @@ -16478,8 +15771,8 @@ __metadata: "@types/react": "npm:18.2.79" "@webiny/app-admin": "npm:0.0.0" "@webiny/app-security": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" "@webiny/validation": "npm:0.0.0" apollo-cache: "npm:^1.3.5" @@ -16506,7 +15799,7 @@ __metadata: "@emotion/styled": "npm:11.10.6" "@types/facepaint": "npm:^1.2.2" "@types/react": "npm:18.2.79" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-composition": "npm:0.0.0" "@webiny/theme": "npm:0.0.0" execa: "npm:^5.1.1" @@ -16545,6 +15838,9 @@ __metadata: "@apollo/react-common": "npm:^3.1.4" "@apollo/react-components": "npm:^3.1.5" "@apollo/react-hooks": "npm:^3.1.5" + "@dnd-kit/core": "npm:^6.1.0" + "@dnd-kit/sortable": "npm:^8.0.0" + "@dnd-kit/utilities": "npm:^3.2.2" "@emotion/babel-plugin": "npm:^11.11.0" "@emotion/react": "npm:11.10.8" "@emotion/styled": "npm:11.10.6" @@ -16576,12 +15872,12 @@ __metadata: "@webiny/app-security": "npm:0.0.0" "@webiny/app-tenancy": "npm:0.0.0" "@webiny/app-theme": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/feature-flags": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/lexical-editor": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-composition": "npm:0.0.0" "@webiny/react-properties": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" @@ -16637,8 +15933,8 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/app-plugin-admin-welcome-screen@workspace:packages/app-plugin-admin-welcome-screen" dependencies: - "@webiny/build-tools": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" react: "npm:18.2.0" react-dom: "npm:18.2.0" rimraf: "npm:^6.0.1" @@ -16660,10 +15956,10 @@ __metadata: "@webiny/app-security": "npm:0.0.0" "@webiny/app-wcp": "npm:0.0.0" "@webiny/app-websockets": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" @@ -16690,9 +15986,9 @@ __metadata: "@webiny/app": "npm:0.0.0" "@webiny/app-admin": "npm:0.0.0" "@webiny/app-security": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" "@webiny/validation": "npm:0.0.0" @@ -16713,8 +16009,8 @@ __metadata: dependencies: "@emotion/babel-plugin": "npm:^11.11.0" "@webiny/app": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" minimatch: "npm:^5.1.6" react: "npm:18.2.0" react-dom: "npm:18.2.0" @@ -16751,11 +16047,11 @@ __metadata: "@webiny/app-tenant-manager": "npm:0.0.0" "@webiny/app-trash-bin": "npm:0.0.0" "@webiny/app-websockets": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/lexical-editor-actions": "npm:0.0.0" "@webiny/lexical-editor-pb-element": "npm:0.0.0" "@webiny/lexical-theme": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" apollo-cache: "npm:^1.3.5" apollo-client: "npm:^2.6.10" apollo-link: "npm:^1.2.14" @@ -16779,8 +16075,8 @@ __metadata: "@types/react": "npm:18.2.79" "@webiny/app": "npm:0.0.0" "@webiny/app-admin": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" apollo-client: "npm:^2.6.10" graphql-tag: "npm:^2.12.6" @@ -16805,8 +16101,8 @@ __metadata: "@webiny/app-admin": "npm:0.0.0" "@webiny/app-security": "npm:0.0.0" "@webiny/app-tenancy": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" "@webiny/validation": "npm:0.0.0" @@ -16840,9 +16136,9 @@ __metadata: "@webiny/app-page-builder": "npm:0.0.0" "@webiny/app-tenant-manager": "npm:0.0.0" "@webiny/app-theme": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" "@webiny/validation": "npm:0.0.0" apollo-cache: "npm:^1.3.5" @@ -16867,8 +16163,8 @@ __metadata: dependencies: "@emotion/babel-plugin": "npm:^11.11.0" "@types/react": "npm:18.2.79" - "@webiny/build-tools": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/theme": "npm:0.0.0" execa: "npm:^5.1.1" rimraf: "npm:^6.0.1" @@ -16883,13 +16179,12 @@ __metadata: resolution: "@webiny/app-trash-bin@workspace:packages/app-trash-bin" dependencies: "@emotion/styled": "npm:11.10.6" - "@jest/globals": "npm:^29.7.0" "@material-design-icons/svg": "npm:^0.14.13" "@types/react": "npm:18.2.79" "@webiny/app-aco": "npm:0.0.0" "@webiny/app-admin": "npm:0.0.0" "@webiny/app-utils": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-composition": "npm:0.0.0" "@webiny/react-properties": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" @@ -16910,7 +16205,7 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/app-utils@workspace:packages/app-utils" dependencies: - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" mobx: "npm:^6.9.0" typescript: "npm:5.3.3" @@ -16923,7 +16218,7 @@ __metadata: dependencies: "@apollo/react-hooks": "npm:^3.1.5" "@emotion/react": "npm:11.10.8" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/wcp": "npm:0.0.0" apollo-cache: "npm:^1.3.5" apollo-client: "npm:^2.6.10" @@ -16949,9 +16244,9 @@ __metadata: "@webiny/app-page-builder": "npm:0.0.0" "@webiny/app-page-builder-elements": "npm:0.0.0" "@webiny/app-theme": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/lexical-theme": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" apollo-client: "npm:^2.6.10" apollo-link: "npm:^1.2.14" @@ -16975,7 +16270,7 @@ __metadata: "@webiny/app-i18n": "npm:0.0.0" "@webiny/app-security": "npm:0.0.0" "@webiny/app-tenancy": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" react: "npm:18.2.0" react-dom: "npm:18.2.0" @@ -16993,10 +16288,10 @@ __metadata: "@types/lodash": "npm:^4.17.13" "@types/react": "npm:18.2.79" "@types/warning": "npm:^3.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/i18n": "npm:0.0.0" "@webiny/i18n-react": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-composition": "npm:0.0.0" "@webiny/react-router": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" @@ -17029,7 +16324,7 @@ __metadata: resolution: "@webiny/aws-helpers@workspace:packages/aws-helpers" dependencies: "@types/aws-lambda": "npm:8.10.145" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" cheerio: "npm:^1.0.0-rc.10" srcset: "npm:^4.0.0" languageName: unknown @@ -17069,131 +16364,89 @@ __metadata: "@aws-sdk/s3-request-presigner": "npm:3.821.0" "@aws-sdk/util-dynamodb": "npm:3.821.0" "@types/aws-lambda": "npm:8.10.145" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" languageName: unknown linkType: soft -"@webiny/build-tools@npm:0.0.0, @webiny/build-tools@workspace:packages/build-tools": - version: 0.0.0-use.local - resolution: "@webiny/build-tools@workspace:packages/build-tools" - dependencies: - "@babel/core": "npm:^7.28.3" - "@babel/preset-env": "npm:^7.28.3" - "@babel/preset-react": "npm:^7.27.1" - "@babel/preset-typescript": "npm:^7.27.1" - "@babel/runtime": "npm:7.27.4" - "@rspack/core": "npm:^1.3.13" - "@rspack/dev-server": "npm:^1.1.4" - "@rspack/plugin-react-refresh": "npm:^1.4.3" - "@svgr/webpack": "npm:^6.1.1" - "@swc/plugin-emotion": "npm:^9.0.4" - "@types/webpack-env": "npm:^1.18.5" - "@webiny/global-config": "npm:0.0.0" - "@webiny/telemetry": "npm:0.0.0" - assert-browserify: "npm:^2.0.0" - buffer: "npm:^6.0.3" - bufferutil: "npm:^4.0.1" - camelcase: "npm:^6.3.0" - case-sensitive-paths-webpack-plugin: "npm:2.4.0" - chokidar: "npm:^4.0.0" - ci-info: "npm:^4.1.0" - crypto-browserify: "npm:^3.12.0" - css-loader: "npm:^6.10.0" - eslint: "npm:^8.57.1" - eslint-webpack-plugin: "npm:^4.2.0" - fast-glob: "npm:^3.2.7" - find-up: "npm:5.0.0" - fs-extra: "npm:^11.2.0" - get-yarn-workspaces: "npm:1.0.2" - glob: "npm:^7.2.3" - import-meta-resolve: "npm:^4.1.0" - lodash: "npm:^4.17.21" - os-browserify: "npm:^0.3.0" - path-browserify: "npm:^1.0.1" - postcss-flexbugs-fixes: "npm:5.0.2" - postcss-loader: "npm:6.2.1" - postcss-normalize: "npm:10.0.1" - postcss-preset-env: "npm:9.4.0" - process: "npm:^0.11.10" - react: "npm:18.2.0" - react-dev-utils: "npm:^12.0.1" - react-dom: "npm:18.2.0" - react-refresh: "npm:^0.11.0" - read-json-sync: "npm:2.0.1" - rimraf: "npm:^6.0.1" - sass: "npm:1.44.0" - sass-loader: "npm:12.3.0" - scheduler: "npm:0.19.1" - style-loader: "npm:3.3.1" - ts-checker-rspack-plugin: "npm:^1.0.3" - ts-patch: "npm:^3.3.0" - tsx: "npm:^4.16.2" - typescript: "npm:5.9.2" - utf-8-validate: "npm:>=5.0.2" - vm-browserify: "npm:^1.1.2" - peerDependencies: - "@webiny/app": "*" - "@webiny/global-config": "*" - "@webiny/telemetry": "*" - languageName: unknown - linkType: soft - "@webiny/cli-core@npm:0.0.0, @webiny/cli-core@workspace:packages/cli-core": version: 0.0.0-use.local resolution: "@webiny/cli-core@workspace:packages/cli-core" dependencies: "@types/listr": "npm:^0.14.9" "@types/lodash": "npm:^4.17.13" - "@webiny/build-tools": "npm:0.0.0" "@webiny/di-container": "npm:0.0.0" - "@webiny/logger": "npm:0.0.0" "@webiny/project": "npm:0.0.0" - "@webiny/pulumi-sdk": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" + "@webiny/system-requirements": "npm:0.0.0" "@webiny/telemetry": "npm:0.0.0" - chalk: "npm:^4.1.2" - dotenv: "npm:^8.2.0" - execa: "npm:^5.1.1" - humanize-duration: "npm:3.32.1" jest: "npm:^29.7.0" - listr: "npm:^0.14.3" ora: "npm:4.1.1" + pino: "npm:^8.21.0" + pino-pretty: "npm:^9.4.0" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" yargs: "npm:^17.7.2" - zod: "npm:^3.23.8" + yargs-parser: "npm:^21.1.1" languageName: unknown linkType: soft -"@webiny/cli@npm:0.0.0, @webiny/cli@workspace:packages/cli": +"@webiny/cli@workspace:packages/cli": version: 0.0.0-use.local resolution: "@webiny/cli@workspace:packages/cli" dependencies: "@types/lodash": "npm:^4.17.13" - "@webiny/build-tools": "npm:0.0.0" "@webiny/cli-core": "npm:0.0.0" + "@webiny/di-container": "npm:0.0.0" + "@webiny/extensions": "npm:0.0.0" + "@webiny/project": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/system-requirements": "npm:0.0.0" + "@webiny/telemetry": "npm:0.0.0" + jest: "npm:^29.7.0" + ora: "npm:4.1.1" + pino: "npm:^8.21.0" + pino-pretty: "npm:^9.4.0" rimraf: "npm:^6.0.1" - tsx: "npm:^4.16.2" - typescript: "npm:5.3.3" + yargs: "npm:^17.7.2" + yargs-parser: "npm:^21.1.1" bin: webiny: ./bin.js languageName: unknown linkType: soft +"@webiny/cwp-template-aws@workspace:packages/cwp-template-aws": + version: 0.0.0-use.local + resolution: "@webiny/cwp-template-aws@workspace:packages/cwp-template-aws" + dependencies: + "@webiny/aws-sdk": "npm:0.0.0" + "@webiny/project": "npm:0.0.0" + chalk: "npm:^4.1.2" + ci-info: "npm:^4.1.0" + dotenv: "npm:^8.2.0" + execa: "npm:^5.1.1" + fast-glob: "npm:^3.2.7" + fs-extra: "npm:^11.2.0" + get-yarn-workspaces: "npm:1.0.2" + inquirer: "npm:8.2.6" + load-json-file: "npm:6.2.0" + lodash: "npm:^4.17.21" + open: "npm:^8.4.2" + ora: "npm:4.1.1" + write-json-file: "npm:^4.3.0" + languageName: unknown + linkType: soft + "@webiny/data-migration@npm:0.0.0, @webiny/data-migration@workspace:packages/data-migration": version: 0.0.0-use.local resolution: "@webiny/data-migration@workspace:packages/data-migration" dependencies: "@elastic/elasticsearch": "npm:7.12.0" - "@jest/globals": "npm:^29.7.0" "@types/center-align": "npm:^1.0.0" "@types/semver": "npm:^7.3.4" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" - "@webiny/cli": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" "@webiny/ioc": "npm:0.0.0" @@ -17220,7 +16473,6 @@ __metadata: "@types/is-number": "npm:^7.0.5" "@webiny/api": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" @@ -17243,7 +16495,7 @@ __metadata: resolution: "@webiny/db@workspace:packages/db" dependencies: "@webiny/api": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" rimraf: "npm:^6.0.1" type-fest: "npm:4.14.0" typescript: "npm:5.3.3" @@ -17254,8 +16506,7 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/di-container@workspace:packages/di-container" dependencies: - "@jest/globals": "npm:^29.7.0" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" reflect-metadata: "npm:^0.2.2" typescript: "npm:5.3.3" languageName: unknown @@ -17265,19 +16516,22 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/error@workspace:packages/error" dependencies: - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" languageName: unknown linkType: soft -"@webiny/extensions@workspace:packages/extensions": +"@webiny/extensions@npm:0.0.0, @webiny/extensions@workspace:packages/extensions": version: 0.0.0-use.local resolution: "@webiny/extensions@workspace:packages/extensions" dependencies: - "@webiny/build-tools": "npm:0.0.0" + "@webiny/cli-core": "npm:0.0.0" + "@webiny/project": "npm:0.0.0" "@webiny/project-aws": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-properties": "npm:0.0.0" + react: "npm:18.2.0" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" languageName: unknown @@ -17288,18 +16542,18 @@ __metadata: resolution: "@webiny/feature-flags@workspace:packages/feature-flags" dependencies: "@types/uniqid": "npm:^5.3.2" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" languageName: unknown linkType: soft -"@webiny/feature@workspace:packages/feature": +"@webiny/feature@npm:0.0.0, @webiny/feature@workspace:packages/feature": version: 0.0.0-use.local resolution: "@webiny/feature@workspace:packages/feature" dependencies: - "@webiny/build-tools": "npm:0.0.0" "@webiny/di-container": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" typescript: "npm:5.9.2" languageName: unknown linkType: soft @@ -17308,12 +16562,11 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/form@workspace:packages/form" dependencies: - "@jest/globals": "npm:^29.7.0" "@testing-library/react": "npm:^15.0.7" "@testing-library/user-event": "npm:^14.5.2" "@types/invariant": "npm:^2.2.35" "@types/lodash": "npm:^4.17.13" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-composition": "npm:0.0.0" "@webiny/validation": "npm:0.0.0" lodash: "npm:^4.17.21" @@ -17342,10 +16595,10 @@ __metadata: dependencies: "@fastify/aws-lambda": "npm:4.1.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-client": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" fastify: "npm:4.29.1" rimraf: "npm:^6.0.1" @@ -17358,9 +16611,9 @@ __metadata: resolution: "@webiny/handler-client@workspace:packages/handler-client" dependencies: "@webiny/api": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" jest: "npm:^29.7.0" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" @@ -17372,8 +16625,8 @@ __metadata: resolution: "@webiny/handler-db@workspace:packages/handler-db" dependencies: "@webiny/api": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/db": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" languageName: unknown @@ -17388,11 +16641,11 @@ __metadata: "@graphql-tools/schema": "npm:10.0.23" "@graphql-tools/utils": "npm:10.8.6" "@webiny/api": "npm:0.0.0" - "@webiny/build-tools": "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" boolean: "npm:^3.2.0" graphql: "npm:^15.9.0" graphql-scalars: "npm:1.12.0" @@ -17410,12 +16663,11 @@ __metadata: dependencies: "@fastify/compress": "npm:7.0.3" "@fastify/cookie": "npm:9.4.0" - "@jest/globals": "npm:^29.7.0" "@webiny/api": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler-client": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" fastify: "npm:4.29.1" rimraf: "npm:^6.0.1" @@ -17427,8 +16679,8 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/i18n-react@workspace:packages/i18n-react" dependencies: - "@webiny/build-tools": "npm:0.0.0" "@webiny/i18n": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" lodash: "npm:^4.17.21" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" @@ -17444,7 +16696,7 @@ __metadata: "@babel/register": "npm:7.27.1" "@types/accounting": "npm:^0.4.2" "@types/lodash": "npm:^4.17.13" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" accounting: "npm:^0.4.1" fecha: "npm:^2.3.3" glob: "npm:^7.2.3" @@ -17462,8 +16714,7 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/ioc@workspace:packages/ioc" dependencies: - "@jest/globals": "npm:^29.7.0" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" inversify: "npm:^6.1.6" reflect-metadata: "npm:^0.2.2" typescript: "npm:5.3.3" @@ -17475,12 +16726,11 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/lexical-converter@workspace:packages/lexical-converter" dependencies: - "@jest/globals": "npm:^29.7.0" "@lexical/headless": "npm:0.23.1" "@lexical/html": "npm:0.23.1" - "@types/jsdom": "npm:^21.1.7" - "@webiny/build-tools": "npm:0.0.0" + "@types/jsdom": "npm:^21.1.6" "@webiny/lexical-nodes": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" jsdom: "npm:^25.0.1" lexical: "npm:0.23.1" languageName: unknown @@ -17494,8 +16744,8 @@ __metadata: "@lexical/selection": "npm:0.23.1" "@types/react-color": "npm:^2.17.11" "@webiny/app-page-builder-elements": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/lexical-editor": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" emotion: "npm:10.0.27" react: "npm:18.2.0" @@ -17514,10 +16764,10 @@ __metadata: "@webiny/app-admin": "npm:0.0.0" "@webiny/app-page-builder": "npm:0.0.0" "@webiny/app-page-builder-elements": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/lexical-editor": "npm:0.0.0" "@webiny/lexical-nodes": "npm:0.0.0" "@webiny/lexical-theme": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-composition": "npm:0.0.0" "@webiny/theme": "npm:0.0.0" "@webiny/ui": "npm:0.0.0" @@ -17538,9 +16788,9 @@ __metadata: "@lexical/selection": "npm:0.23.1" "@lexical/text": "npm:0.23.1" "@lexical/utils": "npm:0.23.1" - "@webiny/build-tools": "npm:0.0.0" "@webiny/lexical-nodes": "npm:0.0.0" "@webiny/lexical-theme": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-composition": "npm:0.0.0" "@webiny/react-properties": "npm:0.0.0" emotion: "npm:10.0.27" @@ -17565,8 +16815,8 @@ __metadata: "@lexical/selection": "npm:0.23.1" "@lexical/utils": "npm:0.23.1" "@types/prismjs": "npm:^1.26.4" - "@webiny/build-tools": "npm:0.0.0" "@webiny/lexical-theme": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" lexical: "npm:0.23.1" react: "npm:18.2.0" languageName: unknown @@ -17577,7 +16827,7 @@ __metadata: resolution: "@webiny/lexical-theme@workspace:packages/lexical-theme" dependencies: "@emotion/react": "npm:11.10.8" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" emotion: "npm:10.0.27" lexical: "npm:0.23.1" react-style-object-to-css: "npm:^1.1.2" @@ -17588,7 +16838,7 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/logger@workspace:packages/logger" dependencies: - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" pino: "npm:^8.21.0" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" @@ -17600,12 +16850,10 @@ __metadata: resolution: "@webiny/migrations@workspace:packages/migrations" dependencies: "@elastic/elasticsearch": "npm:7.12.0" - "@jest/globals": "npm:^29.7.0" "@webiny/api-elasticsearch": "npm:0.0.0" "@webiny/api-headless-cms": "npm:0.0.0" "@webiny/api-headless-cms-ddb-es": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/data-migration": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" "@webiny/error": "npm:0.0.0" @@ -17627,9 +16875,8 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/plugins@workspace:packages/plugins" dependencies: - "@jest/globals": "npm:^29.7.0" "@types/uniqid": "npm:^5.3.2" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" uniqid: "npm:^5.4.0" @@ -17642,72 +16889,61 @@ __metadata: dependencies: "@pulumi/aws": "npm:6.67.0" "@pulumi/pulumi": "npm:3.147.0" - "@pulumi/random": "npm:^4.18.3" - "@types/lodash": "npm:^4.17.13" "@types/ncp": "npm:^2.0.8" "@webiny/api": "npm:0.0.0" "@webiny/api-aco": "npm:0.0.0" - "@webiny/api-admin-users": "npm:0.0.0" - "@webiny/api-admin-users-so-ddb": "npm:0.0.0" - "@webiny/api-audit-logs": "npm:0.0.0" - "@webiny/api-background-tasks-ddb": "npm:0.0.0" - "@webiny/api-background-tasks-es": "npm:0.0.0" - "@webiny/api-background-tasks-os": "npm:0.0.0" + "@webiny/api-apw": "npm:0.0.0" + "@webiny/api-apw-scheduler-so-ddb": "npm:0.0.0" "@webiny/api-dynamodb-to-elasticsearch": "npm:0.0.0" "@webiny/api-elasticsearch": "npm:0.0.0" "@webiny/api-file-manager": "npm:0.0.0" "@webiny/api-file-manager-ddb": "npm:0.0.0" "@webiny/api-file-manager-s3": "npm:0.0.0" "@webiny/api-headless-cms": "npm:0.0.0" - "@webiny/api-headless-cms-aco": "npm:0.0.0" "@webiny/api-headless-cms-ddb": "npm:0.0.0" "@webiny/api-headless-cms-ddb-es": "npm:0.0.0" - "@webiny/api-headless-cms-tasks": "npm:0.0.0" - "@webiny/api-headless-cms-tasks-ddb-es": "npm:0.0.0" "@webiny/api-i18n": "npm:0.0.0" + "@webiny/api-i18n-content": "npm:0.0.0" "@webiny/api-i18n-ddb": "npm:0.0.0" "@webiny/api-log": "npm:0.0.0" - "@webiny/api-record-locking": "npm:0.0.0" + "@webiny/api-page-builder": "npm:0.0.0" + "@webiny/api-page-builder-aco": "npm:0.0.0" + "@webiny/api-page-builder-import-export": "npm:0.0.0" + "@webiny/api-page-builder-import-export-so-ddb": "npm:0.0.0" + "@webiny/api-page-builder-so-ddb": "npm:0.0.0" + "@webiny/api-page-builder-so-ddb-es": "npm:0.0.0" + "@webiny/api-prerendering-service-aws": "npm:0.0.0" + "@webiny/api-prerendering-service-so-ddb": "npm:0.0.0" "@webiny/api-security": "npm:0.0.0" - "@webiny/api-security-cognito": "npm:0.0.0" "@webiny/api-security-so-ddb": "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" - "@webiny/api-wcp": "npm:0.0.0" - "@webiny/api-websockets": "npm:0.0.0" "@webiny/app-admin": "npm:0.0.0" - "@webiny/app-admin-users-cognito": "npm:0.0.0" - "@webiny/app-serverless-cms": "npm:0.0.0" - "@webiny/aws-layers": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/cli-core": "npm:0.0.0" "@webiny/data-migration": "npm:0.0.0" "@webiny/db-dynamodb": "npm:0.0.0" - "@webiny/di-container": "npm:0.0.0" + "@webiny/global-config": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" "@webiny/handler-db": "npm:0.0.0" - "@webiny/handler-graphql": "npm:0.0.0" "@webiny/migrations": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" "@webiny/project": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/pulumi": "npm:0.0.0" - "@webiny/utils": "npm:0.0.0" + "@webiny/pulumi-aws": "npm:0.0.0" "@webiny/wcp": "npm:0.0.0" - core-js: "npm:3.39.0" - cross-fetch: "npm:^3.1.5" + chalk: "npm:^4.1.2" + fast-glob: "npm:^3.2.7" find-up: "npm:^5.0.0" - form-data: "npm:^4.0.0" invariant: "npm:^2.2.4" - lodash: "npm:^4.17.21" - mime: "npm:^3.0.0" + ncp: "npm:^2.0.0" node-fetch: "npm:2.6.7" + ora: "npm:^4.1.1" react: "npm:18.2.0" - regenerator-runtime: "npm:^0.14.1" replace-in-path: "npm:^1.1.0" typescript: "npm:5.3.3" - zod: "npm:^3.23.8" + webpack: "npm:^5.97.0" languageName: unknown linkType: soft @@ -17715,23 +16951,97 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/project-utils@workspace:packages/project-utils" dependencies: + "@babel/cli": "npm:7.27.2" + "@babel/core": "npm:7.27.4" + "@babel/plugin-proposal-class-properties": "npm:^7.18.6" + "@babel/plugin-proposal-object-rest-spread": "npm:^7.20.7" + "@babel/plugin-proposal-throw-expressions": "npm:7.27.1" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/preset-env": "npm:7.27.2" + "@babel/preset-react": "npm:7.27.1" + "@babel/preset-typescript": "npm:7.27.1" + "@babel/runtime": "npm:7.27.4" "@elastic/elasticsearch": "npm:7.12.0" + "@pmmmwh/react-refresh-webpack-plugin": "npm:^0.5.15" + "@rspack/core": "npm:^1.3.13" + "@rspack/dev-server": "npm:^1.1.3" + "@rspack/plugin-react-refresh": "npm:^1.4.3" + "@svgr/webpack": "npm:^6.1.1" + "@swc/plugin-emotion": "npm:^9.0.4" + "@types/webpack-env": "npm:^1.18.5" + "@webiny/api-log": "npm:0.0.0" + "@webiny/aws-sdk": "npm:0.0.0" + "@webiny/feature-flags": "npm:0.0.0" + "@webiny/global-config": "npm:0.0.0" + "@webiny/telemetry": "npm:0.0.0" + assert-browserify: "npm:^2.0.0" + babel-loader: "npm:^9.2.1" + buffer: "npm:^6.0.3" + bufferutil: "npm:^4.0.1" + camelcase: "npm:^6.3.0" + case-sensitive-paths-webpack-plugin: "npm:2.4.0" + chalk: "npm:^4.1.2" + ci-info: "npm:^4.1.0" + crypto-browserify: "npm:^3.12.0" + css-loader: "npm:^6.10.0" + css-minimizer-webpack-plugin: "npm:^7.0.0" + eslint: "npm:^8.57.1" + eslint-config-react-app: "npm:^6.0.0" + eslint-webpack-plugin: "npm:^4.2.0" + file-loader: "npm:6.2.0" + fork-ts-checker-webpack-plugin: "npm:^9.0.2" + fs-extra: "npm:^11.2.0" get-yarn-workspaces: "npm:1.0.2" + glob: "npm:^7.2.3" + html-webpack-plugin: "npm:^5.6.3" + import-meta-resolve: "npm:^4.1.0" jest-dynalite: "npm:^3.6.1" listr2: "npm:^5.0.8" load-json-file: "npm:6.2.0" lodash: "npm:^4.17.21" + mini-css-extract-plugin: "npm:2.4.5" + null-loader: "npm:^4.0.1" + os-browserify: "npm:^0.3.0" + path-browserify: "npm:^1.0.1" pino: "npm:^8.21.0" pino-pretty: "npm:^9.4.0" + postcss-flexbugs-fixes: "npm:5.0.2" + postcss-loader: "npm:6.2.1" + postcss-normalize: "npm:10.0.1" + postcss-preset-env: "npm:9.4.0" + process: "npm:^0.11.10" + raw-loader: "npm:^4.0.2" + react: "npm:18.2.0" + react-dev-utils: "npm:^12.0.1" + react-dom: "npm:18.2.0" + react-refresh: "npm:^0.11.0" + read-json-sync: "npm:2.0.1" + resolve: "npm:^1.22.8" + resolve-url-loader: "npm:5.0.0" + rimraf: "npm:^6.0.1" + sass: "npm:1.44.0" + sass-loader: "npm:12.3.0" + scheduler: "npm:0.19.1" + source-map-loader: "npm:^1.1.3" + source-map-support: "npm:^0.5.21" + style-loader: "npm:3.3.1" + terser-webpack-plugin: "npm:^5.3.10" + ts-checker-rspack-plugin: "npm:^1.0.3" + ts-patch: "npm:^3.3.0" + typescript: "npm:5.3.3" + url: "npm:^0.11.4" + url-loader: "npm:4.1.1" + utf-8-validate: "npm:>=5.0.2" + vm-browserify: "npm:^1.1.2" + webpack: "npm:^5.97.0" + webpack-dev-server: "npm:^4.15.2" + webpack-manifest-plugin: "npm:^5.0.0" + webpackbar: "npm:^7.0.0" yargs: "npm:^17.7.2" peerDependencies: - "@webiny/api": "*" - "@webiny/api-dynamodb-to-elasticsearch": "*" - "@webiny/api-elasticsearch": "*" - "@webiny/api-log": "*" "@webiny/aws-sdk": "*" - "@webiny/handler-aws": "*" - "@webiny/tasks": "*" + "@webiny/global-config": "*" + "@webiny/telemetry": "*" languageName: unknown linkType: soft @@ -17741,42 +17051,23 @@ __metadata: dependencies: "@types/debounce": "npm:^1.2.0" "@types/humanize-duration": "npm:^3.27.0" - "@types/jsdom": "npm:^21.1.7" + "@types/jsdom": "npm:^21.1.6" "@types/lodash": "npm:^4.17.13" "@types/read-json-sync": "npm:^2.0.0" - "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/di-container": "npm:0.0.0" - "@webiny/logger": "npm:0.0.0" + "@webiny/feature": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/pulumi-sdk": "npm:0.0.0" - "@webiny/react-properties": "npm:0.0.0" "@webiny/system-requirements": "npm:0.0.0" - "@webiny/utils": "npm:0.0.0" - chalk: "npm:^4.1.2" - chokidar: "npm:^4.0.0" - ci-info: "npm:^4.1.0" debounce: "npm:^1.2.0" - execa: "npm:^5.1.1" - exit-hook: "npm:^4.0.0" - fast-glob: "npm:^3.2.7" - find-up: "npm:5.0.0" humanize-duration: "npm:^3.27.0" jest: "npm:^29.7.0" jsdom: "npm:^25.0.1" - lodash: "npm:^4.17.21" - minimatch: "npm:^5.1.6" - mqtt: "npm:^5.10.3" - nanoid: "npm:^3.3.11" neverthrow: "npm:^8.2.0" - p-retry: "npm:^4.6.2" react: "npm:18.2.0" - react-dom: "npm:18.2.0" - read-json-sync: "npm:2.0.1" rimraf: "npm:^6.0.1" serialize-error: "npm:^12.0.0" - tsx: "npm:^4.16.2" typescript: "npm:5.3.3" - zod: "npm:^3.23.8" languageName: unknown linkType: soft @@ -17784,9 +17075,36 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/pubsub@workspace:packages/pubsub" dependencies: - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" + rimraf: "npm:^6.0.1" + typescript: "npm:5.3.3" + languageName: unknown + linkType: soft + +"@webiny/pulumi-aws@npm:0.0.0, @webiny/pulumi-aws@workspace:packages/pulumi-aws": + version: 0.0.0-use.local + resolution: "@webiny/pulumi-aws@workspace:packages/pulumi-aws" + dependencies: + "@pulumi/aws": "npm:6.67.0" + "@pulumi/pulumi": "npm:3.147.0" + "@pulumi/random": "npm:4.17.0" + "@webiny/api-page-builder": "npm:0.0.0" + "@webiny/aws-layers": "npm:0.0.0" + "@webiny/aws-sdk": "npm:0.0.0" + "@webiny/feature-flags": "npm:0.0.0" + "@webiny/project": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" + "@webiny/pulumi": "npm:0.0.0" + "@webiny/utils": "npm:0.0.0" + "@webiny/wcp": "npm:0.0.0" + chalk: "npm:^4.1.2" + form-data: "npm:^4.0.0" + lodash: "npm:^4.17.21" + mime: "npm:^3.0.0" + node-fetch: "npm:2.6.7" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" + zod: "npm:^3.23.8" languageName: unknown linkType: soft @@ -17797,14 +17115,12 @@ __metadata: "@pulumi/aws": "npm:6.67.0" "@pulumi/pulumi": "npm:3.147.0" "@types/lodash": "npm:^4.17.13" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" decompress: "npm:^4.2.1" execa: "npm:^5.1.1" - find-up: "npm:5.0.0" fs-extra: "npm:^11.2.0" lodash: "npm:^4.17.21" node-fetch: "npm:^2.6.7" - read-json-sync: "npm:2.0.1" rimraf: "npm:^6.0.1" semver: "npm:^7.6.3" tar: "npm:^6.2.1" @@ -17818,8 +17134,8 @@ __metadata: dependencies: "@pulumi/pulumi": "npm:3.147.0" "@types/lodash": "npm:^4.17.13" - "@webiny/build-tools": "npm:0.0.0" "@webiny/project": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" find-up: "npm:^5.0.0" lodash: "npm:^4.17.21" rimraf: "npm:^6.0.1" @@ -17833,7 +17149,7 @@ __metadata: dependencies: "@testing-library/react": "npm:^15.0.7" "@types/react": "npm:18.2.79" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" react: "npm:18.2.0" react-dom: "npm:18.2.0" typescript: "npm:5.3.3" @@ -17846,7 +17162,7 @@ __metadata: dependencies: "@testing-library/react": "npm:^15.0.7" "@types/react": "npm:18.2.79" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-composition": "npm:0.0.0" nanoid: "npm:^3.3.8" prettier: "npm:^2.8.8" @@ -17862,9 +17178,9 @@ __metadata: "@testing-library/react": "npm:^15.0.7" "@types/react": "npm:18.2.79" "@webiny/app-theme": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/lexical-editor": "npm:0.0.0" "@webiny/lexical-theme": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-composition": "npm:0.0.0" identity-obj-proxy: "npm:^3.0.0" prettier: "npm:^2.8.8" @@ -17879,7 +17195,7 @@ __metadata: "@editorjs/editorjs": "npm:2.26.5" "@types/react": "npm:18.2.79" "@types/sanitize-html": "npm:^2.9.0" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" classnames: "npm:^2.5.1" react: "npm:18.2.0" rimraf: "npm:^6.0.1" @@ -17892,8 +17208,8 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/react-router@workspace:packages/react-router" dependencies: - "@webiny/build-tools": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/react-composition": "npm:0.0.0" apollo-client: "npm:^2.6.10" graphql: "npm:^15.9.0" @@ -17912,7 +17228,7 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/shared-aco@workspace:packages/shared-aco" dependencies: - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" typescript: "npm:5.3.3" languageName: unknown linkType: soft @@ -17941,7 +17257,6 @@ __metadata: "@webiny/api-tenancy": "npm:0.0.0" "@webiny/api-wcp": "npm:0.0.0" "@webiny/aws-sdk": "npm:0.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" "@webiny/handler-aws": "npm:0.0.0" @@ -17968,7 +17283,6 @@ __metadata: "@webiny/global-config": "npm:0.0.0" ci-info: "npm:^4.1.0" jsesc: "npm:^3.0.2" - load-json-file: "npm:6.2.0" strip-ansi: "npm:^6.0.1" wts-client: "npm:^1.0.1" languageName: unknown @@ -17981,7 +17295,7 @@ __metadata: "@emotion/babel-plugin": "npm:^11.11.0" "@emotion/react": "npm:11.10.8" "@types/react": "npm:18.2.79" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" execa: "npm:^5.1.1" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" @@ -17994,8 +17308,8 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/ui-composer@workspace:packages/ui-composer" dependencies: - "@webiny/build-tools": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" p-wait-for: "npm:^4.1.0" react: "npm:18.2.0" react-dom: "npm:18.2.0" @@ -18012,7 +17326,6 @@ __metadata: "@emotion/babel-plugin": "npm:^11.11.0" "@emotion/react": "npm:11.10.8" "@emotion/styled": "npm:11.10.6" - "@jest/globals": "npm:^29.7.0" "@material-design-icons/svg": "npm:^0.14.13" "@rmwc/button": "npm:14.3.5" "@rmwc/checkbox": "npm:14.3.5" @@ -18044,8 +17357,8 @@ __metadata: "@types/react-color": "npm:^2.17.11" "@types/react-custom-scrollbars": "npm:^4.0.10" "@types/react-transition-group": "npm:^4.4.4" - "@webiny/build-tools": "npm:0.0.0" "@webiny/form": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" "@webiny/validation": "npm:0.0.0" babel-loader: "npm:^9.2.1" @@ -18087,9 +17400,9 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/utils@workspace:packages/utils" dependencies: - "@webiny/build-tools": "npm:0.0.0" "@webiny/error": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" jsonpack: "npm:^1.1.5" mdbid: "npm:^1.0.0" nanoid: "npm:^3.3.8" @@ -18107,7 +17420,7 @@ __metadata: resolution: "@webiny/validation@workspace:packages/validation" dependencies: "@types/lodash": "npm:^4.17.13" - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" isnumeric: "npm:^0.3.3" jest: "npm:^29.7.0" lodash: "npm:^4.17.21" @@ -18120,7 +17433,7 @@ __metadata: version: 0.0.0-use.local resolution: "@webiny/wcp@workspace:packages/wcp" dependencies: - "@webiny/build-tools": "npm:0.0.0" + "@webiny/project-utils": "npm:0.0.0" node-fetch: "npm:2.6.7" rimraf: "npm:^6.0.1" typescript: "npm:5.3.3" @@ -18155,6 +17468,20 @@ __metadata: languageName: node linkType: hard +"@xtuc/ieee754@npm:^1.2.0": + version: 1.2.0 + resolution: "@xtuc/ieee754@npm:1.2.0" + checksum: 10/ab033b032927d77e2f9fa67accdf31b1ca7440974c21c9cfabc8349e10ca2817646171c4f23be98d0e31896d6c2c3462a074fe37752e523abc3e45c79254259c + languageName: node + linkType: hard + +"@xtuc/long@npm:4.2.2": + version: 4.2.2 + resolution: "@xtuc/long@npm:4.2.2" + checksum: 10/7217bae9fe240e0d804969e7b2af11cb04ec608837c78b56ca88831991b287e232a0b7fce8d548beaff42aaf0197ffa471d81be6ac4c4e53b0148025a2c076ec + languageName: node + linkType: hard + "@yarnpkg/lockfile@npm:^1.1.0": version: 1.1.0 resolution: "@yarnpkg/lockfile@npm:1.1.0" @@ -18202,6 +17529,13 @@ __metadata: languageName: node linkType: hard +"abab@npm:^2.0.5": + version: 2.0.6 + resolution: "abab@npm:2.0.6" + checksum: 10/ebe95d7278999e605823fc515a3b05d689bc72e7f825536e73c95ebf621636874c6de1b749b3c4bf866b96ccd4b3a2802efa313d0e45ad51a413c8c73247db20 + languageName: node + linkType: hard + "abbrev@npm:^1.0.0": version: 1.1.1 resolution: "abbrev@npm:1.1.1" @@ -18307,7 +17641,16 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.4.1": +"acorn@npm:^8.14.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" + bin: + acorn: bin/acorn + checksum: 10/6df29c35556782ca9e632db461a7f97947772c6c1d5438a81f0c873a3da3a792487e83e404d1c6c25f70513e91aa18745f6eafb1fcc3a43ecd1920b21dd173d2 + languageName: node + linkType: hard + +"acorn@npm:^8.4.1, acorn@npm:^8.5.0": version: 8.8.2 resolution: "acorn@npm:8.8.2" bin: @@ -18371,6 +17714,16 @@ __metadata: languageName: node linkType: hard +"adjust-sourcemap-loader@npm:^4.0.0": + version: 4.0.0 + resolution: "adjust-sourcemap-loader@npm:4.0.0" + dependencies: + loader-utils: "npm:^2.0.0" + regex-parser: "npm:^2.2.11" + checksum: 10/813004ae62b3b409208ae6994b2b95cdc833b52655706f487c5334221218add29f1b7c597a15128c7cbc2784c15d8a1bcb8e7f9a8ea0d1f156973998ea695c82 + languageName: node + linkType: hard + "adm-zip@npm:^0.5.14": version: 0.5.16 resolution: "adm-zip@npm:0.5.16" @@ -18577,7 +17930,7 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^4.1.0, ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.1, ansi-escapes@npm:^4.3.2": +"ansi-escapes@npm:^4.1.0, ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.1": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -18604,6 +17957,15 @@ __metadata: languageName: node linkType: hard +"ansi-html@npm:^0.0.9": + version: 0.0.9 + resolution: "ansi-html@npm:0.0.9" + bin: + ansi-html: bin/ansi-html + checksum: 10/3e83fae364d323d9c453f74a21aa29da68ae152e996c66de45a49a445ea362c4e2e9abce0069558239ff23e3d6ae73b5d27993d631382aa83d85f44b687e0aa1 + languageName: node + linkType: hard + "ansi-regex@npm:^2.0.0": version: 2.1.1 resolution: "ansi-regex@npm:2.1.1" @@ -18657,7 +18019,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^5.0.0, ansi-styles@npm:^5.2.0": +"ansi-styles@npm:^5.0.0": version: 5.2.0 resolution: "ansi-styles@npm:5.2.0" checksum: 10/d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 @@ -18671,6 +18033,13 @@ __metadata: languageName: node linkType: hard +"ansis@npm:^3.2.0": + version: 3.3.2 + resolution: "ansis@npm:3.3.2" + checksum: 10/e6c7b93a4f7b1e22c2d11ba53736af7f56c2952f6497ea109757573738fa0e7317066377577d9896a3e1db7ce2bd622ab2eabc7f6cdab6c0e0f9b25eebb5d2af + languageName: node + linkType: hard + "any-observable@npm:^0.3.0": version: 0.3.0 resolution: "any-observable@npm:0.3.0" @@ -18678,7 +18047,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.0.3, anymatch@npm:^3.1.3, anymatch@npm:~3.1.2": +"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -19240,6 +18609,13 @@ __metadata: languageName: node linkType: hard +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: 10/a0789dd882211b87116e81e2648ccb7f60340b34f19877dd020b39ebb4714e475eb943e14ba3e22201c221ef6645b7bfe10297e76b6ac95b48a9898c1211ce66 + languageName: node + linkType: hard + "ast-types@npm:^0.13.4": version: 0.13.4 resolution: "ast-types@npm:0.13.4" @@ -19427,7 +18803,7 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:29.7.0, babel-jest@npm:^29.7.0": +"babel-jest@npm:^29.7.0": version: 29.7.0 resolution: "babel-jest@npm:29.7.0" dependencies: @@ -19444,23 +18820,6 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:30.0.0": - version: 30.0.0 - resolution: "babel-jest@npm:30.0.0" - dependencies: - "@jest/transform": "npm:30.0.0" - "@types/babel__core": "npm:^7.20.5" - babel-plugin-istanbul: "npm:^7.0.0" - babel-preset-jest: "npm:30.0.0" - chalk: "npm:^4.1.2" - graceful-fs: "npm:^4.2.11" - slash: "npm:^3.0.0" - peerDependencies: - "@babel/core": ^7.11.0 - checksum: 10/c5a747d0d39d81fed226b3ff0c1a9d5a2d97e5f3f7d18739e635203174bbfe653acb8e0b405de5c18a07a166062609bb8bd3d6c6571a0ea0fe5748bb84a74f2a - languageName: node - linkType: hard - "babel-loader@npm:^9.2.1": version: 9.2.1 resolution: "babel-loader@npm:9.2.1" @@ -19514,30 +18873,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-istanbul@npm:^7.0.0": - version: 7.0.0 - resolution: "babel-plugin-istanbul@npm:7.0.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.0.0" - "@istanbuljs/load-nyc-config": "npm:^1.0.0" - "@istanbuljs/schema": "npm:^0.1.3" - istanbul-lib-instrument: "npm:^6.0.2" - test-exclude: "npm:^6.0.0" - checksum: 10/4df567f29161c7f50737ed1884c7f08203f4d0cb1684c499fca374fcf5059396eacb02f8f727bf7a82bbf3e50b9f4a24bcb026a1678f63940d8f0f78546e3774 - languageName: node - linkType: hard - -"babel-plugin-jest-hoist@npm:30.0.0": - version: 30.0.0 - resolution: "babel-plugin-jest-hoist@npm:30.0.0" - dependencies: - "@babel/template": "npm:^7.27.2" - "@babel/types": "npm:^7.27.3" - "@types/babel__core": "npm:^7.20.5" - checksum: 10/96a0176c714bf706322269209960df61521b2276b536492a166e2ecf616c4555cca557b0859c2b5cf0b24b1cebefbf24a82ffc8f3098f790d2b47ccbd1d712e9 - languageName: node - linkType: hard - "babel-plugin-jest-hoist@npm:^29.6.3": version: 29.6.3 resolution: "babel-plugin-jest-hoist@npm:29.6.3" @@ -19607,19 +18942,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.14": - version: 0.4.14 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.14" - dependencies: - "@babel/compat-data": "npm:^7.27.7" - "@babel/helper-define-polyfill-provider": "npm:^0.6.5" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/8ec00a1b821ccbfcc432630da66e98bc417f5301f4ce665269d50d245a18ad3ce8a8af2a007f28e3defcd555bb8ce65f16b0d4b6d131bd788e2b97d8b8953332 - languageName: node - linkType: hard - "babel-plugin-polyfill-corejs3@npm:^0.10.6": version: 0.10.6 resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6" @@ -19644,18 +18966,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.13.0": - version: 0.13.0 - resolution: "babel-plugin-polyfill-corejs3@npm:0.13.0" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.5" - core-js-compat: "npm:^3.43.0" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/aa36f9a09521404dd0569a4cbd5f88aa4b9abff59508749abde5d09d66c746012fb94ed1e6e2c8be3710939a2a4c6293ee3be889125d7611c93e5897d9e5babd - languageName: node - linkType: hard - "babel-plugin-polyfill-regenerator@npm:^0.6.1": version: 0.6.1 resolution: "babel-plugin-polyfill-regenerator@npm:0.6.1" @@ -19667,17 +18977,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.6.5": - version: 0.6.5 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.5" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.5" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/ed1932fa9a31e0752fd10ebf48ab9513a654987cab1182890839523cb898559d24ae0578fdc475d9f995390420e64eeaa4b0427045b56949dace3c725bc66dbb - languageName: node - linkType: hard - "babel-plugin-syntax-jsx@npm:^6.18.0": version: 6.18.0 resolution: "babel-plugin-syntax-jsx@npm:6.18.0" @@ -19707,43 +19006,6 @@ __metadata: languageName: node linkType: hard -"babel-preset-current-node-syntax@npm:^1.1.0": - version: 1.1.0 - resolution: "babel-preset-current-node-syntax@npm:1.1.0" - dependencies: - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - "@babel/plugin-syntax-bigint": "npm:^7.8.3" - "@babel/plugin-syntax-class-properties": "npm:^7.12.13" - "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" - "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" - "@babel/plugin-syntax-import-meta": "npm:^7.10.4" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" - "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/46331111ae72b7121172fd9e6a4a7830f651ad44bf26dbbf77b3c8a60a18009411a3eacb5e72274004290c110371230272109957d5224d155436b4794ead2f1b - languageName: node - linkType: hard - -"babel-preset-jest@npm:30.0.0": - version: 30.0.0 - resolution: "babel-preset-jest@npm:30.0.0" - dependencies: - babel-plugin-jest-hoist: "npm:30.0.0" - babel-preset-current-node-syntax: "npm:^1.1.0" - peerDependencies: - "@babel/core": ^7.11.0 - checksum: 10/6f1c477c8ac82b545e3e7975e03ba3f137d5f8f2ce9f3bde1078865f96de1365712bde1042302df1bfb539fa06220686acb7688336e7b8f3ded3919d698bb02f - languageName: node - linkType: hard - "babel-preset-jest@npm:^29.6.3": version: 29.6.3 resolution: "babel-preset-jest@npm:29.6.3" @@ -19924,18 +19186,6 @@ __metadata: languageName: node linkType: hard -"bl@npm:^6.0.8": - version: 6.1.2 - resolution: "bl@npm:6.1.2" - dependencies: - "@types/readable-stream": "npm:^4.0.0" - buffer: "npm:^6.0.3" - inherits: "npm:^2.0.4" - readable-stream: "npm:^4.2.0" - checksum: 10/5cb67f32d5162555f1548c03917c8dd8508fa3b1f26f7c20fdba9fb5fd5c8b83c32d71ab9a1613ed7a0c13b4d4dec95e032aeb264c8eddc090ad599fa9a4ee39 - languageName: node - linkType: hard - "blessed@npm:0.1.81": version: 0.1.81 resolution: "blessed@npm:0.1.81" @@ -20000,7 +19250,7 @@ __metadata: languageName: node linkType: hard -"bonjour-service@npm:^1.2.1": +"bonjour-service@npm:^1.0.11, bonjour-service@npm:^1.2.1": version: 1.3.0 resolution: "bonjour-service@npm:1.3.0" dependencies: @@ -20073,18 +19323,6 @@ __metadata: languageName: node linkType: hard -"broker-factory@npm:^3.1.9": - version: 3.1.9 - resolution: "broker-factory@npm:3.1.9" - dependencies: - "@babel/runtime": "npm:^7.28.3" - fast-unique-numbers: "npm:^9.0.23" - tslib: "npm:^2.8.1" - worker-factory: "npm:^7.0.45" - checksum: 10/1dc0f688856b86fccdc0d0d875c948f63dc4aea021e3099e8ee99ed75ca405a28e0959095f82209eb12f1d8d3e31381eabf96ff509022fbac4c4b099522aa2fc - languageName: node - linkType: hard - "brorand@npm:^1.0.1, brorand@npm:^1.1.0": version: 1.1.0 resolution: "brorand@npm:1.1.0" @@ -20166,7 +19404,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.18.1, browserslist@npm:^4.21.3": +"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.21.3": version: 4.21.5 resolution: "browserslist@npm:4.21.5" dependencies: @@ -20208,7 +19446,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.24.0, browserslist@npm:^4.24.2": +"browserslist@npm:^4.23.3, browserslist@npm:^4.24.0, browserslist@npm:^4.24.2": version: 4.24.2 resolution: "browserslist@npm:4.24.2" dependencies: @@ -20236,29 +19474,6 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.25.3": - version: 4.25.4 - resolution: "browserslist@npm:4.25.4" - dependencies: - caniuse-lite: "npm:^1.0.30001737" - electron-to-chromium: "npm:^1.5.211" - node-releases: "npm:^2.0.19" - update-browserslist-db: "npm:^1.1.3" - bin: - browserslist: cli.js - checksum: 10/6ee84526263204f66b4a19967d93f82f2a662c0cd951386e3859e29c6a4c10c32f2acf41940251f44a5daede56dbec91348d6153a1afab1fc052ecdb01d4adbc - languageName: node - linkType: hard - -"bs-logger@npm:^0.2.6": - version: 0.2.6 - resolution: "bs-logger@npm:0.2.6" - dependencies: - fast-json-stable-stringify: "npm:2.x" - checksum: 10/e6d3ff82698bb3f20ce64fb85355c5716a3cf267f3977abe93bf9c32a2e46186b253f48a028ae5b96ab42bacd2c826766d9ae8cf6892f9b944656be9113cf212 - languageName: node - linkType: hard - "bser@npm:2.1.1": version: 2.1.1 resolution: "bser@npm:2.1.1" @@ -20433,6 +19648,13 @@ __metadata: languageName: node linkType: hard +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 10/002769a0fbfc51c062acd2a59df465a2a947916b02ac50b56c69ec6c018ee99ac3e7f4dd7366334ea847f1ecacf4defaa61bcd2ac283db50156ce1f1d8c8ad42 + languageName: node + linkType: hard + "cacache@npm:^16.1.0": version: 16.1.3 resolution: "cacache@npm:16.1.3" @@ -20601,13 +19823,23 @@ __metadata: languageName: node linkType: hard -"callsites@npm:^3.0.0, callsites@npm:^3.1.0": +"callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" checksum: 10/072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 languageName: node linkType: hard +"camel-case@npm:^4.1.2": + version: 4.1.2 + resolution: "camel-case@npm:4.1.2" + dependencies: + pascal-case: "npm:^3.1.2" + tslib: "npm:^2.0.3" + checksum: 10/bcbd25cd253b3cbc69be3f535750137dbf2beb70f093bdc575f73f800acc8443d34fd52ab8f0a2413c34f1e8203139ffc88428d8863e4dfe530cfb257a379ad6 + languageName: node + linkType: hard + "camelcase-keys@npm:^6.2.2": version: 6.2.2 resolution: "camelcase-keys@npm:6.2.2" @@ -20633,17 +19865,22 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001449, caniuse-lite@npm:^1.0.30001503, caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001599, caniuse-lite@npm:^1.0.30001669, caniuse-lite@npm:^1.0.30001718": - version: 1.0.30001720 - resolution: "caniuse-lite@npm:1.0.30001720" - checksum: 10/6557c5052fa17fd531f3e1a8013b5924fb69afcd53d9f3e3b9adc9e31c5a7e436b674c000c53659e097fe1fda1c290d1bd17c7f3f98d13749644386ed722ab5f +"caniuse-api@npm:^3.0.0": + version: 3.0.0 + resolution: "caniuse-api@npm:3.0.0" + dependencies: + browserslist: "npm:^4.0.0" + caniuse-lite: "npm:^1.0.0" + lodash.memoize: "npm:^4.1.2" + lodash.uniq: "npm:^4.5.0" + checksum: 10/db2a229383b20d0529b6b589dde99d7b6cb56ba371366f58cbbfa2929c9f42c01f873e2b6ef641d4eda9f0b4118de77dbb2805814670bdad4234bf08e720b0b4 languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001737": - version: 1.0.30001741 - resolution: "caniuse-lite@npm:1.0.30001741" - checksum: 10/d2fbc09f0941653d40b591e5460c4eb0b6838790d4adac7890a453dfb3b5e6bb84a64de2aded96cb4c6636816ef613614e07d9efb5818adaba566321feb95ffd +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001449, caniuse-lite@npm:^1.0.30001503, caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001599, caniuse-lite@npm:^1.0.30001669, caniuse-lite@npm:^1.0.30001718": + version: 1.0.30001720 + resolution: "caniuse-lite@npm:1.0.30001720" + checksum: 10/6557c5052fa17fd531f3e1a8013b5924fb69afcd53d9f3e3b9adc9e31c5a7e436b674c000c53659e097fe1fda1c290d1bd17c7f3f98d13749644386ed722ab5f languageName: node linkType: hard @@ -20678,6 +19915,19 @@ __metadata: languageName: node linkType: hard +"chai@npm:^5.2.0": + version: 5.3.3 + resolution: "chai@npm:5.3.3" + dependencies: + assertion-error: "npm:^2.0.1" + check-error: "npm:^2.1.1" + deep-eql: "npm:^5.0.1" + loupe: "npm:^3.1.0" + pathval: "npm:^2.0.0" + checksum: 10/0d0ef63106083b05c7ba510697cd9991a02b8df5984a7d010ab4af10205c7a1f27d1c06bfa4679540894295ac4dcc22aa2a281e2e4cfe5133c1db379626689a2 + languageName: node + linkType: hard + "chalk@npm:3.0.0, chalk@npm:^3.0.0, chalk@npm:~3.0.0": version: 3.0.0 resolution: "chalk@npm:3.0.0" @@ -20760,13 +20010,6 @@ __metadata: languageName: node linkType: hard -"chardet@npm:^2.1.0": - version: 2.1.0 - resolution: "chardet@npm:2.1.0" - checksum: 10/8085fd8e5b1234fafacb279b4dab84dc127f512f953441daf09fc71ade70106af0dff28e86bfda00bab0de61fb475fa9003c87f82cbad3da02a4f299bfd427da - languageName: node - linkType: hard - "charenc@npm:0.0.2": version: 0.0.2 resolution: "charenc@npm:0.0.2" @@ -20781,6 +20024,13 @@ __metadata: languageName: node linkType: hard +"check-error@npm:^2.1.1": + version: 2.1.1 + resolution: "check-error@npm:2.1.1" + checksum: 10/d785ed17b1d4a4796b6e75c765a9a290098cf52ff9728ce0756e8ffd4293d2e419dd30c67200aee34202463b474306913f2fcfaf1890641026d9fc6966fea27a + languageName: node + linkType: hard + "check-more-types@npm:^2.24.0": version: 2.24.0 resolution: "check-more-types@npm:2.24.0" @@ -20855,15 +20105,6 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^4.0.0": - version: 4.0.3 - resolution: "chokidar@npm:4.0.3" - dependencies: - readdirp: "npm:^4.0.1" - checksum: 10/bf2a575ea5596000e88f5db95461a9d59ad2047e939d5a4aac59dd472d126be8f1c1ff3c7654b477cf532d18f42a97279ef80ee847972fd2a25410bf00b80b59 - languageName: node - linkType: hard - "chownr@npm:^1.1.1": version: 1.1.4 resolution: "chownr@npm:1.1.4" @@ -20878,6 +20119,13 @@ __metadata: languageName: node linkType: hard +"chrome-trace-event@npm:^1.0.2": + version: 1.0.3 + resolution: "chrome-trace-event@npm:1.0.3" + checksum: 10/b5fbdae5bf00c96fa3213de919f2b2617a942bfcb891cdf735fbad2a6f4f3c25d42e3f2b1703328619d352c718b46b9e18999fd3af7ef86c26c91db6fae1f0da + languageName: node + linkType: hard + "chromium-bidi@npm:0.11.0": version: 0.11.0 resolution: "chromium-bidi@npm:0.11.0" @@ -20911,13 +20159,6 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^4.2.0": - version: 4.2.0 - resolution: "ci-info@npm:4.2.0" - checksum: 10/928d8457f3476ffc4a66dec93b9cdf1944d5e60dba69fbd6a0fc95b652386f6ef64857f6e32372533210ef6d8954634af2c7693d7c07778ee015f3629a5e0dd9 - languageName: node - linkType: hard - "cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": version: 1.0.4 resolution: "cipher-base@npm:1.0.4" @@ -20942,13 +20183,6 @@ __metadata: languageName: node linkType: hard -"cjs-module-lexer@npm:^2.1.0": - version: 2.1.0 - resolution: "cjs-module-lexer@npm:2.1.0" - checksum: 10/97cf8e7ddbf685ce0fe1a89349f42a015e89ddf02f1f0d764ddb8a07bd642d58a036c21b5cae078cdf6a96b332b95f806948d772adcd2c346ce5a897f5feefb7 - languageName: node - linkType: hard - "classlist-polyfill@npm:^1.0.3": version: 1.2.0 resolution: "classlist-polyfill@npm:1.2.0" @@ -20963,6 +20197,15 @@ __metadata: languageName: node linkType: hard +"clean-css@npm:^5.2.2": + version: 5.3.2 + resolution: "clean-css@npm:5.3.2" + dependencies: + source-map: "npm:~0.6.0" + checksum: 10/efd9efbf400f38a12f99324bad5359bdd153211b048721e4d4ddb629a88865dff3012dca547a14bdd783d78ccf064746e39fd91835546a08e2d811866aff0857 + languageName: node + linkType: hard + "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -21106,13 +20349,6 @@ __metadata: languageName: node linkType: hard -"cli-width@npm:^4.1.0": - version: 4.1.0 - resolution: "cli-width@npm:4.1.0" - checksum: 10/b58876fbf0310a8a35c79b72ecfcf579b354e18ad04e6b20588724ea2b522799a758507a37dfe132fafaf93a9922cafd9514d9e1598e6b2cd46694853aed099f - languageName: node - linkType: hard - "cli@npm:~1.0.0": version: 1.0.1 resolution: "cli@npm:1.0.1" @@ -21264,13 +20500,6 @@ __metadata: languageName: node linkType: hard -"collect-v8-coverage@npm:^1.0.2": - version: 1.0.2 - resolution: "collect-v8-coverage@npm:1.0.2" - checksum: 10/30ea7d5c9ee51f2fdba4901d4186c5b7114a088ef98fd53eda3979da77eed96758a2cae81cc6d97e239aaea6065868cf908b24980663f7b7e96aa291b3e12fa4 - languageName: node - linkType: hard - "color-convert@npm:^1.9.0": version: 1.9.3 resolution: "color-convert@npm:1.9.3" @@ -21332,6 +20561,13 @@ __metadata: languageName: node linkType: hard +"colord@npm:^2.9.3": + version: 2.9.3 + resolution: "colord@npm:2.9.3" + checksum: 10/907a4506d7307e2f580b471b581e992181ed75ab0c6925ece9ca46d88161d2fc50ed15891cd0556d0d9321237ca75afc9d462e4c050b939ef88428517f047f30 + languageName: node + linkType: hard + "colorette@npm:2.0.20, colorette@npm:^2.0.20": version: 2.0.20 resolution: "colorette@npm:2.0.20" @@ -21372,7 +20608,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^2.8.1": +"commander@npm:^2.20.0, commander@npm:^2.8.1": version: 2.20.3 resolution: "commander@npm:2.20.3" checksum: 10/90c5b6898610cd075984c58c4f88418a4fb44af08c1b1415e9854c03171bec31b336b7f3e4cefe33de994b3f12b03c5e2d638da4316df83593b9e82554e7e95b @@ -21393,6 +20629,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^8.3.0": + version: 8.3.0 + resolution: "commander@npm:8.3.0" + checksum: 10/6b7b5d334483ce24bd73c5dac2eab901a7dbb25fd983ea24a1eeac6e7166bb1967f641546e8abf1920afbde86a45fbfe5812fbc69d0dc451bb45ca416a12a3a3 + languageName: node + linkType: hard + "commander@npm:~12.1.0": version: 12.1.0 resolution: "commander@npm:12.1.0" @@ -21400,13 +20643,6 @@ __metadata: languageName: node linkType: hard -"commist@npm:^3.2.0": - version: 3.2.0 - resolution: "commist@npm:3.2.0" - checksum: 10/cd214ad381a39a5d122397c5d6e506da943573ea9acd8f8cb14590d10700086bed5e1a79f54f2b78944413166e12316865dc4597e3c4fd9342a1f42f6363caee - languageName: node - linkType: hard - "common-ancestor-path@npm:^1.0.1": version: 1.0.1 resolution: "common-ancestor-path@npm:1.0.1" @@ -21556,6 +20792,13 @@ __metadata: languageName: node linkType: hard +"confusing-browser-globals@npm:^1.0.10": + version: 1.0.11 + resolution: "confusing-browser-globals@npm:1.0.11" + checksum: 10/3afc635abd37e566477f610e7978b15753f0e84025c25d49236f1f14d480117185516bdd40d2a2167e6bed8048641a9854964b9c067e3dcdfa6b5d0ad3c3a5ef + languageName: node + linkType: hard + "connect-history-api-fallback@npm:^2.0.0": version: 2.0.0 resolution: "connect-history-api-fallback@npm:2.0.0" @@ -21563,6 +20806,13 @@ __metadata: languageName: node linkType: hard +"consola@npm:^3.2.3": + version: 3.2.3 + resolution: "consola@npm:3.2.3" + checksum: 10/02972dcb048c337357a3628438e5976b8e45bcec22fdcfbe9cd17622992953c4d695d5152f141464a02deac769b1d23028e8ac87f56483838df7a6bbf8e0f5a2 + languageName: node + linkType: hard + "console-browserify@npm:1.1.x": version: 1.1.0 resolution: "console-browserify@npm:1.1.0" @@ -21725,7 +20975,7 @@ __metadata: languageName: node linkType: hard -"convert-source-map@npm:^1.5.0, convert-source-map@npm:^1.6.0": +"convert-source-map@npm:^1.5.0, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": version: 1.9.0 resolution: "convert-source-map@npm:1.9.0" checksum: 10/dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 @@ -21785,16 +21035,7 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.43.0": - version: 3.45.1 - resolution: "core-js-compat@npm:3.45.1" - dependencies: - browserslist: "npm:^4.25.3" - checksum: 10/a6eb757ccf5091ee4cf7756c4f2ddefb506b049d89526e8150221e6d9150dc2685c34cbed42f4b15a27a92dd300fd56f75c9502cd57cfe928c1bd7a8ed961a42 - languageName: node - linkType: hard - -"core-js-pure@npm:^3.10.2": +"core-js-pure@npm:^3.10.2, core-js-pure@npm:^3.23.3": version: 3.27.2 resolution: "core-js-pure@npm:3.27.2" checksum: 10/f9ca946385b3ba6c40ef0dc6ece16ab5e7909b327c926aa1b709ab3e8a8cb69115a1572fbe17fd4e9db845a8177e10ccefdbaee193eeb26ae35d975f95e4c5b1 @@ -21815,13 +21056,6 @@ __metadata: languageName: node linkType: hard -"core-js@npm:3.39.0, core-js@npm:^3.15.1, core-js@npm:^3.6.1, core-js@npm:^3.6.5": - version: 3.39.0 - resolution: "core-js@npm:3.39.0" - checksum: 10/a3d34e669783dfc878e545f1983f60d9ff48a3867cd1d7ff8839b849e053002a208c7c14a5ca354b8e0b54982901e2f83dc87c3d9b95de0a94b4071d1c74e5f6 - languageName: node - linkType: hard - "core-js@npm:^2.6.5": version: 2.6.12 resolution: "core-js@npm:2.6.12" @@ -21829,6 +21063,13 @@ __metadata: languageName: node linkType: hard +"core-js@npm:^3.15.1, core-js@npm:^3.6.1, core-js@npm:^3.6.5": + version: 3.39.0 + resolution: "core-js@npm:3.39.0" + checksum: 10/a3d34e669783dfc878e545f1983f60d9ff48a3867cd1d7ff8839b849e053002a208c7c14a5ca354b8e0b54982901e2f83dc87c3d9b95de0a94b4071d1c74e5f6 + languageName: node + linkType: hard + "core-util-is@npm:1.0.2": version: 1.0.2 resolution: "core-util-is@npm:1.0.2" @@ -22009,24 +21250,22 @@ __metadata: version: 0.0.0-use.local resolution: "create-webiny-project@workspace:packages/create-webiny-project" dependencies: - "@types/js-yaml": "npm:^4.0.5" - "@types/validate-npm-package-name": "npm:^3.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/system-requirements": "npm:0.0.0" "@webiny/telemetry": "npm:0.0.0" chalk: "npm:^4.1.2" execa: "npm:^5.1.1" find-up: "npm:5.0.0" fs-extra: "npm:^11.2.0" - inquirer: "npm:^12.9.4" - js-yaml: "npm:^4.1.0" + js-yaml: "npm:3.14.1" listr: "npm:0.14.3" load-json-file: "npm:6.2.0" - ora: "npm:4.1.1" + node-fetch: "npm:2.6.7" os: "npm:0.1.1" + p-retry: "npm:^4.6.2" rimraf: "npm:^6.0.1" + semver: "npm:^7.6.3" uuid: "npm:^9.0.1" - validate-npm-package-name: "npm:^6.0.2" + validate-npm-package-name: "npm:3.0.0" write-json-file: "npm:^4.3.0" yargs: "npm:^17.7.2" yesno: "npm:^0.4.0" @@ -22070,15 +21309,6 @@ __metadata: languageName: node linkType: hard -"cross-fetch@npm:^3.1.5": - version: 3.2.0 - resolution: "cross-fetch@npm:3.2.0" - dependencies: - node-fetch: "npm:^2.7.0" - checksum: 10/e4ab1d390a5b6ca8bb0605f028af2ffc1127d2e407b954654949f506d04873c4863ece264662c074865d7874060e35f938cec74fe7b5736d46d545e2685f6aec - languageName: node - linkType: hard - "cross-inspect@npm:1.0.1": version: 1.0.1 resolution: "cross-inspect@npm:1.0.1" @@ -22163,6 +21393,15 @@ __metadata: languageName: node linkType: hard +"css-declaration-sorter@npm:^7.2.0": + version: 7.2.0 + resolution: "css-declaration-sorter@npm:7.2.0" + peerDependencies: + postcss: ^8.0.9 + checksum: 10/2acb9c13f556fc8f05e601e66ecae4cfdec0ed50ca69f18177718ad5a86c3929f7d0a2cae433fd831b2594670c6e61d3a25c79aa7830be5828dcd9d29219d387 + languageName: node + linkType: hard + "css-has-pseudo@npm:^6.0.2": version: 6.0.2 resolution: "css-has-pseudo@npm:6.0.2" @@ -22200,6 +21439,35 @@ __metadata: languageName: node linkType: hard +"css-minimizer-webpack-plugin@npm:^7.0.0": + version: 7.0.0 + resolution: "css-minimizer-webpack-plugin@npm:7.0.0" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.25" + cssnano: "npm:^7.0.1" + jest-worker: "npm:^29.7.0" + postcss: "npm:^8.4.38" + schema-utils: "npm:^4.2.0" + serialize-javascript: "npm:^6.0.2" + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + "@parcel/css": + optional: true + "@swc/css": + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true + checksum: 10/47d8f8a38c97496759f1676b5344231d48bfb205cc272e163a113d4cd40daddd17f8eb719d1f1071cf3ec4d62fd83537801cba598d7c653657aa97f1461e4a8b + languageName: node + linkType: hard + "css-prefers-color-scheme@npm:^9.0.1": version: 9.0.1 resolution: "css-prefers-color-scheme@npm:9.0.1" @@ -22245,6 +21513,26 @@ __metadata: languageName: node linkType: hard +"css-tree@npm:^2.3.1": + version: 2.3.1 + resolution: "css-tree@npm:2.3.1" + dependencies: + mdn-data: "npm:2.0.30" + source-map-js: "npm:^1.0.1" + checksum: 10/e5e39b82eb4767c664fa5c2cd9968c8c7e6b7fd2c0079b52680a28466d851e2826d5e64699c449d933c0e8ca0554beca43c41a9fcb09fb6a46139d462dbdf0df + languageName: node + linkType: hard + +"css-tree@npm:~2.2.0": + version: 2.2.1 + resolution: "css-tree@npm:2.2.1" + dependencies: + mdn-data: "npm:2.0.28" + source-map-js: "npm:^1.0.1" + checksum: 10/1959c4b0e268bf8db1b3a1776a5ba9ae3a464ccd1226bfa62799cb0a3d0039006e21fb95cec4dec9d687a9a9b90f692dff2d230b631527ece700f4bfb419aaf3 + languageName: node + linkType: hard + "css-what@npm:^6.0.1, css-what@npm:^6.1.0": version: 6.1.0 resolution: "css-what@npm:6.1.0" @@ -22268,6 +21556,67 @@ __metadata: languageName: node linkType: hard +"cssnano-preset-default@npm:^7.0.6": + version: 7.0.6 + resolution: "cssnano-preset-default@npm:7.0.6" + dependencies: + browserslist: "npm:^4.23.3" + css-declaration-sorter: "npm:^7.2.0" + cssnano-utils: "npm:^5.0.0" + postcss-calc: "npm:^10.0.2" + postcss-colormin: "npm:^7.0.2" + postcss-convert-values: "npm:^7.0.4" + postcss-discard-comments: "npm:^7.0.3" + postcss-discard-duplicates: "npm:^7.0.1" + postcss-discard-empty: "npm:^7.0.0" + postcss-discard-overridden: "npm:^7.0.0" + postcss-merge-longhand: "npm:^7.0.4" + postcss-merge-rules: "npm:^7.0.4" + postcss-minify-font-values: "npm:^7.0.0" + postcss-minify-gradients: "npm:^7.0.0" + postcss-minify-params: "npm:^7.0.2" + postcss-minify-selectors: "npm:^7.0.4" + postcss-normalize-charset: "npm:^7.0.0" + postcss-normalize-display-values: "npm:^7.0.0" + postcss-normalize-positions: "npm:^7.0.0" + postcss-normalize-repeat-style: "npm:^7.0.0" + postcss-normalize-string: "npm:^7.0.0" + postcss-normalize-timing-functions: "npm:^7.0.0" + postcss-normalize-unicode: "npm:^7.0.2" + postcss-normalize-url: "npm:^7.0.0" + postcss-normalize-whitespace: "npm:^7.0.0" + postcss-ordered-values: "npm:^7.0.1" + postcss-reduce-initial: "npm:^7.0.2" + postcss-reduce-transforms: "npm:^7.0.0" + postcss-svgo: "npm:^7.0.1" + postcss-unique-selectors: "npm:^7.0.3" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/686e7652d01ad4337dbad17b22fdb9cf132cf4664fddd05194da13a1f44f1177697745bbc6da73083941356280e89fe2cceacb6f422cc4522d70ff51db83cd63 + languageName: node + linkType: hard + +"cssnano-utils@npm:^5.0.0": + version: 5.0.0 + resolution: "cssnano-utils@npm:5.0.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/89ed5b8ca554697b4ae285e0d3e134fccc9a0471adda57c8fba17a2bace2f062b9fcf7aeaf66fbd7fabddca8a15a6b1e5ccb70a2783421ae1ac164f779d9f24e + languageName: node + linkType: hard + +"cssnano@npm:^7.0.1": + version: 7.0.6 + resolution: "cssnano@npm:7.0.6" + dependencies: + cssnano-preset-default: "npm:^7.0.6" + lilconfig: "npm:^3.1.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/12b1e1f2b52ff2ba0ecb470e51f8fb3298d976bf91a51c7d2854793ea1e2af5d3c40385a85ad82d2117c84b9528d08f4bfecbb14949c6014d953dae34260952b + languageName: node + linkType: hard + "csso@npm:^4.2.0": version: 4.2.0 resolution: "csso@npm:4.2.0" @@ -22277,6 +21626,15 @@ __metadata: languageName: node linkType: hard +"csso@npm:^5.0.5": + version: 5.0.5 + resolution: "csso@npm:5.0.5" + dependencies: + css-tree: "npm:~2.2.0" + checksum: 10/4036fb2b9f8ed6b948349136b39e0b19ffb5edee934893a37b55e9a116186c4ae2a9d3ba66fbdbc07fa44a853fb478cd2d8733e4743473dcd364e7f21444ff34 + languageName: node + linkType: hard + "cssstyle@npm:^4.1.0": version: 4.1.0 resolution: "cssstyle@npm:4.1.0" @@ -22286,16 +21644,6 @@ __metadata: languageName: node linkType: hard -"cssstyle@npm:^4.2.1": - version: 4.3.1 - resolution: "cssstyle@npm:4.3.1" - dependencies: - "@asamuzakjp/css-color": "npm:^3.1.2" - rrweb-cssom: "npm:^0.8.0" - checksum: 10/e74b2636067c3fd912a16d8d979a7975e5a5c8b3ce9386298d75a82478bb6c8bc03b261b92575348f471b3eb7534d2594a0c4b47d6fc8c03605b2628dce992ff - languageName: node - linkType: hard - "csstype@npm:^2.5.7, csstype@npm:^2.6.6": version: 2.6.21 resolution: "csstype@npm:2.6.21" @@ -22348,7 +21696,6 @@ __metadata: dependencies: "@4tw/cypress-drag-drop": "npm:^1.4.0" "@testing-library/cypress": "npm:^10.0.0" - "@webiny/build-tools": "npm:0.0.0" "@webiny/project-utils": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" amazon-cognito-identity-js: "npm:^4.5.3" @@ -22694,13 +22041,6 @@ __metadata: languageName: node linkType: hard -"decimal.js@npm:^10.5.0": - version: 10.5.0 - resolution: "decimal.js@npm:10.5.0" - checksum: 10/714d49cf2f2207b268221795ede330e51452b7c451a0c02a770837d2d4faed47d603a729c2aa1d952eb6c4102d999e91c9b952c1aa016db3c5cba9fc8bf4cda2 - languageName: node - linkType: hard - "decompress-response@npm:^6.0.0": version: 6.0.0 resolution: "decompress-response@npm:6.0.0" @@ -22792,18 +22132,6 @@ __metadata: languageName: node linkType: hard -"dedent@npm:^1.6.0": - version: 1.6.0 - resolution: "dedent@npm:1.6.0" - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - checksum: 10/f100cb11001309f2185c4334c6f29e5323c1e73b7b75e3b1893bc71ef53cd13fb80534efc8fa7163a891ede633e310a9c600ba38c363cc9d14a72f238fe47078 - languageName: node - linkType: hard - "deep-copy@npm:^1.4.2": version: 1.4.2 resolution: "deep-copy@npm:1.4.2" @@ -22811,6 +22139,13 @@ __metadata: languageName: node linkType: hard +"deep-eql@npm:^5.0.1": + version: 5.0.2 + resolution: "deep-eql@npm:5.0.2" + checksum: 10/a529b81e2ef8821621d20a36959a0328873a3e49d393ad11f8efe8559f31239494c2eb889b80342808674c475802ba95b9d6c4c27641b9a029405104c1b59fcf + languageName: node + linkType: hard + "deep-equal@npm:^2.0.5": version: 2.2.0 resolution: "deep-equal@npm:2.2.0" @@ -22907,6 +22242,15 @@ __metadata: languageName: node linkType: hard +"default-gateway@npm:^6.0.3": + version: 6.0.3 + resolution: "default-gateway@npm:6.0.3" + dependencies: + execa: "npm:^5.0.0" + checksum: 10/126f8273ecac8ee9ff91ea778e8784f6cd732d77c3157e8c5bdd6ed03651b5291f71446d05bc02d04073b1e67583604db5394ea3cf992ede0088c70ea15b7378 + languageName: node + linkType: hard + "defaults@npm:^1.0.3": version: 1.0.4 resolution: "defaults@npm:1.0.4" @@ -23114,7 +22458,7 @@ __metadata: languageName: node linkType: hard -"detect-newline@npm:^3.0.0, detect-newline@npm:^3.1.0": +"detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" checksum: 10/ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 @@ -23278,6 +22622,15 @@ __metadata: languageName: node linkType: hard +"dom-converter@npm:^0.2.0": + version: 0.2.0 + resolution: "dom-converter@npm:0.2.0" + dependencies: + utila: "npm:~0.4" + checksum: 10/71b22f56bce6255a963694a72860a99f08763cf500f02ff38ce4c7489f95b07e7a0069f10b04c7d200e21375474abe01232833ca1600f104bdee7173e493a5b9 + languageName: node + linkType: hard + "dom-css@npm:^2.0.0": version: 2.1.0 resolution: "dom-css@npm:2.1.0" @@ -23432,6 +22785,16 @@ __metadata: languageName: node linkType: hard +"dot-case@npm:^3.0.4": + version: 3.0.4 + resolution: "dot-case@npm:3.0.4" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10/a65e3519414856df0228b9f645332f974f2bf5433370f544a681122eab59e66038fc3349b4be1cdc47152779dac71a5864f1ccda2f745e767c46e9c6543b1169 + languageName: node + linkType: hard + "dot-prop-immutable@npm:^2.1.1": version: 2.1.1 resolution: "dot-prop-immutable@npm:2.1.1" @@ -23632,7 +22995,7 @@ __metadata: languageName: node linkType: hard -"ejs@npm:^3.1.10, ejs@npm:^3.1.7": +"ejs@npm:^3.1.7": version: 3.1.10 resolution: "ejs@npm:3.1.10" dependencies: @@ -23680,13 +23043,6 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.211": - version: 1.5.214 - resolution: "electron-to-chromium@npm:1.5.214" - checksum: 10/5553095d4e98a7396ada99641309e821dacc12f57482e9beb0c0b3d53329da23e7f86e4e0c3ca79b960fc6ebba8a0d0c79435616e431e4940653ef5d74f0755c - languageName: node - linkType: hard - "electron-to-chromium@npm:^1.5.41": version: 1.5.57 resolution: "electron-to-chromium@npm:1.5.57" @@ -23814,6 +23170,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.17.1": + version: 5.17.1 + resolution: "enhanced-resolve@npm:5.17.1" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10/e8e03cb7a4bf3c0250a89afbd29e5ec20e90ba5fcd026066232a0754864d7d0a393fa6fc0e5379314a6529165a1834b36731147080714459d98924520410d8f5 + languageName: node + linkType: hard + "enquirer@npm:2.3.6, enquirer@npm:^2.3.6, enquirer@npm:~2.3.6": version: 2.3.6 resolution: "enquirer@npm:2.3.6" @@ -23851,13 +23217,6 @@ __metadata: languageName: node linkType: hard -"entities@npm:^6.0.0": - version: 6.0.0 - resolution: "entities@npm:6.0.0" - checksum: 10/cf37a4aad887ba8573532346da1c78349dccd5b510a9bbddf92fe59b36b18a8b26fe619a862de4e7fd3b8addc6d5e0969261198bbeb690da87297011a61b7066 - languageName: node - linkType: hard - "env-ci@npm:2.0.1": version: 2.0.1 resolution: "env-ci@npm:2.0.1" @@ -23927,7 +23286,7 @@ __metadata: languageName: node linkType: hard -"error-stack-parser@npm:^2.1.4": +"error-stack-parser@npm:^2.0.6, error-stack-parser@npm:^2.1.4": version: 2.1.4 resolution: "error-stack-parser@npm:2.1.4" dependencies: @@ -24100,6 +23459,20 @@ __metadata: languageName: node linkType: hard +"es-module-lexer@npm:^1.2.1": + version: 1.5.0 + resolution: "es-module-lexer@npm:1.5.0" + checksum: 10/d0e198d8642cb42aa82d86f2c6830cb6786916171a3e693046c11500c0cb62e77703940e58757db8aafa8a86fa2a9cc1c493dcd22c0b03c4a72dede3ce5c7dd1 + languageName: node + linkType: hard + +"es-module-lexer@npm:^1.7.0": + version: 1.7.0 + resolution: "es-module-lexer@npm:1.7.0" + checksum: 10/b6f3e576a3fed4d82b0d0ad4bbf6b3a5ad694d2e7ce8c4a069560da3db6399381eaba703616a182b16dde50ce998af64e07dcf49f2ae48153b9e07be3f107087 + languageName: node + linkType: hard + "es-object-atoms@npm:^1.0.0": version: 1.0.0 resolution: "es-object-atoms@npm:1.0.0" @@ -24170,6 +23543,95 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.25.0": + version: 0.25.9 + resolution: "esbuild@npm:0.25.9" + dependencies: + "@esbuild/aix-ppc64": "npm:0.25.9" + "@esbuild/android-arm": "npm:0.25.9" + "@esbuild/android-arm64": "npm:0.25.9" + "@esbuild/android-x64": "npm:0.25.9" + "@esbuild/darwin-arm64": "npm:0.25.9" + "@esbuild/darwin-x64": "npm:0.25.9" + "@esbuild/freebsd-arm64": "npm:0.25.9" + "@esbuild/freebsd-x64": "npm:0.25.9" + "@esbuild/linux-arm": "npm:0.25.9" + "@esbuild/linux-arm64": "npm:0.25.9" + "@esbuild/linux-ia32": "npm:0.25.9" + "@esbuild/linux-loong64": "npm:0.25.9" + "@esbuild/linux-mips64el": "npm:0.25.9" + "@esbuild/linux-ppc64": "npm:0.25.9" + "@esbuild/linux-riscv64": "npm:0.25.9" + "@esbuild/linux-s390x": "npm:0.25.9" + "@esbuild/linux-x64": "npm:0.25.9" + "@esbuild/netbsd-arm64": "npm:0.25.9" + "@esbuild/netbsd-x64": "npm:0.25.9" + "@esbuild/openbsd-arm64": "npm:0.25.9" + "@esbuild/openbsd-x64": "npm:0.25.9" + "@esbuild/openharmony-arm64": "npm:0.25.9" + "@esbuild/sunos-x64": "npm:0.25.9" + "@esbuild/win32-arm64": "npm:0.25.9" + "@esbuild/win32-ia32": "npm:0.25.9" + "@esbuild/win32-x64": "npm:0.25.9" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/openharmony-arm64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10/fc174ae7f646ad413adb641c7e46f16be575e462ed209866b55d5954d382e5da839e3f3f89a8e42e2b71d48895cc636ba43523011249fe5ff9c63d8d39d3a364 + languageName: node + linkType: hard + "esbuild@npm:~0.25.0": version: 0.25.5 resolution: "esbuild@npm:0.25.5" @@ -24316,6 +23778,32 @@ __metadata: languageName: node linkType: hard +"eslint-config-react-app@npm:^6.0.0": + version: 6.0.0 + resolution: "eslint-config-react-app@npm:6.0.0" + dependencies: + confusing-browser-globals: "npm:^1.0.10" + peerDependencies: + "@typescript-eslint/eslint-plugin": ^4.0.0 + "@typescript-eslint/parser": ^4.0.0 + babel-eslint: ^10.0.0 + eslint: ^7.5.0 + eslint-plugin-flowtype: ^5.2.0 + eslint-plugin-import: ^2.22.0 + eslint-plugin-jest: ^24.0.0 + eslint-plugin-jsx-a11y: ^6.3.1 + eslint-plugin-react: ^7.20.3 + eslint-plugin-react-hooks: ^4.0.8 + eslint-plugin-testing-library: ^3.9.0 + peerDependenciesMeta: + eslint-plugin-jest: + optional: true + eslint-plugin-testing-library: + optional: true + checksum: 10/d10980658b166cc4e772b0c15e3c3d6194d8d41c849bd99155c4a2a85e3d3be2ec9263e7e5c0e4eda5820d294d4e3864952eeed89fa6e8a93bd5c6c04c024106 + languageName: node + linkType: hard + "eslint-config-standard@npm:^16.0.3": version: 16.0.3 resolution: "eslint-config-standard@npm:16.0.3" @@ -24405,23 +23893,6 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jest@npm:^25.7.0": - version: 25.7.0 - resolution: "eslint-plugin-jest@npm:25.7.0" - dependencies: - "@typescript-eslint/experimental-utils": "npm:^5.0.0" - peerDependencies: - "@typescript-eslint/eslint-plugin": ^4.0.0 || ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - "@typescript-eslint/eslint-plugin": - optional: true - jest: - optional: true - checksum: 10/7c358f4503fff7091ddaa8986aba7f4846acc36e7478923cb43fc2cc2ae7be6f49cb1aed222e58d0493154a5e35c4e60111627bf58e72e256831bd2d2c6fd90f - languageName: node - linkType: hard - "eslint-plugin-lodash@npm:^7.4.0": version: 7.4.0 resolution: "eslint-plugin-lodash@npm:7.4.0" @@ -24495,7 +23966,7 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^5.1.1": +"eslint-scope@npm:5.1.1": version: 5.1.1 resolution: "eslint-scope@npm:5.1.1" dependencies: @@ -24524,17 +23995,6 @@ __metadata: languageName: node linkType: hard -"eslint-utils@npm:^3.0.0": - version: 3.0.0 - resolution: "eslint-utils@npm:3.0.0" - dependencies: - eslint-visitor-keys: "npm:^2.0.0" - peerDependencies: - eslint: ">=5" - checksum: 10/7675260a6b220c70f13e4cdbf077e93cad0dfb388429a27d6c0b584b2b20dca24594508e8bdb00a460a5764bd364a5018e20c2b8b1d70f82bcc3fdc30692a4d2 - languageName: node - linkType: hard - "eslint-visitor-keys@npm:^1.1.0": version: 1.3.0 resolution: "eslint-visitor-keys@npm:1.3.0" @@ -24542,13 +24002,6 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^2.0.0": - version: 2.1.0 - resolution: "eslint-visitor-keys@npm:2.1.0" - checksum: 10/db4547eef5039122d518fa307e938ceb8589da5f6e8f5222efaf14dd62f748ce82e2d2becd3ff9412a50350b726bda95dbea8515a471074547daefa58aee8735 - languageName: node - linkType: hard - "eslint-visitor-keys@npm:^3.3.0": version: 3.3.0 resolution: "eslint-visitor-keys@npm:3.3.0" @@ -24680,6 +24133,15 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10/a65728d5727b71de172c5df323385755a16c0fdab8234dc756c3854cfee343261ddfbb72a809a5660fac8c75d960bb3e21aa898c2d7e9b19bb298482ca58a3af + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -24750,7 +24212,7 @@ __metadata: languageName: node linkType: hard -"events@npm:3.3.0, events@npm:^3.3.0": +"events@npm:3.3.0, events@npm:^3.2.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" checksum: 10/a3d47e285e28d324d7180f1e493961a2bbb4cad6412090e4dec114f4db1f5b560c7696ee8e758f55e23913ede856e3689cd3aa9ae13c56b5d8314cd3b3ddd1be @@ -24882,20 +24344,6 @@ __metadata: languageName: node linkType: hard -"exit-hook@npm:^4.0.0": - version: 4.0.0 - resolution: "exit-hook@npm:4.0.0" - checksum: 10/5aa8b4e45fa943e7e174c25329750a0ffefb593ccc2eafd5d67e1d734b114c93cb36b5714548fb1c2a1dd90f3e9cdc606b5e788f428f780708774da444021fdc - languageName: node - linkType: hard - -"exit-x@npm:^0.2.2": - version: 0.2.2 - resolution: "exit-x@npm:0.2.2" - checksum: 10/ee043053e6c1e237adf5ad9c4faf9f085b606f64a4ff859e2b138fab63fe642711d00c9af452a9134c4c92c55f752e818bfabab78c24d345022db163f3137027 - languageName: node - linkType: hard - "exit@npm:0.1.2, exit@npm:0.1.x, exit@npm:^0.1.2": version: 0.1.2 resolution: "exit@npm:0.1.2" @@ -24910,21 +24358,14 @@ __metadata: languageName: node linkType: hard -"expect@npm:30.0.0": - version: 30.0.0 - resolution: "expect@npm:30.0.0" - dependencies: - "@jest/expect-utils": "npm:30.0.0" - "@jest/get-type": "npm:30.0.0" - jest-matcher-utils: "npm:30.0.0" - jest-message-util: "npm:30.0.0" - jest-mock: "npm:30.0.0" - jest-util: "npm:30.0.0" - checksum: 10/2ad7d2a3cdbac38e4bcc946c97beb0c3a6188804b12f3e29d49ae2b98dc8e7e0c3cc26f2489fa852f2e2a9201d1f74ea27163fa188a101087d3c6f226bf96f76 +"expect-type@npm:^1.2.1": + version: 1.2.2 + resolution: "expect-type@npm:1.2.2" + checksum: 10/1703e6e47b575f79d801d87f24c639f4d0af71b327a822e6922d0ccb7eb3f6559abb240b8bd43bab6a477903de4cc322908e194d05132c18f52a217115e8e870 languageName: node linkType: hard -"expect@npm:^29.0.0, expect@npm:^29.7.0": +"expect@npm:^29.7.0": version: 29.7.0 resolution: "expect@npm:29.7.0" dependencies: @@ -24951,7 +24392,7 @@ __metadata: languageName: node linkType: hard -"express@npm:4.21.2, express@npm:^4.21.2": +"express@npm:4.21.2, express@npm:^4.17.3, express@npm:^4.21.2": version: 4.21.2 resolution: "express@npm:4.21.2" dependencies: @@ -25155,6 +24596,19 @@ __metadata: languageName: node linkType: hard +"fast-glob@npm:^3.3.3": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.8" + checksum: 10/dcc6432b269762dd47381d8b8358bf964d8f4f60286ac6aa41c01ade70bda459ff2001b516690b96d5365f68a49242966112b5d5cc9cd82395fa8f9d017c90ad + languageName: node + linkType: hard + "fast-json-patch@npm:^3.0.0-1": version: 3.1.1 resolution: "fast-json-patch@npm:3.1.1" @@ -25162,7 +24616,7 @@ __metadata: languageName: node linkType: hard -"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": +"fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" checksum: 10/2c20055c1fa43c922428f16ca8bb29f2807de63e5c851f665f7ac9790176c01c3b40335257736b299764a8d383388dabc73c8083b8e1bc3d99f0a941444ec60e @@ -25214,16 +24668,6 @@ __metadata: languageName: node linkType: hard -"fast-unique-numbers@npm:^9.0.23": - version: 9.0.23 - resolution: "fast-unique-numbers@npm:9.0.23" - dependencies: - "@babel/runtime": "npm:^7.28.3" - tslib: "npm:^2.8.1" - checksum: 10/2f88e30835a3e7f975aa6a0919d067355232990c2016134450d73eacd1b13638c911786ad9171ef2c9062bf3524bb03766c0e4a8791ff55a5121052ca9a84c00 - languageName: node - linkType: hard - "fast-uri@npm:^2.0.0, fast-uri@npm:^2.1.0": version: 2.2.0 resolution: "fast-uri@npm:2.2.0" @@ -25314,7 +24758,7 @@ __metadata: languageName: node linkType: hard -"fb-watchman@npm:^2.0.0, fb-watchman@npm:^2.0.2": +"fb-watchman@npm:^2.0.0": version: 2.0.2 resolution: "fb-watchman@npm:2.0.2" dependencies: @@ -25363,6 +24807,18 @@ __metadata: languageName: node linkType: hard +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10/14ca1c9f0a0e8f4f2e9bf4e8551065a164a09545dae548c12a18d238b72e51e5a7b39bd8e5494b56463a0877672d0a6c1ef62c6fa0677db1b0c847773be939b1 + languageName: node + linkType: hard + "fecha@npm:^2.3.3": version: 2.3.3 resolution: "fecha@npm:2.3.3" @@ -25407,6 +24863,18 @@ __metadata: languageName: node linkType: hard +"file-loader@npm:6.2.0": + version: 6.2.0 + resolution: "file-loader@npm:6.2.0" + dependencies: + loader-utils: "npm:^2.0.0" + schema-utils: "npm:^3.0.0" + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 10/3a854be3a7501bdb0fd8a1c0d45c156c0dc8f0afced07cbdac0b13a79c2f2a03f7770d68cb555ff30b5ea7c20719df34e1b2bd896c93e3138ee31f0bdc560310 + languageName: node + linkType: hard + "file-type@npm:^3.8.0": version: 3.9.0 resolution: "file-type@npm:3.9.0" @@ -25685,6 +25153,29 @@ __metadata: languageName: node linkType: hard +"fork-ts-checker-webpack-plugin@npm:^9.0.2": + version: 9.0.2 + resolution: "fork-ts-checker-webpack-plugin@npm:9.0.2" + dependencies: + "@babel/code-frame": "npm:^7.16.7" + chalk: "npm:^4.1.2" + chokidar: "npm:^3.5.3" + cosmiconfig: "npm:^8.2.0" + deepmerge: "npm:^4.2.2" + fs-extra: "npm:^10.0.0" + memfs: "npm:^3.4.1" + minimatch: "npm:^3.0.4" + node-abort-controller: "npm:^3.0.1" + schema-utils: "npm:^3.1.1" + semver: "npm:^7.3.5" + tapable: "npm:^2.2.1" + peerDependencies: + typescript: ">3.6.0" + webpack: ^5.11.0 + checksum: 10/3399ea114d9397da5e51baaa1cf2ca704f4616c8255df672889cafc2a823f77e8bf9913133852d29d676657b1d40e4a2fba8eb9fafee09e00faeda924289220e + languageName: node + linkType: hard + "form-data@npm:^3.0.0": version: 3.0.1 resolution: "form-data@npm:3.0.1" @@ -25746,6 +25237,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^10.0.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10/05ce2c3b59049bcb7b52001acd000e44b3c4af4ec1f8839f383ef41ec0048e3cfa7fd8a637b1bddfefad319145db89be91f4b7c1db2908205d38bf91e7d1d3b7 + languageName: node + linkType: hard + "fs-extra@npm:^11.1.0, fs-extra@npm:^11.1.1, fs-extra@npm:^11.2.0": version: 11.2.0 resolution: "fs-extra@npm:11.2.0" @@ -25805,6 +25307,13 @@ __metadata: languageName: node linkType: hard +"fs-monkey@npm:^1.0.4": + version: 1.0.6 + resolution: "fs-monkey@npm:1.0.6" + checksum: 10/a0502a23aa0b467f671cd5c7f989ff48611cce1f23deb8f6924862b49234ff37de6828f739a4f2c1acf8f20e80cb426bf6a9d135c401f3df1e7089b7de04c815 + languageName: node + linkType: hard + "fs-readdir-recursive@npm:^1.1.0": version: 1.1.0 resolution: "fs-readdir-recursive@npm:1.1.0" @@ -25829,7 +25338,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.3, fsevents@npm:~2.3.3": +"fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -25848,7 +25357,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A^2.3.3#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": +"fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -26335,6 +25844,13 @@ __metadata: languageName: node linkType: hard +"glob-to-regexp@npm:^0.4.1": + version: 0.4.1 + resolution: "glob-to-regexp@npm:0.4.1" + checksum: 10/9009529195a955c40d7b9690794aeff5ba665cc38f1519e111c58bb54366fd0c106bde80acf97ba4e533208eb53422c83b136611a54c5fefb1edd8dc267cb62e + languageName: node + linkType: hard + "glob@npm:^10.0.0": version: 10.3.10 resolution: "glob@npm:10.3.10" @@ -26896,6 +26412,15 @@ __metadata: languageName: node linkType: hard +"he@npm:^1.2.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: 10/d09b2243da4e23f53336e8de3093e5c43d2c39f8d0d18817abfa32ce3e9355391b2edb4bb5edc376aea5d4b0b59d6a0482aab4c52bc02ef95751e4b818e847f1 + languageName: node + linkType: hard + "help-me@npm:^4.0.1": version: 4.2.0 resolution: "help-me@npm:4.2.0" @@ -26906,13 +26431,6 @@ __metadata: languageName: node linkType: hard -"help-me@npm:^5.0.0": - version: 5.0.0 - resolution: "help-me@npm:5.0.0" - checksum: 10/5f99bd91dae93d02867175c3856c561d7e3a24f16999b08f5fc79689044b938d7ed58457f4d8c8744c01403e6e0470b7896baa344d112b2355842fd935a75d69 - languageName: node - linkType: hard - "history@npm:^5.2.0, history@npm:^5.3.0": version: 5.3.0 resolution: "history@npm:5.3.0" @@ -27022,7 +26540,14 @@ __metadata: languageName: node linkType: hard -"html-entities@npm:^2.6.0": +"html-entities@npm:^2.1.0": + version: 2.3.3 + resolution: "html-entities@npm:2.3.3" + checksum: 10/24f6b77ce234e263f3d44530de2356e67c313c8ba7e5f6e02c16dcea3a950711d8820afb320746d57b8dae61fde7aaaa7f60017b706fa4bce8624ba3c29ad316 + languageName: node + linkType: hard + +"html-entities@npm:^2.3.2, html-entities@npm:^2.6.0": version: 2.6.0 resolution: "html-entities@npm:2.6.0" checksum: 10/06d4e7a3ba6243bba558af176e56f85e09894b26d911bc1ef7b2b9b3f18b46604360805b32636f080e954778e9a34313d1982479a05a5aa49791afd6a4229346 @@ -27043,6 +26568,44 @@ __metadata: languageName: node linkType: hard +"html-minifier-terser@npm:^6.0.2": + version: 6.1.0 + resolution: "html-minifier-terser@npm:6.1.0" + dependencies: + camel-case: "npm:^4.1.2" + clean-css: "npm:^5.2.2" + commander: "npm:^8.3.0" + he: "npm:^1.2.0" + param-case: "npm:^3.0.4" + relateurl: "npm:^0.2.7" + terser: "npm:^5.10.0" + bin: + html-minifier-terser: cli.js + checksum: 10/a244fa944e002b57c66cc829a3f2dfdb9514b1833c2d838ada624964bf8c0afaf61d36c371758c7e44dedae95cea740a84d8d1067b916ed204f35175184d0e27 + languageName: node + linkType: hard + +"html-webpack-plugin@npm:^5.6.3": + version: 5.6.3 + resolution: "html-webpack-plugin@npm:5.6.3" + dependencies: + "@types/html-minifier-terser": "npm:^6.0.0" + html-minifier-terser: "npm:^6.0.2" + lodash: "npm:^4.17.21" + pretty-error: "npm:^4.0.0" + tapable: "npm:^2.0.0" + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10/fd2bf1ac04823526c8b609555d027b38b9d61b4ba9f5c8116a37cc6b62d5b86cab1f478616e8c5344fee13663d2566f5c470c66265ecb1e9574dc38d0459889d + languageName: node + linkType: hard + "htmlparser2@npm:3.8.x": version: 3.8.3 resolution: "htmlparser2@npm:3.8.3" @@ -27070,7 +26633,7 @@ __metadata: languageName: node linkType: hard -"htmlparser2@npm:^6.0.0": +"htmlparser2@npm:^6.0.0, htmlparser2@npm:^6.1.0": version: 6.1.0 resolution: "htmlparser2@npm:6.1.0" dependencies: @@ -27173,7 +26736,7 @@ __metadata: languageName: node linkType: hard -"http-proxy-middleware@npm:^2.0.9": +"http-proxy-middleware@npm:^2.0.3, http-proxy-middleware@npm:^2.0.9": version: 2.0.9 resolution: "http-proxy-middleware@npm:2.0.9" dependencies: @@ -27288,13 +26851,6 @@ __metadata: languageName: node linkType: hard -"humanize-duration@npm:3.32.1": - version: 3.32.1 - resolution: "humanize-duration@npm:3.32.1" - checksum: 10/5909107485c33d0c025e5d15a45b2700f91c9efc1e88510867926b3d1ef24d2d0c8bf31f52abef92da53b29e69410c5acb3a4d6d72429bd8b61d82ac25739ce4 - languageName: node - linkType: hard - "humanize-duration@npm:^3.27.0": version: 3.33.0 resolution: "humanize-duration@npm:3.33.0" @@ -27371,7 +26927,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -27506,18 +27062,6 @@ __metadata: languageName: node linkType: hard -"import-local@npm:^3.2.0": - version: 3.2.0 - resolution: "import-local@npm:3.2.0" - dependencies: - pkg-dir: "npm:^4.2.0" - resolve-cwd: "npm:^3.0.0" - bin: - import-local-fixture: fixtures/cli.js - checksum: 10/0b0b0b412b2521739fbb85eeed834a3c34de9bc67e670b3d0b86248fc460d990a7b116ad056c084b87a693ef73d1f17268d6a5be626bb43c998a8b1c8a230004 - languageName: node - linkType: hard - "import-meta-resolve@npm:^4.1.0": version: 4.1.0 resolution: "import-meta-resolve@npm:4.1.0" @@ -27689,26 +27233,6 @@ __metadata: languageName: node linkType: hard -"inquirer@npm:^12.9.4": - version: 12.9.4 - resolution: "inquirer@npm:12.9.4" - dependencies: - "@inquirer/core": "npm:^10.2.0" - "@inquirer/prompts": "npm:^7.8.4" - "@inquirer/type": "npm:^3.0.8" - ansi-escapes: "npm:^4.3.2" - mute-stream: "npm:^2.0.0" - run-async: "npm:^4.0.5" - rxjs: "npm:^7.8.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10/9ee168daef88b1e4e2c52d7524c7bb6e96f5ab3a5905ae1b4ede3c95f636ffcf006bcf92cf4bab31d9c6f09739f013ebf7fa2ef609a19f379ef3e34c467eeb5f - languageName: node - linkType: hard - "inquirer@npm:^5.1.0": version: 5.2.0 resolution: "inquirer@npm:5.2.0" @@ -27773,13 +27297,6 @@ __metadata: languageName: node linkType: hard -"ip-address@npm:^10.0.1": - version: 10.0.1 - resolution: "ip-address@npm:10.0.1" - checksum: 10/09731acda32cd8e14c46830c137e7e5940f47b36d63ffb87c737331270287d631cf25aa95570907a67d3f919fdb25f4470c404eda21e62f22e0a55927f4dd0fb - languageName: node - linkType: hard - "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -27797,7 +27314,7 @@ __metadata: languageName: node linkType: hard -"ipaddr.js@npm:^2.1.0": +"ipaddr.js@npm:^2.0.1, ipaddr.js@npm:^2.1.0": version: 2.2.0 resolution: "ipaddr.js@npm:2.2.0" checksum: 10/9e1cdd9110b3bca5d910ab70d7fb1933e9c485d9b92cb14ef39f30c412ba3fe02a553921bf696efc7149cc653453c48ccf173adb996ec27d925f1f340f872986 @@ -28091,7 +27608,7 @@ __metadata: languageName: node linkType: hard -"is-generator-fn@npm:^2.0.0, is-generator-fn@npm:^2.1.0": +"is-generator-fn@npm:^2.0.0": version: 2.1.0 resolution: "is-generator-fn@npm:2.1.0" checksum: 10/a6ad5492cf9d1746f73b6744e0c43c0020510b59d56ddcb78a91cbc173f09b5e6beff53d75c9c5a29feb618bfef2bf458e025ecf3a57ad2268e2fb2569f56215 @@ -28687,19 +28204,6 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-instrument@npm:^6.0.2": - version: 6.0.3 - resolution: "istanbul-lib-instrument@npm:6.0.3" - dependencies: - "@babel/core": "npm:^7.23.9" - "@babel/parser": "npm:^7.23.9" - "@istanbuljs/schema": "npm:^0.1.3" - istanbul-lib-coverage: "npm:^3.2.0" - semver: "npm:^7.5.4" - checksum: 10/aa5271c0008dfa71b6ecc9ba1e801bf77b49dc05524e8c30d58aaf5b9505e0cd12f25f93165464d4266a518c5c75284ecb598fbd89fec081ae77d2c9d3327695 - languageName: node - linkType: hard - "istanbul-lib-report@npm:^3.0.0": version: 3.0.0 resolution: "istanbul-lib-report@npm:3.0.0" @@ -28722,17 +28226,6 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-source-maps@npm:^5.0.0": - version: 5.0.6 - resolution: "istanbul-lib-source-maps@npm:5.0.6" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.23" - debug: "npm:^4.1.1" - istanbul-lib-coverage: "npm:^3.0.0" - checksum: 10/569dd0a392ee3464b1fe1accbaef5cc26de3479eacb5b91d8c67ebb7b425d39fd02247d85649c3a0e9c29b600809fa60b5af5a281a75a89c01f385b1e24823a2 - languageName: node - linkType: hard - "istanbul-reports@npm:^3.1.3": version: 3.1.5 resolution: "istanbul-reports@npm:3.1.5" @@ -28810,17 +28303,6 @@ __metadata: languageName: node linkType: hard -"jest-changed-files@npm:30.0.0": - version: 30.0.0 - resolution: "jest-changed-files@npm:30.0.0" - dependencies: - execa: "npm:^5.1.1" - jest-util: "npm:30.0.0" - p-limit: "npm:^3.1.0" - checksum: 10/1ac8cd876eed8e7f2ef558b6fded15a5b80950ef7d1161162bd87c9fb2f8b3da5683586caac3e1b93498bb6ee84d076cb87f1133d7ae05b64e19d67a1daa69fe - languageName: node - linkType: hard - "jest-changed-files@npm:^29.7.0": version: 29.7.0 resolution: "jest-changed-files@npm:29.7.0" @@ -28832,34 +28314,6 @@ __metadata: languageName: node linkType: hard -"jest-circus@npm:30.0.0": - version: 30.0.0 - resolution: "jest-circus@npm:30.0.0" - dependencies: - "@jest/environment": "npm:30.0.0" - "@jest/expect": "npm:30.0.0" - "@jest/test-result": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - "@types/node": "npm:*" - chalk: "npm:^4.1.2" - co: "npm:^4.6.0" - dedent: "npm:^1.6.0" - is-generator-fn: "npm:^2.1.0" - jest-each: "npm:30.0.0" - jest-matcher-utils: "npm:30.0.0" - jest-message-util: "npm:30.0.0" - jest-runtime: "npm:30.0.0" - jest-snapshot: "npm:30.0.0" - jest-util: "npm:30.0.0" - p-limit: "npm:^3.1.0" - pretty-format: "npm:30.0.0" - pure-rand: "npm:^7.0.0" - slash: "npm:^3.0.0" - stack-utils: "npm:^2.0.6" - checksum: 10/8ed438ffec53b44b508b0145cc01b695e75e61f811d459bb02e4c2cc1d16a67e6279e17419f96ef0e2c661940d183cf874b7979f5633c0f8058cac3a58e73c58 - languageName: node - linkType: hard - "jest-circus@npm:^29.7.0": version: 29.7.0 resolution: "jest-circus@npm:29.7.0" @@ -28888,31 +28342,6 @@ __metadata: languageName: node linkType: hard -"jest-cli@npm:30.0.0": - version: 30.0.0 - resolution: "jest-cli@npm:30.0.0" - dependencies: - "@jest/core": "npm:30.0.0" - "@jest/test-result": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - chalk: "npm:^4.1.2" - exit-x: "npm:^0.2.2" - import-local: "npm:^3.2.0" - jest-config: "npm:30.0.0" - jest-util: "npm:30.0.0" - jest-validate: "npm:30.0.0" - yargs: "npm:^17.7.2" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: ./bin/jest.js - checksum: 10/5f724bc6ebbcdc9d6b6f45c973b09eeb7c0f616196363b5cdb1dfbe7e7e4a92bcab330d7848cc956d05d525c6497fd7e30b231a5bcd293211280996be4cf9892 - languageName: node - linkType: hard - "jest-cli@npm:^29.7.0": version: 29.7.0 resolution: "jest-cli@npm:29.7.0" @@ -28939,49 +28368,6 @@ __metadata: languageName: node linkType: hard -"jest-config@npm:30.0.0": - version: 30.0.0 - resolution: "jest-config@npm:30.0.0" - dependencies: - "@babel/core": "npm:^7.27.4" - "@jest/get-type": "npm:30.0.0" - "@jest/pattern": "npm:30.0.0" - "@jest/test-sequencer": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - babel-jest: "npm:30.0.0" - chalk: "npm:^4.1.2" - ci-info: "npm:^4.2.0" - deepmerge: "npm:^4.3.1" - glob: "npm:^10.3.10" - graceful-fs: "npm:^4.2.11" - jest-circus: "npm:30.0.0" - jest-docblock: "npm:30.0.0" - jest-environment-node: "npm:30.0.0" - jest-regex-util: "npm:30.0.0" - jest-resolve: "npm:30.0.0" - jest-runner: "npm:30.0.0" - jest-util: "npm:30.0.0" - jest-validate: "npm:30.0.0" - micromatch: "npm:^4.0.8" - parse-json: "npm:^5.2.0" - pretty-format: "npm:30.0.0" - slash: "npm:^3.0.0" - strip-json-comments: "npm:^3.1.1" - peerDependencies: - "@types/node": "*" - esbuild-register: ">=3.4.0" - ts-node: ">=9.0.0" - peerDependenciesMeta: - "@types/node": - optional: true - esbuild-register: - optional: true - ts-node: - optional: true - checksum: 10/761cd72559f93decbe99a022aa066596ce7f5c3d44a6c599dd85194132869954ab2af8517dbac29d71176b23504275c16a502a40faec84fbee4d05dccff2deac - languageName: node - linkType: hard - "jest-config@npm:^29.7.0": version: 29.7.0 resolution: "jest-config@npm:29.7.0" @@ -29020,18 +28406,6 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:30.0.0": - version: 30.0.0 - resolution: "jest-diff@npm:30.0.0" - dependencies: - "@jest/diff-sequences": "npm:30.0.0" - "@jest/get-type": "npm:30.0.0" - chalk: "npm:^4.1.2" - pretty-format: "npm:30.0.0" - checksum: 10/e17d8b5e664927f4133cd18bae39386791c48388882d88e521b77a8fa4aa241f4e53e6f161a8795ffe88d44798efd899c27f5e1c6b1870b1a61d7a98178a9024 - languageName: node - linkType: hard - "jest-diff@npm:>=29.4.3 < 30, jest-diff@npm:^29.4.1, jest-diff@npm:^29.7.0": version: 29.7.0 resolution: "jest-diff@npm:29.7.0" @@ -29056,15 +28430,6 @@ __metadata: languageName: node linkType: hard -"jest-docblock@npm:30.0.0": - version: 30.0.0 - resolution: "jest-docblock@npm:30.0.0" - dependencies: - detect-newline: "npm:^3.1.0" - checksum: 10/c81850951c832a8aea4d5f8cbd48f25c5bb6a3c6efc735da47d32ba8be9741b0fbbf4d908934a3a299f72c794311d250453eec924f722b8e4700663f9a74270a - languageName: node - linkType: hard - "jest-docblock@npm:^29.7.0": version: 29.7.0 resolution: "jest-docblock@npm:29.7.0" @@ -29094,19 +28459,6 @@ __metadata: languageName: node linkType: hard -"jest-each@npm:30.0.0": - version: 30.0.0 - resolution: "jest-each@npm:30.0.0" - dependencies: - "@jest/get-type": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - chalk: "npm:^4.1.2" - jest-util: "npm:30.0.0" - pretty-format: "npm:30.0.0" - checksum: 10/b20b3eb1967fe1cbaa9aad746a8c723463c3c89b2fb66f29f62a8c8e53a7d2e518eb1cead9ae13a40280b15454ff32ec8c016ffb3731071bb23fd7691b675a25 - languageName: node - linkType: hard - "jest-each@npm:^29.7.0": version: 29.7.0 resolution: "jest-each@npm:29.7.0" @@ -29120,39 +28472,6 @@ __metadata: languageName: node linkType: hard -"jest-environment-jsdom@npm:^30.0.0-rc.1": - version: 30.0.0 - resolution: "jest-environment-jsdom@npm:30.0.0" - dependencies: - "@jest/environment": "npm:30.0.0" - "@jest/environment-jsdom-abstract": "npm:30.0.0" - "@types/jsdom": "npm:^21.1.7" - "@types/node": "npm:*" - jsdom: "npm:^26.1.0" - peerDependencies: - canvas: ^3.0.0 - peerDependenciesMeta: - canvas: - optional: true - checksum: 10/5cb1d4be4f3d998a22e052fa7627caae186024af969f63ac1ff0b7b4ee7efe3005eabfdce4caf42ad08f6842c31c8b9f93c1826eae515db7b4f4ccd0576baac3 - languageName: node - linkType: hard - -"jest-environment-node@npm:30.0.0": - version: 30.0.0 - resolution: "jest-environment-node@npm:30.0.0" - dependencies: - "@jest/environment": "npm:30.0.0" - "@jest/fake-timers": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - "@types/node": "npm:*" - jest-mock: "npm:30.0.0" - jest-util: "npm:30.0.0" - jest-validate: "npm:30.0.0" - checksum: 10/02620701b91fb6bc69667df2e749c82541c7320fea6b31f14f980a15d5ed291b8c65b5f46ae03f3190fd42d84c8b7c87228f2b49ac51a5b70cdfdf68ac8f3f29 - languageName: node - linkType: hard - "jest-environment-node@npm:^29.7.0": version: 29.7.0 resolution: "jest-environment-node@npm:29.7.0" @@ -29167,22 +28486,24 @@ __metadata: languageName: node linkType: hard -"jest-extended@npm:^4.0.2": - version: 4.0.2 - resolution: "jest-extended@npm:4.0.2" +"jest-extended@npm:^6.0.0": + version: 6.0.0 + resolution: "jest-extended@npm:6.0.0" dependencies: jest-diff: "npm:^29.0.0" - jest-get-type: "npm:^29.0.0" peerDependencies: jest: ">=27.2.5" + typescript: ">=5.0.0" peerDependenciesMeta: jest: optional: true - checksum: 10/6633c425636751462b0f2106915c6ed91ab07a0e55d28477ae2405361e0a05f617f4dae60b0d4332096e2757644a2a6c5d40e618be6a6c0d47a0325f7e696ce6 + typescript: + optional: false + checksum: 10/9b23c9a42c46dd364dc9edcd8a6314b0ce6ec518d5453059b8b33fd5d559eadbbba1cb7c30cf7d642e50b41a433f107e55a278ea7cf8ba9c5f15663728ce79ae languageName: node linkType: hard -"jest-get-type@npm:^29.0.0, jest-get-type@npm:^29.4.3": +"jest-get-type@npm:^29.4.3": version: 29.4.3 resolution: "jest-get-type@npm:29.4.3" checksum: 10/6ac7f2dde1c65e292e4355b6c63b3a4897d7e92cb4c8afcf6d397f2682f8080e094c8b0b68205a74d269882ec06bf696a9de6cd3e1b7333531e5ed7b112605ce @@ -29196,28 +28517,6 @@ __metadata: languageName: node linkType: hard -"jest-haste-map@npm:30.0.0": - version: 30.0.0 - resolution: "jest-haste-map@npm:30.0.0" - dependencies: - "@jest/types": "npm:30.0.0" - "@types/node": "npm:*" - anymatch: "npm:^3.1.3" - fb-watchman: "npm:^2.0.2" - fsevents: "npm:^2.3.3" - graceful-fs: "npm:^4.2.11" - jest-regex-util: "npm:30.0.0" - jest-util: "npm:30.0.0" - jest-worker: "npm:30.0.0" - micromatch: "npm:^4.0.8" - walker: "npm:^1.0.8" - dependenciesMeta: - fsevents: - optional: true - checksum: 10/5462964548343e45ab9c4a1ae096eeb9e82797463f11dc663c9563d2fa33aea2514ee2dffcf7d5e5806230747cfc4c1a2a36d14e11b5e65e95d117a5786f7685 - languageName: node - linkType: hard - "jest-haste-map@npm:^29.7.0": version: 29.7.0 resolution: "jest-haste-map@npm:29.7.0" @@ -29260,16 +28559,6 @@ __metadata: languageName: node linkType: hard -"jest-leak-detector@npm:30.0.0": - version: 30.0.0 - resolution: "jest-leak-detector@npm:30.0.0" - dependencies: - "@jest/get-type": "npm:30.0.0" - pretty-format: "npm:30.0.0" - checksum: 10/04ae697e46e01cb389db5b1528d40145a97727f5ed1bd8d6f0ad5b9a80ea89677384127b428ee51bf6d1404ba230317b20d4ca79a81ffd3de73a10418aa4c2bc - languageName: node - linkType: hard - "jest-leak-detector@npm:^29.7.0": version: 29.7.0 resolution: "jest-leak-detector@npm:29.7.0" @@ -29280,18 +28569,6 @@ __metadata: languageName: node linkType: hard -"jest-matcher-utils@npm:30.0.0": - version: 30.0.0 - resolution: "jest-matcher-utils@npm:30.0.0" - dependencies: - "@jest/get-type": "npm:30.0.0" - chalk: "npm:^4.1.2" - jest-diff: "npm:30.0.0" - pretty-format: "npm:30.0.0" - checksum: 10/3aa46a7d381fa6c6f6d7effdfbecfb922eae2fc27e73a3d905cafb505754e357ae8bdd94282ca04f0f6287efa470c75dec15c26952442eb8f1f5480bd0ca4654 - languageName: node - linkType: hard - "jest-matcher-utils@npm:^29.7.0": version: 29.7.0 resolution: "jest-matcher-utils@npm:29.7.0" @@ -29304,23 +28581,6 @@ __metadata: languageName: node linkType: hard -"jest-message-util@npm:30.0.0": - version: 30.0.0 - resolution: "jest-message-util@npm:30.0.0" - dependencies: - "@babel/code-frame": "npm:^7.27.1" - "@jest/types": "npm:30.0.0" - "@types/stack-utils": "npm:^2.0.3" - chalk: "npm:^4.1.2" - graceful-fs: "npm:^4.2.11" - micromatch: "npm:^4.0.8" - pretty-format: "npm:30.0.0" - slash: "npm:^3.0.0" - stack-utils: "npm:^2.0.6" - checksum: 10/d2585d8712217b1ffa742ce0aaabbd44b2a57ee57e24f1f84c5841e0f618aac4c44baeecd5fee9acd8a172bcf4c5bda92f5572bc367b0a8fb26831d350793dad - languageName: node - linkType: hard - "jest-message-util@npm:^29.7.0": version: 29.7.0 resolution: "jest-message-util@npm:29.7.0" @@ -29347,17 +28607,6 @@ __metadata: languageName: node linkType: hard -"jest-mock@npm:30.0.0": - version: 30.0.0 - resolution: "jest-mock@npm:30.0.0" - dependencies: - "@jest/types": "npm:30.0.0" - "@types/node": "npm:*" - jest-util: "npm:30.0.0" - checksum: 10/4896ba250487dfc2b3db123773e42df95df135a5c1e754933bd5996f8e389f410fb2f58e3384f6f1a27adb1ecbbdef85f05873aeb64081089ccb471a1172fb37 - languageName: node - linkType: hard - "jest-mock@npm:^29.7.0": version: 29.7.0 resolution: "jest-mock@npm:29.7.0" @@ -29369,7 +28618,7 @@ __metadata: languageName: node linkType: hard -"jest-pnp-resolver@npm:^1.2.2, jest-pnp-resolver@npm:^1.2.3": +"jest-pnp-resolver@npm:^1.2.2": version: 1.2.3 resolution: "jest-pnp-resolver@npm:1.2.3" peerDependencies: @@ -29381,13 +28630,6 @@ __metadata: languageName: node linkType: hard -"jest-regex-util@npm:30.0.0": - version: 30.0.0 - resolution: "jest-regex-util@npm:30.0.0" - checksum: 10/aa4449a029db9815085a3bb6a0db242ab4b2e98a0847b7da400a244e3447d94ca6e805b6ef1b4b7dc46a385444052dd23c1169302d552569ebc8604fec4e1e2c - languageName: node - linkType: hard - "jest-regex-util@npm:^29.6.3": version: 29.6.3 resolution: "jest-regex-util@npm:29.6.3" @@ -29395,16 +28637,6 @@ __metadata: languageName: node linkType: hard -"jest-resolve-dependencies@npm:30.0.0": - version: 30.0.0 - resolution: "jest-resolve-dependencies@npm:30.0.0" - dependencies: - jest-regex-util: "npm:30.0.0" - jest-snapshot: "npm:30.0.0" - checksum: 10/e50491b29276744dce97ea57a43fc04f46c0236cf92e3d6ea56d2c66be1cb394f1c885e997a97d5b90a10924b3253f188e01e94cd8f3a0e6ba16dfa68a536f00 - languageName: node - linkType: hard - "jest-resolve-dependencies@npm:^29.7.0": version: 29.7.0 resolution: "jest-resolve-dependencies@npm:29.7.0" @@ -29415,23 +28647,7 @@ __metadata: languageName: node linkType: hard -"jest-resolve@npm:30.0.0": - version: 30.0.0 - resolution: "jest-resolve@npm:30.0.0" - dependencies: - chalk: "npm:^4.1.2" - graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.0.0" - jest-pnp-resolver: "npm:^1.2.3" - jest-util: "npm:30.0.0" - jest-validate: "npm:30.0.0" - slash: "npm:^3.0.0" - unrs-resolver: "npm:^1.7.11" - checksum: 10/521ca87638d0c68a6de1d34ac8f696e93bd812d872a44258de139cf6c40b768fc1f4497b10e1bd8d618c4d020ad65df7258c9285bfbe6bc8d21f961fd7daa88b - languageName: node - linkType: hard - -"jest-resolve@npm:^29.5.0, jest-resolve@npm:^29.7.0": +"jest-resolve@npm:^29.7.0": version: 29.7.0 resolution: "jest-resolve@npm:29.7.0" dependencies: @@ -29448,36 +28664,6 @@ __metadata: languageName: node linkType: hard -"jest-runner@npm:30.0.0": - version: 30.0.0 - resolution: "jest-runner@npm:30.0.0" - dependencies: - "@jest/console": "npm:30.0.0" - "@jest/environment": "npm:30.0.0" - "@jest/test-result": "npm:30.0.0" - "@jest/transform": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - "@types/node": "npm:*" - chalk: "npm:^4.1.2" - emittery: "npm:^0.13.1" - exit-x: "npm:^0.2.2" - graceful-fs: "npm:^4.2.11" - jest-docblock: "npm:30.0.0" - jest-environment-node: "npm:30.0.0" - jest-haste-map: "npm:30.0.0" - jest-leak-detector: "npm:30.0.0" - jest-message-util: "npm:30.0.0" - jest-resolve: "npm:30.0.0" - jest-runtime: "npm:30.0.0" - jest-util: "npm:30.0.0" - jest-watcher: "npm:30.0.0" - jest-worker: "npm:30.0.0" - p-limit: "npm:^3.1.0" - source-map-support: "npm:0.5.13" - checksum: 10/6526cf9c0f039c085734dca4d186052e7bcee9da73b40b4e3c0ad9cb8a863d176e4410ce8ba7beda58e53665026c1579350239ef19971fb9a976ac4d7be2dc49 - languageName: node - linkType: hard - "jest-runner@npm:^29.7.0": version: 29.7.0 resolution: "jest-runner@npm:29.7.0" @@ -29507,36 +28693,6 @@ __metadata: languageName: node linkType: hard -"jest-runtime@npm:30.0.0": - version: 30.0.0 - resolution: "jest-runtime@npm:30.0.0" - dependencies: - "@jest/environment": "npm:30.0.0" - "@jest/fake-timers": "npm:30.0.0" - "@jest/globals": "npm:30.0.0" - "@jest/source-map": "npm:30.0.0" - "@jest/test-result": "npm:30.0.0" - "@jest/transform": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - "@types/node": "npm:*" - chalk: "npm:^4.1.2" - cjs-module-lexer: "npm:^2.1.0" - collect-v8-coverage: "npm:^1.0.2" - glob: "npm:^10.3.10" - graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.0.0" - jest-message-util: "npm:30.0.0" - jest-mock: "npm:30.0.0" - jest-regex-util: "npm:30.0.0" - jest-resolve: "npm:30.0.0" - jest-snapshot: "npm:30.0.0" - jest-util: "npm:30.0.0" - slash: "npm:^3.0.0" - strip-bom: "npm:^4.0.0" - checksum: 10/e20e7b569c0804dfbfc49169895f117dd27bca865e4a46ce4813993aaf79e5a43f1ee21eb720e7e0b9594bdd9e7751c4d6aa6cb1384a8ee217c2308a1b4858fa - languageName: node - linkType: hard - "jest-runtime@npm:^29.7.0": version: 29.7.0 resolution: "jest-runtime@npm:29.7.0" @@ -29567,35 +28723,6 @@ __metadata: languageName: node linkType: hard -"jest-snapshot@npm:30.0.0": - version: 30.0.0 - resolution: "jest-snapshot@npm:30.0.0" - dependencies: - "@babel/core": "npm:^7.27.4" - "@babel/generator": "npm:^7.27.5" - "@babel/plugin-syntax-jsx": "npm:^7.27.1" - "@babel/plugin-syntax-typescript": "npm:^7.27.1" - "@babel/types": "npm:^7.27.3" - "@jest/expect-utils": "npm:30.0.0" - "@jest/get-type": "npm:30.0.0" - "@jest/snapshot-utils": "npm:30.0.0" - "@jest/transform": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - babel-preset-current-node-syntax: "npm:^1.1.0" - chalk: "npm:^4.1.2" - expect: "npm:30.0.0" - graceful-fs: "npm:^4.2.11" - jest-diff: "npm:30.0.0" - jest-matcher-utils: "npm:30.0.0" - jest-message-util: "npm:30.0.0" - jest-util: "npm:30.0.0" - pretty-format: "npm:30.0.0" - semver: "npm:^7.7.2" - synckit: "npm:^0.11.8" - checksum: 10/0f54d2fefd5e2a8c954b7a306ca194c0a3a6a26c8dfb1daea684569a766c4557ff69cea0088acef4621af1f08a6dcb46be001aba31aaad36e78725bef5d5a6dc - languageName: node - linkType: hard - "jest-snapshot@npm:^29.7.0": version: 29.7.0 resolution: "jest-snapshot@npm:29.7.0" @@ -29624,34 +28751,6 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:30.0.0": - version: 30.0.0 - resolution: "jest-util@npm:30.0.0" - dependencies: - "@jest/types": "npm:30.0.0" - "@types/node": "npm:*" - chalk: "npm:^4.1.2" - ci-info: "npm:^4.2.0" - graceful-fs: "npm:^4.2.11" - picomatch: "npm:^4.0.2" - checksum: 10/55171f90104769695d6231c5b0ea182e4edb6465c2af482c4c4345ee55467a553b2272781cf053c9973ae12b3c4f887bc32df8828d8973c0fcf4eb31561fcb4a - languageName: node - linkType: hard - -"jest-util@npm:^29.0.0": - version: 29.5.0 - resolution: "jest-util@npm:29.5.0" - dependencies: - "@jest/types": "npm:^29.5.0" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - graceful-fs: "npm:^4.2.9" - picomatch: "npm:^2.2.3" - checksum: 10/27ae6fc6221d29b31df9c071f190e0e27a9caaeca04ee1ce03f5c925ec8abf594fcf0cb57bdcb93149381415ff1f8198157332b0c76f3592065b7c3fdb35fca1 - languageName: node - linkType: hard - "jest-util@npm:^29.7.0": version: 29.7.0 resolution: "jest-util@npm:29.7.0" @@ -29666,20 +28765,6 @@ __metadata: languageName: node linkType: hard -"jest-validate@npm:30.0.0": - version: 30.0.0 - resolution: "jest-validate@npm:30.0.0" - dependencies: - "@jest/get-type": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - camelcase: "npm:^6.3.0" - chalk: "npm:^4.1.2" - leven: "npm:^3.1.0" - pretty-format: "npm:30.0.0" - checksum: 10/fb9eaaf888b2a4ba5e0c5fba0b0fa0259a5f73add06b600695a15079aedb1d3d94c987c13c8f9a1fdbd37cab46ff99982af4d241f6acf28067f42f39b609f7ab - languageName: node - linkType: hard - "jest-validate@npm:^29.7.0": version: 29.7.0 resolution: "jest-validate@npm:29.7.0" @@ -29694,22 +28779,6 @@ __metadata: languageName: node linkType: hard -"jest-watcher@npm:30.0.0": - version: 30.0.0 - resolution: "jest-watcher@npm:30.0.0" - dependencies: - "@jest/test-result": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - "@types/node": "npm:*" - ansi-escapes: "npm:^4.3.2" - chalk: "npm:^4.1.2" - emittery: "npm:^0.13.1" - jest-util: "npm:30.0.0" - string-length: "npm:^4.0.2" - checksum: 10/f8b9c9417adaac4bb7f44b8f0ec7d1a60b9c21855e3df2739d82a96a4f18de3846ee06072dd8a2e7108d77dc30a3184ce172076a64e55e0072ca37ccc69f57b3 - languageName: node - linkType: hard - "jest-watcher@npm:^29.7.0": version: 29.7.0 resolution: "jest-watcher@npm:29.7.0" @@ -29726,16 +28795,14 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:30.0.0": - version: 30.0.0 - resolution: "jest-worker@npm:30.0.0" +"jest-worker@npm:^27.4.5": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" dependencies: "@types/node": "npm:*" - "@ungap/structured-clone": "npm:^1.3.0" - jest-util: "npm:30.0.0" merge-stream: "npm:^2.0.0" - supports-color: "npm:^8.1.1" - checksum: 10/c124a964f79a72a99f5c1930e6144666b6993084ee57c3fd4e25bd2c71c2a2b77121de86238187d642380f13bd8505154bb6d48f3275afa13c07755329d99f1f + supports-color: "npm:^8.0.0" + checksum: 10/06c6e2a84591d9ede704d5022fc13791e8876e83397c89d481b0063332abbb64c0f01ef4ca7de520b35c7a1058556078d6bdc3631376f4e9ffb42316c1a8488e languageName: node linkType: hard @@ -29770,25 +28837,6 @@ __metadata: languageName: node linkType: hard -"jest@npm:^30.0.0-rc.1": - version: 30.0.0 - resolution: "jest@npm:30.0.0" - dependencies: - "@jest/core": "npm:30.0.0" - "@jest/types": "npm:30.0.0" - import-local: "npm:^3.2.0" - jest-cli: "npm:30.0.0" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: ./bin/jest.js - checksum: 10/87579cfce37b22d0a405fd9bc1372a4ae41ffa8390febbf4320b3e19331395af2dfc87ec5ee9f7a7e95469304c2f677d0593b547eda47f3ec5a3585f79ed6f31 - languageName: node - linkType: hard - "joycon@npm:^3.1.1": version: 3.1.1 resolution: "joycon@npm:3.1.1" @@ -29815,13 +28863,6 @@ __metadata: languageName: node linkType: hard -"js-sdsl@npm:4.3.0": - version: 4.3.0 - resolution: "js-sdsl@npm:4.3.0" - checksum: 10/2734a3929605502a0f494a72742e4f1ad949416a8735191cefcbae0c3eb618e8b9f8e32abfaebc79830f073420a8041a5f0ab171e0117019a91ce522f06a69fd - languageName: node - linkType: hard - "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -29829,18 +28870,14 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0, js-yaml@npm:~4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: "npm:^2.0.1" - bin: - js-yaml: bin/js-yaml.js - checksum: 10/c138a34a3fd0d08ebaf71273ad4465569a483b8a639e0b118ff65698d257c2791d3199e3f303631f2cb98213fa7b5f5d6a4621fd0fff819421b990d30d967140 +"js-tokens@npm:^9.0.1": + version: 9.0.1 + resolution: "js-tokens@npm:9.0.1" + checksum: 10/3288ba73bb2023adf59501979fb4890feb6669cc167b13771b226814fde96a1583de3989249880e3f4d674040d1815685db9a9880db9153307480d39dc760365 languageName: node linkType: hard -"js-yaml@npm:^3.10.0, js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.0": +"js-yaml@npm:3.14.1, js-yaml@npm:^3.10.0, js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.0": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" dependencies: @@ -29852,6 +28889,17 @@ __metadata: languageName: node linkType: hard +"js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0, js-yaml@npm:~4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10/c138a34a3fd0d08ebaf71273ad4465569a483b8a639e0b118ff65698d257c2791d3199e3f303631f2cb98213fa7b5f5d6a4621fd0fff819421b990d30d967140 + languageName: node + linkType: hard + "jsbn@npm:1.1.0": version: 1.1.0 resolution: "jsbn@npm:1.1.0" @@ -29900,39 +28948,6 @@ __metadata: languageName: node linkType: hard -"jsdom@npm:^26.1.0": - version: 26.1.0 - resolution: "jsdom@npm:26.1.0" - dependencies: - cssstyle: "npm:^4.2.1" - data-urls: "npm:^5.0.0" - decimal.js: "npm:^10.5.0" - html-encoding-sniffer: "npm:^4.0.0" - http-proxy-agent: "npm:^7.0.2" - https-proxy-agent: "npm:^7.0.6" - is-potential-custom-element-name: "npm:^1.0.1" - nwsapi: "npm:^2.2.16" - parse5: "npm:^7.2.1" - rrweb-cssom: "npm:^0.8.0" - saxes: "npm:^6.0.0" - symbol-tree: "npm:^3.2.4" - tough-cookie: "npm:^5.1.1" - w3c-xmlserializer: "npm:^5.0.0" - webidl-conversions: "npm:^7.0.0" - whatwg-encoding: "npm:^3.1.1" - whatwg-mimetype: "npm:^4.0.0" - whatwg-url: "npm:^14.1.1" - ws: "npm:^8.18.0" - xml-name-validator: "npm:^5.0.0" - peerDependencies: - canvas: ^3.0.0 - peerDependenciesMeta: - canvas: - optional: true - checksum: 10/39d78c4889cac20826393400dce1faed1666e9244fe0c8342a8f08c315375878e6be7fcfe339a33d6ff1a083bfe9e71b16d56ecf4d9a87db2da8c795925ea8c1 - languageName: node - linkType: hard - "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -29991,7 +29006,7 @@ __metadata: languageName: node linkType: hard -"json-parse-even-better-errors@npm:^2.3.0": +"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" checksum: 10/5f3a99009ed5f2a5a67d06e2f298cc97bc86d462034173308156f15b43a6e850be8511dc204b9b94566305da2947f7d90289657237d210351a39059ff9d666cf @@ -30294,7 +29309,7 @@ __metadata: languageName: node linkType: hard -"launch-editor@npm:^2.6.1": +"launch-editor@npm:^2.6.0, launch-editor@npm:^2.6.1": version: 2.10.0 resolution: "launch-editor@npm:2.10.0" dependencies: @@ -30635,7 +29650,7 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:~3.1.3": +"lilconfig@npm:^3.1.2, lilconfig@npm:~3.1.3": version: 3.1.3 resolution: "lilconfig@npm:3.1.3" checksum: 10/b932ce1af94985f0efbe8896e57b1f814a48c8dbd7fc0ef8469785c6303ed29d0090af3ccad7e36b626bfca3a4dc56cc262697e9a8dd867623cf09a39d54e4c3 @@ -30817,7 +29832,14 @@ __metadata: languageName: node linkType: hard -"loader-utils@npm:^2.0.0": +"loader-runner@npm:^4.2.0": + version: 4.3.0 + resolution: "loader-runner@npm:4.3.0" + checksum: 10/555ae002869c1e8942a0efd29a99b50a0ce6c3296efea95caf48f00d7f6f7f659203ed6613688b6181aa81dc76de3e65ece43094c6dffef3127fe1a84d973cd3 + languageName: node + linkType: hard + +"loader-utils@npm:^2.0.0, loader-utils@npm:^2.0.4": version: 2.0.4 resolution: "loader-utils@npm:2.0.4" dependencies: @@ -31059,7 +30081,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:4, lodash@npm:4.17.21, lodash@npm:^4.0.1, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.17.5, lodash@npm:^4.3.0, lodash@npm:~4.17.21": +"lodash@npm:4, lodash@npm:4.17.21, lodash@npm:^4.0.1, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.17.5, lodash@npm:^4.3.0, lodash@npm:~4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: 10/c08619c038846ea6ac754abd6dd29d2568aa705feb69339e836dfa8d8b09abbb2f859371e86863eda41848221f9af43714491467b5b0299122431e202bb0c532 @@ -31155,6 +30177,13 @@ __metadata: languageName: node linkType: hard +"loupe@npm:^3.1.0, loupe@npm:^3.1.4": + version: 3.2.1 + resolution: "loupe@npm:3.2.1" + checksum: 10/a4d78ec758aaa04e0e35d5cd1c15e970beb9cdbfd3d0f34f98b9bcda489f896a7190b3b6cc40b7a6dcb8e97e82e96eafaae10096aaa469804acdba6f7c2bde5f + languageName: node + linkType: hard + "lowdb@npm:1.0.0": version: 1.0.0 resolution: "lowdb@npm:1.0.0" @@ -31168,6 +30197,15 @@ __metadata: languageName: node linkType: hard +"lower-case@npm:^2.0.2": + version: 2.0.2 + resolution: "lower-case@npm:2.0.2" + dependencies: + tslib: "npm:^2.0.3" + checksum: 10/83a0a5f159ad7614bee8bf976b96275f3954335a84fad2696927f609ddae902802c4f3312d86668722e668bef41400254807e1d3a7f2e8c3eede79691aa1f010 + languageName: node + linkType: hard + "lowercase-keys@npm:^2.0.0": version: 2.0.0 resolution: "lowercase-keys@npm:2.0.0" @@ -31189,13 +30227,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.4.3": - version: 10.4.3 - resolution: "lru-cache@npm:10.4.3" - checksum: 10/e6e90267360476720fa8e83cc168aa2bf0311f3f2eea20a6ba78b90a885ae72071d9db132f40fda4129c803e7dcec3a6b6a6fbb44ca90b081630b810b5d6a41a - languageName: node - linkType: hard - "lru-cache@npm:^11.0.0": version: 11.0.2 resolution: "lru-cache@npm:11.0.2" @@ -31244,6 +30275,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.17": + version: 0.30.18 + resolution: "magic-string@npm:0.30.18" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + checksum: 10/dd180f174cfe066f501dc700ec58815eae3cbde402308f3326574bad09a5ff9c9c5b6fc71502e9d1c663254614fe21679c6360cd39aaeedd2cee1b40e14669f2 + languageName: node + linkType: hard + "make-dir@npm:4.0.0": version: 4.0.0 resolution: "make-dir@npm:4.0.0" @@ -31281,7 +30321,7 @@ __metadata: languageName: node linkType: hard -"make-error@npm:^1.1.1, make-error@npm:^1.3.6": +"make-error@npm:^1.1.1": version: 1.3.6 resolution: "make-error@npm:1.3.6" checksum: 10/b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 @@ -31495,6 +30535,20 @@ __metadata: languageName: node linkType: hard +"mdn-data@npm:2.0.28": + version: 2.0.28 + resolution: "mdn-data@npm:2.0.28" + checksum: 10/aec475e0c078af00498ce2f9434d96a1fdebba9814d14b8f72cd6d5475293f4b3972d0538af2d5c5053d35e1b964af08b7d162b98e9846e9343990b75e4baef1 + languageName: node + linkType: hard + +"mdn-data@npm:2.0.30": + version: 2.0.30 + resolution: "mdn-data@npm:2.0.30" + checksum: 10/e4944322bf3e0461a2daa2aee7e14e208960a036289531e4ef009e53d32bd41528350c070c4a33be867980443fe4c0523518d99318423cffa7c825fe7b1154e2 + languageName: node + linkType: hard + "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -31532,6 +30586,15 @@ __metadata: languageName: node linkType: hard +"memfs@npm:^3.4.1, memfs@npm:^3.4.3": + version: 3.5.3 + resolution: "memfs@npm:3.5.3" + dependencies: + fs-monkey: "npm:^1.0.4" + checksum: 10/7c9cdb453a6b06e87f11e2dbe6c518fd3c1c1581b370ffa24f42f3fd5b1db8c2203f596e43321a0032963f3e9b66400f2c3cf043904ac496d6ae33eafd0878fe + languageName: node + linkType: hard + "memfs@npm:^4.14.0": version: 4.17.0 resolution: "memfs@npm:4.17.0" @@ -31639,7 +30702,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -31724,6 +30787,17 @@ __metadata: languageName: node linkType: hard +"mini-css-extract-plugin@npm:2.4.5": + version: 2.4.5 + resolution: "mini-css-extract-plugin@npm:2.4.5" + dependencies: + schema-utils: "npm:^4.0.0" + peerDependencies: + webpack: ^5.0.0 + checksum: 10/abed70be4f7b74975d953ae385faa3b92973b7f89254366d6699a4442c283b5a6feab84a6bdc7406a883ff05846093114a4aee4b83a69be555fa59c7e73843ef + languageName: node + linkType: hard + "minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": version: 1.0.1 resolution: "minimalistic-assert@npm:1.0.1" @@ -32071,45 +31145,6 @@ __metadata: languageName: node linkType: hard -"mqtt-packet@npm:^9.0.2": - version: 9.0.2 - resolution: "mqtt-packet@npm:9.0.2" - dependencies: - bl: "npm:^6.0.8" - debug: "npm:^4.3.4" - process-nextick-args: "npm:^2.0.1" - checksum: 10/9350c182873e0ecc2620475d546c7e9e7e4dedda3157bef037a04cb95eb1a9e5ec4f1f5f7e13ce6cd8a0ec212d63177d55a6394eed56d423bcdd2d8c2b51694f - languageName: node - linkType: hard - -"mqtt@npm:^5.10.3": - version: 5.14.0 - resolution: "mqtt@npm:5.14.0" - dependencies: - "@types/readable-stream": "npm:^4.0.21" - "@types/ws": "npm:^8.18.1" - commist: "npm:^3.2.0" - concat-stream: "npm:^2.0.0" - debug: "npm:^4.4.1" - help-me: "npm:^5.0.0" - lru-cache: "npm:^10.4.3" - minimist: "npm:^1.2.8" - mqtt-packet: "npm:^9.0.2" - number-allocator: "npm:^1.0.14" - readable-stream: "npm:^4.7.0" - rfdc: "npm:^1.4.1" - socks: "npm:^2.8.6" - split2: "npm:^4.2.0" - worker-timers: "npm:^8.0.23" - ws: "npm:^8.18.3" - bin: - mqtt: build/bin/mqtt.js - mqtt_pub: build/bin/pub.js - mqtt_sub: build/bin/sub.js - checksum: 10/c6abc305eb91725f8c05a7006dc65c6c65149408a3d3b34576d28da876b544d0c1c7a0d1a523ef1cd8786e2922f6129105129e011142f7401c25622b305d4768 - languageName: node - linkType: hard - "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -32177,13 +31212,6 @@ __metadata: languageName: node linkType: hard -"mute-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "mute-stream@npm:2.0.0" - checksum: 10/d2e4fd2f5aa342b89b98134a8d899d8ef9b0a6d69274c4af9df46faa2d97aeb1f2ce83d867880d6de63643c52386579b99139801e24e7526c3b9b0a6d1e18d6c - languageName: node - linkType: hard - "mute-stream@npm:~1.0.0": version: 1.0.0 resolution: "mute-stream@npm:1.0.0" @@ -32207,15 +31235,6 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.11": - version: 3.3.11 - resolution: "nanoid@npm:3.3.11" - bin: - nanoid: bin/nanoid.cjs - checksum: 10/73b5afe5975a307aaa3c95dfe3334c52cdf9ae71518176895229b8d65ab0d1c0417dd081426134eb7571c055720428ea5d57c645138161e7d10df80815527c48 - languageName: node - linkType: hard - "napi-build-utils@npm:^1.0.1": version: 1.0.2 resolution: "napi-build-utils@npm:1.0.2" @@ -32230,15 +31249,6 @@ __metadata: languageName: node linkType: hard -"napi-postinstall@npm:^0.2.2": - version: 0.2.4 - resolution: "napi-postinstall@npm:0.2.4" - bin: - napi-postinstall: lib/cli.js - checksum: 10/286785f884b872102fb284847ecc693101f70126b1fc7a97e19293929ce7f08802b41f89398015cce0797070ea3ce6871939a3c1e693c04cf594f7939dbe8cfb - languageName: node - linkType: hard - "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -32328,6 +31338,16 @@ __metadata: languageName: node linkType: hard +"no-case@npm:^3.0.4": + version: 3.0.4 + resolution: "no-case@npm:3.0.4" + dependencies: + lower-case: "npm:^2.0.2" + tslib: "npm:^2.0.3" + checksum: 10/0b2ebc113dfcf737d48dde49cfebf3ad2d82a8c3188e7100c6f375e30eafbef9e9124aadc3becef237b042fd5eb0aad2fd78669c20972d045bbe7fea8ba0be5c + languageName: node + linkType: hard + "node-abi@npm:^3.3.0": version: 3.51.0 resolution: "node-abi@npm:3.51.0" @@ -32337,6 +31357,13 @@ __metadata: languageName: node linkType: hard +"node-abort-controller@npm:^3.0.1": + version: 3.1.1 + resolution: "node-abort-controller@npm:3.1.1" + checksum: 10/0a2cdb7ec0aeaf3cb31e1ca0e192f5add48f1c5c9c9ed822129f9dddbd9432f69b7425982f94ce803c56a2104884530aa67cd57696e5774b2e5b8ec2f58de042 + languageName: node + linkType: hard + "node-addon-api@npm:^6.1.0": version: 6.1.0 resolution: "node-addon-api@npm:6.1.0" @@ -32369,7 +31396,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.7, node-fetch@npm:^2.7.0": +"node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.7": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -32850,13 +31877,15 @@ __metadata: languageName: node linkType: hard -"number-allocator@npm:^1.0.14": - version: 1.0.14 - resolution: "number-allocator@npm:1.0.14" +"null-loader@npm:^4.0.1": + version: 4.0.1 + resolution: "null-loader@npm:4.0.1" dependencies: - debug: "npm:^4.3.1" - js-sdsl: "npm:4.3.0" - checksum: 10/e6ea60f843c95864d762c0db4d856bfe77d764fa6c3ca84adb23b5c6aacded0ec66a76093e4ac19bc5913532b1bc40e1296e154608e87350c4408f5bcb9e4623 + loader-utils: "npm:^2.0.0" + schema-utils: "npm:^3.0.0" + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 10/eeb4c4dd2f8f41e46f5665e4500359109e95ec1028a178a60e0161984906572da7dd87644bcc3cb29f0125d77e2b2508fb4f3813cfb1c6604a15865beb4b987b languageName: node linkType: hard @@ -32874,13 +31903,6 @@ __metadata: languageName: node linkType: hard -"nwsapi@npm:^2.2.16": - version: 2.2.20 - resolution: "nwsapi@npm:2.2.20" - checksum: 10/3dbfbd64c10dfd1edaf4992a6e859af306ec22846b86da2b31e69a743a8b4d7ac3b6ca767dbf248dabea8652905e402d6986f8ba491852e8568e334ec22e1882 - languageName: node - linkType: hard - "nx@npm:18.2.1, nx@npm:>=17.1.2 < 19": version: 18.2.1 resolution: "nx@npm:18.2.1" @@ -33201,6 +32223,17 @@ __metadata: languageName: node linkType: hard +"open@npm:^8.0.9, open@npm:^8.4.2": + version: 8.4.2 + resolution: "open@npm:8.4.2" + dependencies: + define-lazy-prop: "npm:^2.0.0" + is-docker: "npm:^2.1.1" + is-wsl: "npm:^2.2.0" + checksum: 10/acd81a1d19879c818acb3af2d2e8e9d81d17b5367561e623248133deb7dd3aefaed527531df2677d3e6aaf0199f84df57b6b2262babff8bf46ea0029aac536c9 + languageName: node + linkType: hard + "open@npm:^8.4.0": version: 8.4.0 resolution: "open@npm:8.4.0" @@ -33244,7 +32277,7 @@ __metadata: languageName: node linkType: hard -"ora@npm:4.1.1": +"ora@npm:4.1.1, ora@npm:^4.1.1": version: 4.1.1 resolution: "ora@npm:4.1.1" dependencies: @@ -33483,7 +32516,7 @@ __metadata: languageName: node linkType: hard -"p-retry@npm:^4.6.2": +"p-retry@npm:^4.5.0, p-retry@npm:^4.6.2": version: 4.6.2 resolution: "p-retry@npm:4.6.2" dependencies: @@ -33670,6 +32703,16 @@ __metadata: languageName: node linkType: hard +"param-case@npm:^3.0.4": + version: 3.0.4 + resolution: "param-case@npm:3.0.4" + dependencies: + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10/b34227fd0f794e078776eb3aa6247442056cb47761e9cd2c4c881c86d84c64205f6a56ef0d70b41ee7d77da02c3f4ed2f88e3896a8fefe08bdfb4deca037c687 + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -33783,15 +32826,6 @@ __metadata: languageName: node linkType: hard -"parse5@npm:^7.2.1": - version: 7.3.0 - resolution: "parse5@npm:7.3.0" - dependencies: - entities: "npm:^6.0.0" - checksum: 10/b0e48be20b820c655b138b86fa6fb3a790de6c891aa2aba536524f8027b4dca4fe538f11a0e5cf2f6f847d120dbb9e4822dcaeb933ff1e10850a2ef0154d1d88 - languageName: node - linkType: hard - "parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -33799,6 +32833,16 @@ __metadata: languageName: node linkType: hard +"pascal-case@npm:^3.1.2": + version: 3.1.2 + resolution: "pascal-case@npm:3.1.2" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10/ba98bfd595fc91ef3d30f4243b1aee2f6ec41c53b4546bfa3039487c367abaa182471dcfc830a1f9e1a0df00c14a370514fa2b3a1aacc68b15a460c31116873e + languageName: node + linkType: hard + "path-browserify@npm:^1.0.1": version: 1.0.1 resolution: "path-browserify@npm:1.0.1" @@ -33929,6 +32973,20 @@ __metadata: languageName: node linkType: hard +"pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10/01e9a69928f39087d96e1751ce7d6d50da8c39abf9a12e0ac2389c42c83bc76f78c45a475bd9026a02e6a6f79be63acc75667df855862fe567d99a00a540d23d + languageName: node + linkType: hard + +"pathval@npm:^2.0.0": + version: 2.0.1 + resolution: "pathval@npm:2.0.1" + checksum: 10/f5e8b82f6b988a5bba197970af050268fd800780d0f9ee026e6f0b544ac4b17ab52bebeabccb790d63a794530a1641ae399ad07ecfc67ad337504c85dc9e5693 + languageName: node + linkType: hard + "pbkdf2@npm:^3.0.3, pbkdf2@npm:^3.1.2": version: 3.1.2 resolution: "pbkdf2@npm:3.1.2" @@ -34002,6 +33060,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.3": + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 10/57b99055f40b16798f2802916d9c17e9744e620a0db136554af01d19598b96e45e2f00014c91d1b8b13874b80caa8c295b3d589a3f72373ec4aaf54baa5962d5 + languageName: node + linkType: hard + "pidtree@npm:~0.6.0": version: 0.6.0 resolution: "pidtree@npm:0.6.0" @@ -34217,13 +33282,6 @@ __metadata: languageName: node linkType: hard -"pirates@npm:^4.0.7": - version: 4.0.7 - resolution: "pirates@npm:4.0.7" - checksum: 10/2427f371366081ae42feb58214f04805d6b41d6b84d74480ebcc9e0ddbd7105a139f7c653daeaf83ad8a1a77214cf07f64178e76de048128fec501eab3305a96 - languageName: node - linkType: hard - "pixelmatch@npm:^5.1.0": version: 5.3.0 resolution: "pixelmatch@npm:5.3.0" @@ -34461,6 +33519,18 @@ __metadata: languageName: node linkType: hard +"postcss-calc@npm:^10.0.2": + version: 10.0.2 + resolution: "postcss-calc@npm:10.0.2" + dependencies: + postcss-selector-parser: "npm:^6.1.2" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.38 + checksum: 10/12d497e632b4a12f7d33507ed6f74db2dd01f9b9cc1f9986271af16b118d25f959dc255777a91d742e0431f400a90b8540d00533fc0513f34c1840a491cf2bee + languageName: node + linkType: hard + "postcss-clamp@npm:^4.1.0": version: 4.1.0 resolution: "postcss-clamp@npm:4.1.0" @@ -34511,6 +33581,32 @@ __metadata: languageName: node linkType: hard +"postcss-colormin@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-colormin@npm:7.0.2" + dependencies: + browserslist: "npm:^4.23.3" + caniuse-api: "npm:^3.0.0" + colord: "npm:^2.9.3" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/cb83d95d21668c770e5268f50ec6f8cd5d991d65123bafd3aa4a697580609c62d0078e704c4b7820db57638bf386084b253885b1e86263f580e8a393a687e973 + languageName: node + linkType: hard + +"postcss-convert-values@npm:^7.0.4": + version: 7.0.4 + resolution: "postcss-convert-values@npm:7.0.4" + dependencies: + browserslist: "npm:^4.23.3" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/077481cc98514965acf335cdacae4f604be86f4153ed3bcfdd2c4c54058182d0b472f859931d55d9aeb01600f08fff6a88a21539adbb6169019fda8b22f064ef + languageName: node + linkType: hard + "postcss-custom-media@npm:^10.0.3": version: 10.0.4 resolution: "postcss-custom-media@npm:10.0.4" @@ -34565,6 +33661,44 @@ __metadata: languageName: node linkType: hard +"postcss-discard-comments@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-discard-comments@npm:7.0.3" + dependencies: + postcss-selector-parser: "npm:^6.1.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/f7c994df0d2de75d876f0db7ebd5b63718ef7ee5336a35f5f753f8ea115ecf8be26d5d2ad8800e833f18b33da6e018af82de7b5f0aa69e6338d3e0aff46348d4 + languageName: node + linkType: hard + +"postcss-discard-duplicates@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-discard-duplicates@npm:7.0.1" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/0c757bb542caf017740157a2e29186ae83085bb42cd8e5ea3649fa039cc3d505ccaca739b1aed6c89e1f0a7f18440f77c3f49e4b99f45efd767c863d6647af94 + languageName: node + linkType: hard + +"postcss-discard-empty@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-discard-empty@npm:7.0.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/0c5cea198057727765855dbb43b5f16bd4d7da8c783fea8d18ad445ad3457681a7bc1696fda6bf16313e6fadaf86d519470aff68f02378b8b413e60023b70d57 + languageName: node + linkType: hard + +"postcss-discard-overridden@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-discard-overridden@npm:7.0.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/e41c448305f96a93ec97a4a8ce2932a123283898041ff38ed2f7a35fcb76d937f448c2c8efb7d74d53d38b4ebf9163ae12935297bb99baec2f6751776b0ea29b + languageName: node + linkType: hard + "postcss-double-position-gradients@npm:^5.0.4": version: 5.0.5 resolution: "postcss-double-position-gradients@npm:5.0.5" @@ -34679,6 +33813,81 @@ __metadata: languageName: node linkType: hard +"postcss-merge-longhand@npm:^7.0.4": + version: 7.0.4 + resolution: "postcss-merge-longhand@npm:7.0.4" + dependencies: + postcss-value-parser: "npm:^4.2.0" + stylehacks: "npm:^7.0.4" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/b94b98a9b21bc8671aa0fba96491e8e2deea57c9bbfe9a74305400a36035b63764d8bfbdc6bda047887b665b92b91361a8bbc1cb9c14f80b3792feef19881005 + languageName: node + linkType: hard + +"postcss-merge-rules@npm:^7.0.4": + version: 7.0.4 + resolution: "postcss-merge-rules@npm:7.0.4" + dependencies: + browserslist: "npm:^4.23.3" + caniuse-api: "npm:^3.0.0" + cssnano-utils: "npm:^5.0.0" + postcss-selector-parser: "npm:^6.1.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/f67a4f6e814c5e7ce990a3c3d699e1c1dba7e79c5cb3a11795534d47b0fa257d27465e248546b45104d8278dfcbd07d9fbceb8046fcdfac86fe6340ca3c85f9a + languageName: node + linkType: hard + +"postcss-minify-font-values@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-minify-font-values@npm:7.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/8578c1d1d4d65ca34db5ac0cccc7b73500040e52a3abb8abc7e5b6e47e5f72c88bfe5f3b19847556a2a68082245009d693a7c098b8bc58e7f9640abba4e80194 + languageName: node + linkType: hard + +"postcss-minify-gradients@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-minify-gradients@npm:7.0.0" + dependencies: + colord: "npm:^2.9.3" + cssnano-utils: "npm:^5.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/9649e255ad954e67e0d7c2111b0f1681a93e8cba7179a547491eacf135d64596dfee9774b589d7a46ee3ace673a026113e56e734d6ab19297367f11dd3104c0e + languageName: node + linkType: hard + +"postcss-minify-params@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-minify-params@npm:7.0.2" + dependencies: + browserslist: "npm:^4.23.3" + cssnano-utils: "npm:^5.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/26b6ce4db3cdefcceb7a00b64dfbd27dee4194b55708937dddd5c4000c1f02013dc0659e62e799dc1ce1f1a697961cec55a2a746a4f59d54ccae4b68adf41768 + languageName: node + linkType: hard + +"postcss-minify-selectors@npm:^7.0.4": + version: 7.0.4 + resolution: "postcss-minify-selectors@npm:7.0.4" + dependencies: + cssesc: "npm:^3.0.0" + postcss-selector-parser: "npm:^6.1.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/54c74dcb098819417e95ec2b5ecdd33a2c6fdccea2346e110037c762d37644e11f83d67e6b0c93405f2b7cc28880ca0a07ad4d6618330436f7b8b84d719b85fb + languageName: node + linkType: hard + "postcss-modules-extract-imports@npm:^3.0.0": version: 3.0.0 resolution: "postcss-modules-extract-imports@npm:3.0.0" @@ -34736,6 +33945,104 @@ __metadata: languageName: node linkType: hard +"postcss-normalize-charset@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-normalize-charset@npm:7.0.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/a41043fb81a1d5b3b05e8b317de7fe123854a4535f9ce2904a16196a32b3565d2fd6ac59a9842e337cf1bb298dcc108cbdbc6a5d4a500aec3520d759e951a8de + languageName: node + linkType: hard + +"postcss-normalize-display-values@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-normalize-display-values@npm:7.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/55bbfb4dac3bf9bcc2aed30057c0bc968927b5337b372ee2dd825d6ec626c18d1481b0e8dd928d4cab70c3e8a2e6708d6115b14bebd34fe4462eb15aacff35f4 + languageName: node + linkType: hard + +"postcss-normalize-positions@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-normalize-positions@npm:7.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/a6b982e567ddf1ad4120aaf898056f2fdbe5f6cae1d475fef22cb1f025c9bfe37df5511a4353b9f13d01feae8b1d9638c1deb70537058312262647052d004f64 + languageName: node + linkType: hard + +"postcss-normalize-repeat-style@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-normalize-repeat-style@npm:7.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/f8ef8cf5ac6232f1d0615a97f21ea464a6930484b58421c87e0f9e626b1bb52916592f25e4f9874f424b1529807b170d8805d45878aa8293ea0608dd753230c8 + languageName: node + linkType: hard + +"postcss-normalize-string@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-normalize-string@npm:7.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/23ea7dd7b28880dfafd0880ab782d65186ab94a4cf789b8723f9666020c7f7c8b97546e0dc46d08da3f71a873bb6db41cd69a4cafb4fde4a85f97ef83ee38bae + languageName: node + linkType: hard + +"postcss-normalize-timing-functions@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-normalize-timing-functions@npm:7.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/f85870b3c8132b530fb8e5c8474f1eea1d0ef69a374d5867d0300f7501803bffa55f7fad34f662d88a747ce73d552ec0f818722d2d5157cf8e5dc45a98fa552b + languageName: node + linkType: hard + +"postcss-normalize-unicode@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-normalize-unicode@npm:7.0.2" + dependencies: + browserslist: "npm:^4.23.3" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/cb342f7507f28c8e9c500a2d6369c6b04a85f6c6f93aaa1ab6768d0e097453480834d3f7c5fad503f9fb9e178d9011df50ceaeebe2ac68d5daaa7c8a63ad3b3f + languageName: node + linkType: hard + +"postcss-normalize-url@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-normalize-url@npm:7.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/c5edca0646a13d76c5347fffaaa828184e035486d7eeb2a8b31781d30de6a90f7ad3f0cffe59e8fd4c31f1525fdb85b45777745685603ac533a151c42691f601 + languageName: node + linkType: hard + +"postcss-normalize-whitespace@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-normalize-whitespace@npm:7.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/c409362e3256ed66629fc48c63e834c9bfb598ca20587adb620bbc04fdccef4cd0d08b1f485eb8290d6a30e8dd836fecb0def38c3a49fe8503e2579e60f5bccf + languageName: node + linkType: hard + "postcss-normalize@npm:10.0.1": version: 10.0.1 resolution: "postcss-normalize@npm:10.0.1" @@ -34759,6 +34066,18 @@ __metadata: languageName: node linkType: hard +"postcss-ordered-values@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-ordered-values@npm:7.0.1" + dependencies: + cssnano-utils: "npm:^5.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/048082c09eee021d97def02eb8fc03fb0414402b1f6925af29a862f537b66b43d7a8e8d94c552ca67cd6172230873260f4ad44f1d5bac81c553afb054d80e6a8 + languageName: node + linkType: hard + "postcss-overflow-shorthand@npm:^5.0.1": version: 5.0.1 resolution: "postcss-overflow-shorthand@npm:5.0.1" @@ -34871,6 +34190,29 @@ __metadata: languageName: node linkType: hard +"postcss-reduce-initial@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-reduce-initial@npm:7.0.2" + dependencies: + browserslist: "npm:^4.23.3" + caniuse-api: "npm:^3.0.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/5a8260cbf7fa6ea12908debe23e191bb45109b29048d15e63c60df42c4ed62c860273ce9b37172d5f31c4bdb965e984962e4e6f506939a1fc49202dd7bf520c5 + languageName: node + linkType: hard + +"postcss-reduce-transforms@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-reduce-transforms@npm:7.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/1c369a1be820a80e8bf06376476190fe2ae5a0b5a7459257d7d9b5bc0c9aed79f46026e8558fca088f7a814e632c678f67749b246901a3839f2d50b7b9ec2d41 + languageName: node + linkType: hard + "postcss-replace-overflow-wrap@npm:^4.0.0": version: 4.0.0 resolution: "postcss-replace-overflow-wrap@npm:4.0.0" @@ -34911,6 +34253,39 @@ __metadata: languageName: node linkType: hard +"postcss-selector-parser@npm:^6.1.2": + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10/190034c94d809c115cd2f32ee6aade84e933450a43ec3899c3e78e7d7b33efd3a2a975bb45d7700b6c5b196c06a7d9acf3f1ba6f1d87032d9675a29d8bca1dd3 + languageName: node + linkType: hard + +"postcss-svgo@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-svgo@npm:7.0.1" + dependencies: + postcss-value-parser: "npm:^4.2.0" + svgo: "npm:^3.3.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/4196d9b7ec37ea7c427b6d3d40fa75bdae6d1fdf5a814481202138fb9b074ecc1e442b8e0202aa8c76eaaff747e2f6bfec968cfe7bc774d8a58faf8bd945ff4e + languageName: node + linkType: hard + +"postcss-unique-selectors@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-unique-selectors@npm:7.0.3" + dependencies: + postcss-selector-parser: "npm:^6.1.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/c38ca6b5f539cae1e0e8ef0efa338f91e4e054dbd9c619e26708d787e94ce788739bbe782103f2cf35c38819233897901038292255a1726905bd04433ac9e5f2 + languageName: node + linkType: hard + "postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": version: 4.2.0 resolution: "postcss-value-parser@npm:4.2.0" @@ -35053,14 +34428,13 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:30.0.0": - version: 30.0.0 - resolution: "pretty-format@npm:30.0.0" +"pretty-error@npm:^4.0.0": + version: 4.0.0 + resolution: "pretty-error@npm:4.0.0" dependencies: - "@jest/schemas": "npm:30.0.0" - ansi-styles: "npm:^5.2.0" - react-is: "npm:^18.3.1" - checksum: 10/3a02da797b5449d1095d08a02d2909841cfcd8eaf9181c1076412407899b83c68324dc371ea5e34113a72d1ffd7469401288b6d9f5cd5c2baac1b372dcb33f3a + lodash: "npm:^4.17.20" + renderkid: "npm:^3.0.0" + checksum: 10/0212ad8742f8bb6f412f95b07d7f6874c55514ac4384f4f7de0defe77e767cca99f667c2316529f62a041fa654194a99c1ee7e321e1b7f794b5cc700777634d6 languageName: node linkType: hard @@ -35075,7 +34449,18 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": +"pretty-format@npm:^29.5.0": + version: 29.5.0 + resolution: "pretty-format@npm:29.5.0" + dependencies: + "@jest/schemas": "npm:^29.4.3" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^18.0.0" + checksum: 10/b025cb1d2bf27b8dc338792b208811b196828ccf590a87014d9ac9406eb809324ef56151ba41d489c8a67fed94cdacc94ca003380c2795233e117a5874b2566b + languageName: node + linkType: hard + +"pretty-format@npm:^29.7.0": version: 29.7.0 resolution: "pretty-format@npm:29.7.0" dependencies: @@ -35086,14 +34471,10 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.5.0": - version: 29.5.0 - resolution: "pretty-format@npm:29.5.0" - dependencies: - "@jest/schemas": "npm:^29.4.3" - ansi-styles: "npm:^5.0.0" - react-is: "npm:^18.0.0" - checksum: 10/b025cb1d2bf27b8dc338792b208811b196828ccf590a87014d9ac9406eb809324ef56151ba41d489c8a67fed94cdacc94ca003380c2795233e117a5874b2566b +"pretty-time@npm:^1.1.0": + version: 1.1.0 + resolution: "pretty-time@npm:1.1.0" + checksum: 10/ed5783ea5225680672c53ff104343256037a0e2296387d2f71afecce9e10e83f9131291e6809d4405c0dc25c53f2949dce0233349589762ca499e380d3df2f8a languageName: node linkType: hard @@ -35118,7 +34499,7 @@ __metadata: languageName: node linkType: hard -"process-nextick-args@npm:^2.0.1, process-nextick-args@npm:~2.0.0": +"process-nextick-args@npm:~2.0.0": version: 2.0.1 resolution: "process-nextick-args@npm:2.0.1" checksum: 10/1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf @@ -35390,6 +34771,13 @@ __metadata: languageName: node linkType: hard +"punycode@npm:^1.4.1": + version: 1.4.1 + resolution: "punycode@npm:1.4.1" + checksum: 10/af2700dde1a116791ff8301348ff344c47d6c224e875057237d1b5112035655fb07a6175cfdb8bf0e3a8cdfd2dc82b3a622e0aefd605566c0e949a6d0d1256a4 + languageName: node + linkType: hard + "punycode@npm:^2.1.0, punycode@npm:^2.1.1": version: 2.3.0 resolution: "punycode@npm:2.3.0" @@ -35425,13 +34813,6 @@ __metadata: languageName: node linkType: hard -"pure-rand@npm:^7.0.0": - version: 7.0.1 - resolution: "pure-rand@npm:7.0.1" - checksum: 10/c61a576fda5032ec9763ecb000da4a8f19263b9e2f9ae9aa2759c8fbd9dc6b192b2ce78391ebd41abb394a5fedb7bcc4b03c9e6141ac8ab20882dd5717698b80 - languageName: node - linkType: hard - "pvtsutils@npm:^1.1.2, pvtsutils@npm:^1.3.2": version: 1.3.2 resolution: "pvtsutils@npm:1.3.2" @@ -35471,7 +34852,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.13.1": +"qs@npm:6.13.1, qs@npm:^6.12.3": version: 6.13.1 resolution: "qs@npm:6.13.1" dependencies: @@ -35531,7 +34912,7 @@ __metadata: languageName: node linkType: hard -"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5": +"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" dependencies: @@ -35956,7 +35337,7 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^18.2.0, react-is@npm:^18.3.1": +"react-is@npm:^18.2.0": version: 18.3.1 resolution: "react-is@npm:18.3.1" checksum: 10/d5f60c87d285af24b1e1e7eaeb123ec256c3c8bdea7061ab3932e3e14685708221bf234ec50b21e10dd07f008f1b966a2730a0ce4ff67905b3872ff2042aec22 @@ -36393,7 +35774,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^4.2.0, readable-stream@npm:^4.5.2, readable-stream@npm:^4.7.0": +"readable-stream@npm:^4.5.2": version: 4.7.0 resolution: "readable-stream@npm:4.7.0" dependencies: @@ -36415,13 +35796,6 @@ __metadata: languageName: node linkType: hard -"readdirp@npm:^4.0.1": - version: 4.1.2 - resolution: "readdirp@npm:4.1.2" - checksum: 10/7b817c265940dba90bb9c94d82920d76c3a35ea2d67f9f9d8bd936adcfe02d50c802b14be3dd2e725e002dddbe2cc1c7a0edfb1bc3a365c9dfd5a61e612eea1e - languageName: node - linkType: hard - "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -36537,13 +35911,6 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.14.1": - version: 0.14.1 - resolution: "regenerator-runtime@npm:0.14.1" - checksum: 10/5db3161abb311eef8c45bcf6565f4f378f785900ed3945acf740a9888c792f75b98ecb77f0775f3bf95502ff423529d23e94f41d80c8256e8fa05ed4b07cf471 - languageName: node - linkType: hard - "regenerator-transform@npm:^0.15.2": version: 0.15.2 resolution: "regenerator-transform@npm:0.15.2" @@ -36553,6 +35920,13 @@ __metadata: languageName: node linkType: hard +"regex-parser@npm:^2.2.11": + version: 2.2.11 + resolution: "regex-parser@npm:2.2.11" + checksum: 10/78200331ec0cc372302d287a4946c38681eb5fe435453fca572cb53cac0ba579e5eb3b9e25eac24c0c80a555fb3ea7a637814a35da1e9bc88e8819110ae5de24 + languageName: node + linkType: hard + "regexp.prototype.flags@npm:^1.4.3": version: 1.4.3 resolution: "regexp.prototype.flags@npm:1.4.3" @@ -36685,6 +36059,13 @@ __metadata: languageName: node linkType: hard +"relateurl@npm:^0.2.7": + version: 0.2.7 + resolution: "relateurl@npm:0.2.7" + checksum: 10/f5d6ba58f2a5d5076389090600c243a0ba7072bcf347490a09e4241e2427ccdb260b4e22cea7be4f1fcd3c2bf05908b1e0d0bc9605e3199d4ecf37af1d5681fa + languageName: node + linkType: hard + "relative-require-regex@npm:^1.0.1": version: 1.0.1 resolution: "relative-require-regex@npm:1.0.1" @@ -36692,6 +36073,19 @@ __metadata: languageName: node linkType: hard +"renderkid@npm:^3.0.0": + version: 3.0.0 + resolution: "renderkid@npm:3.0.0" + dependencies: + css-select: "npm:^4.1.3" + dom-converter: "npm:^0.2.0" + htmlparser2: "npm:^6.1.0" + lodash: "npm:^4.17.21" + strip-ansi: "npm:^6.0.1" + checksum: 10/434bd56d9930dd344bcba3ef7683f3dd893396b6bc7e8caa551a4cacbe75a9466dc6cf3d75bc324a5979278a73ef968d7854f8f660dbf1a52c38a73f1fb59b20 + languageName: node + linkType: hard + "repeat-string@npm:^1.6.1": version: 1.6.1 resolution: "repeat-string@npm:1.6.1" @@ -36843,6 +36237,19 @@ __metadata: languageName: node linkType: hard +"resolve-url-loader@npm:5.0.0": + version: 5.0.0 + resolution: "resolve-url-loader@npm:5.0.0" + dependencies: + adjust-sourcemap-loader: "npm:^4.0.0" + convert-source-map: "npm:^1.7.0" + loader-utils: "npm:^2.0.0" + postcss: "npm:^8.2.14" + source-map: "npm:0.6.1" + checksum: 10/fb013845b49d4214995536471d0d7ee6a45208e6902e61d270ae0b7c77bf51800c8bd2671aabc6a0ad6a5a9fbe224142a5e23b7016a76a16b1e2748405581cb0 + languageName: node + linkType: hard + "resolve.exports@npm:^2.0.0": version: 2.0.2 resolution: "resolve.exports@npm:2.0.2" @@ -36863,7 +36270,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.22.10, resolve@npm:^1.22.2, resolve@npm:^1.22.4": +"resolve@npm:^1.22.2, resolve@npm:^1.22.4": version: 1.22.10 resolution: "resolve@npm:1.22.10" dependencies: @@ -36915,7 +36322,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.22.10#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": +"resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": version: 1.22.10 resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" dependencies: @@ -37090,6 +36497,84 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.43.0": + version: 4.50.0 + resolution: "rollup@npm:4.50.0" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.50.0" + "@rollup/rollup-android-arm64": "npm:4.50.0" + "@rollup/rollup-darwin-arm64": "npm:4.50.0" + "@rollup/rollup-darwin-x64": "npm:4.50.0" + "@rollup/rollup-freebsd-arm64": "npm:4.50.0" + "@rollup/rollup-freebsd-x64": "npm:4.50.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.50.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.50.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.50.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.50.0" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.50.0" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.50.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.50.0" + "@rollup/rollup-linux-riscv64-musl": "npm:4.50.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.50.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.50.0" + "@rollup/rollup-linux-x64-musl": "npm:4.50.0" + "@rollup/rollup-openharmony-arm64": "npm:4.50.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.50.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.50.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.50.0" + "@types/estree": "npm:1.0.8" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loongarch64-gnu": + optional: true + "@rollup/rollup-linux-ppc64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-openharmony-arm64": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10/76561d1cfa786c3ea308b8cae94da40486e96c050d3c966337062eaf8260a779329df50df00cb02cda4d71fc9c948c9adf2ec6aa3f399901f5d56ae3f2ed31d3 + languageName: node + linkType: hard + "root-workspace-0b6124@workspace:.": version: 0.0.0-use.local resolution: "root-workspace-0b6124@workspace:." @@ -37118,11 +36603,9 @@ __metadata: "@commitlint/cli": "npm:^11.0.0" "@commitlint/config-conventional": "npm:^11.0.0" "@grpc/grpc-js": "npm:^1.11.1" - "@jest/globals": "npm:^29.7.0" "@octokit/rest": "npm:^20.0.2" "@types/fs-extra": "npm:^11.0.4" "@types/hoist-non-react-statics": "npm:^3.3.5" - "@types/jest": "npm:^29.5.14" "@types/node": "npm:^20.17.10" "@types/prettier": "npm:^2.7.3" "@types/react": "npm:18.2.79" @@ -37131,7 +36614,6 @@ __metadata: "@typescript-eslint/parser": "npm:^6.21.0" adio: "npm:^2.0.1" axios: "npm:^1.8.2" - babel-jest: "npm:29.7.0" babel-loader: "npm:^9.2.1" babel-plugin-dynamic-import-node: "npm:2.3.3" babel-plugin-macros: "npm:3.1.0" @@ -37146,13 +36628,13 @@ __metadata: eslint-config-standard: "npm:^16.0.3" eslint-import-resolver-babel-module: "npm:^5.3.2" eslint-plugin-import: "npm:^2.27.5" - eslint-plugin-jest: "npm:^25.7.0" eslint-plugin-lodash: "npm:^7.4.0" eslint-plugin-node: "npm:^11.1.0" eslint-plugin-promise: "npm:^5.2.0" eslint-plugin-react: "npm:^7.32.2" eslint-plugin-standard: "npm:^5.0.0" execa: "npm:^5.1.1" + fast-glob: "npm:^3.3.3" folder-hash: "npm:^4.0.4" fs-extra: "npm:^11.2.0" fsevents: "npm:^2.0.7" @@ -37167,9 +36649,7 @@ __metadata: inquirer-autocomplete-prompt: "npm:^1.0.1" inquirer-checkbox-plus-prompt: "npm:^1.0.1" inquirer-maxlength-input-prompt: "npm:^1.0.0" - jest: "npm:^30.0.0-rc.1" - jest-environment-jsdom: "npm:^30.0.0-rc.1" - jest-extended: "npm:^4.0.2" + jest-extended: "npm:^6.0.0" lerna: "npm:8.1.2" lint-staged: "npm:^15.3.0" listr: "npm:^0.14.3" @@ -37184,13 +36664,12 @@ __metadata: prettier: "npm:^2.8.8" semver: "npm:^7.6.3" ts-expect: "npm:^1.3.0" - ts-jest: "npm:^29.2.5" - ts-jest-resolver: "npm:^2.0.1" tsx: "npm:^4.16.2" type-fest: "npm:4.14.0" typescript: "npm:5.3.3" typescript-transform-paths: "npm:^3.5.3" verdaccio: "npm:^6.0.5" + vitest: "npm:^3.2.4" write-json-file: "npm:^4.3.0" yargs: "npm:^17.7.2" dependenciesMeta: @@ -37206,13 +36685,6 @@ __metadata: languageName: node linkType: hard -"rrweb-cssom@npm:^0.8.0": - version: 0.8.0 - resolution: "rrweb-cssom@npm:0.8.0" - checksum: 10/07521ee36fb6569c17906afad1ac7ff8f099d49ade9249e190693ac36cdf27f88d9acf0cc66978935d5d0a23fca105643d7e9125b9a9d91ed9db9e02d31d7d80 - languageName: node - linkType: hard - "run-applescript@npm:^7.0.0": version: 7.0.0 resolution: "run-applescript@npm:7.0.0" @@ -37227,13 +36699,6 @@ __metadata: languageName: node linkType: hard -"run-async@npm:^4.0.5": - version: 4.0.6 - resolution: "run-async@npm:4.0.6" - checksum: 10/d23929e36d0422b871a8964d5cfcb1b88295950ea5f72e1dfed458d4c3f3a33a7395e08167d8a4446f2110cfaac7d7653d9c804d2becab8afa8a63e16b97da81 - languageName: node - linkType: hard - "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -37286,15 +36751,6 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.8.2": - version: 7.8.2 - resolution: "rxjs@npm:7.8.2" - dependencies: - tslib: "npm:^2.1.0" - checksum: 10/03dff09191356b2b87d94fbc1e97c4e9eb3c09d4452399dddd451b09c2f1ba8d56925a40af114282d7bc0c6fe7514a2236ca09f903cf70e4bbf156650dddb49d - languageName: node - linkType: hard - "safe-array-concat@npm:^1.1.3": version: 1.1.3 resolution: "safe-array-concat@npm:1.1.3" @@ -37487,7 +36943,7 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^3.0.0": +"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1": version: 3.1.1 resolution: "schema-utils@npm:3.1.1" dependencies: @@ -37498,6 +36954,17 @@ __metadata: languageName: node linkType: hard +"schema-utils@npm:^3.2.0": + version: 3.3.0 + resolution: "schema-utils@npm:3.3.0" + dependencies: + "@types/json-schema": "npm:^7.0.8" + ajv: "npm:^6.12.5" + ajv-keywords: "npm:^3.5.2" + checksum: 10/2c7bbb1da967fdfd320e6cea538949006ec6e8c13ea560a4f94ff2c56809a8486fa5ec419e023452501a6befe1ca381e409c2798c24f4993c7c4094d97fdb258 + languageName: node + linkType: hard + "schema-utils@npm:^4.0.0": version: 4.0.0 resolution: "schema-utils@npm:4.0.0" @@ -37548,7 +37015,7 @@ __metadata: languageName: node linkType: hard -"selfsigned@npm:^2.4.1": +"selfsigned@npm:^2.1.1, selfsigned@npm:^2.4.1": version: 2.4.1 resolution: "selfsigned@npm:2.4.1" dependencies: @@ -37611,6 +37078,15 @@ __metadata: languageName: node linkType: hard +"serialize-javascript@npm:^6.0.1, serialize-javascript@npm:^6.0.2": + version: 6.0.2 + resolution: "serialize-javascript@npm:6.0.2" + dependencies: + randombytes: "npm:^2.1.0" + checksum: 10/445a420a6fa2eaee4b70cbd884d538e259ab278200a2ededd73253ada17d5d48e91fb1f4cd224a236ab62ea7ba0a70c6af29fc93b4f3d3078bf7da1c031fde58 + languageName: node + linkType: hard + "serve-index@npm:^1.9.1": version: 1.9.1 resolution: "serve-index@npm:1.9.1" @@ -37904,6 +37380,13 @@ __metadata: languageName: node linkType: hard +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 10/e93ff66c6531a079af8fb217240df01f980155b5dc408d2d7bebc398dd284e383eb318153bf8acd4db3c4fe799aa5b9a641e38b0ba3b1975700b1c89547ea4e7 + languageName: node + linkType: hard + "signal-exit@npm:3.0.7, signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" @@ -38126,16 +37609,6 @@ __metadata: languageName: node linkType: hard -"socks@npm:^2.8.6": - version: 2.8.7 - resolution: "socks@npm:2.8.7" - dependencies: - ip-address: "npm:^10.0.1" - smart-buffer: "npm:^4.2.0" - checksum: 10/d19366c95908c19db154f329bbe94c2317d315dc933a7c2b5101e73f32a555c84fb199b62174e1490082a593a4933d8d5a9b297bde7d1419c14a11a965f51356 - languageName: node - linkType: hard - "sonic-boom@npm:3.8.1, sonic-boom@npm:^3.7.0": version: 3.8.1 resolution: "sonic-boom@npm:3.8.1" @@ -38181,13 +37654,36 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.2.0": +"source-list-map@npm:^2.0.1": + version: 2.0.1 + resolution: "source-list-map@npm:2.0.1" + checksum: 10/3918ffba5fe8447bc816800026fe707aab233d9d05a3487225d880e23b7e37ed455b4e1b844e05644f6ecc7c9b837c0cc32da54dd37f77c993370ebcdb049246 + languageName: node + linkType: hard + +"source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.0": version: 1.2.0 resolution: "source-map-js@npm:1.2.0" checksum: 10/74f331cfd2d121c50790c8dd6d3c9de6be21926de80583b23b37029b0f37aefc3e019fa91f9a10a5e120c08135297e1ecf312d561459c45908cb1e0e365f49e5 languageName: node linkType: hard +"source-map-loader@npm:^1.1.3": + version: 1.1.3 + resolution: "source-map-loader@npm:1.1.3" + dependencies: + abab: "npm:^2.0.5" + iconv-lite: "npm:^0.6.2" + loader-utils: "npm:^2.0.0" + schema-utils: "npm:^3.0.0" + source-map: "npm:^0.6.1" + whatwg-mimetype: "npm:^2.3.0" + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 10/6eb765d119cd15b2e7eacefc56b326cb38c2c6127706c6cfddcab5517125418debef532a68821732b169f9f21e145a6184a5e2e6fa367fc0380c20e22f65e34a + languageName: node + linkType: hard + "source-map-support@npm:0.5.13": version: 0.5.13 resolution: "source-map-support@npm:0.5.13" @@ -38198,7 +37694,7 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:0.5.21, source-map-support@npm:^0.5.16, source-map-support@npm:^0.5.6": +"source-map-support@npm:0.5.21, source-map-support@npm:^0.5.16, source-map-support@npm:^0.5.21, source-map-support@npm:^0.5.6, source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: @@ -38208,6 +37704,13 @@ __metadata: languageName: node linkType: hard +"source-map@npm:0.6.1, source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0, source-map@npm:~0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10/59ef7462f1c29d502b3057e822cdbdae0b0e565302c4dd1a95e11e793d8d9d62006cdc10e0fd99163ca33ff2071360cf50ee13f90440806e7ed57d81cba2f7ff + languageName: node + linkType: hard + "source-map@npm:^0.5.7": version: 0.5.7 resolution: "source-map@npm:0.5.7" @@ -38215,10 +37718,10 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 10/59ef7462f1c29d502b3057e822cdbdae0b0e565302c4dd1a95e11e793d8d9d62006cdc10e0fd99163ca33ff2071360cf50ee13f90440806e7ed57d81cba2f7ff +"source-map@npm:^0.7.3": + version: 0.7.4 + resolution: "source-map@npm:0.7.4" + checksum: 10/a0f7c9b797eda93139842fd28648e868a9a03ea0ad0d9fa6602a0c1f17b7fb6a7dcca00c144476cccaeaae5042e99a285723b1a201e844ad67221bf5d428f1dc languageName: node linkType: hard @@ -38299,13 +37802,6 @@ __metadata: languageName: node linkType: hard -"split2@npm:^4.2.0": - version: 4.2.0 - resolution: "split2@npm:4.2.0" - checksum: 10/09bbefc11bcf03f044584c9764cd31a252d8e52cea29130950b26161287c11f519807c5e54bd9e5804c713b79c02cefe6a98f4688630993386be353e03f534ab - languageName: node - linkType: hard - "split@npm:^1.0.1": version: 1.0.1 resolution: "split@npm:1.0.1" @@ -38412,7 +37908,7 @@ __metadata: languageName: node linkType: hard -"stack-utils@npm:^2.0.3, stack-utils@npm:^2.0.6": +"stack-utils@npm:^2.0.3": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" dependencies: @@ -38421,6 +37917,13 @@ __metadata: languageName: node linkType: hard +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 10/2d4dc4e64e2db796de4a3c856d5943daccdfa3dd092e452a1ce059c81e9a9c29e0b9badba91b43ef0d5ff5c04ee62feb3bcc559a804e16faf447bac2d883aa99 + languageName: node + linkType: hard + "stackframe@npm:^1.3.4": version: 1.3.4 resolution: "stackframe@npm:1.3.4" @@ -38449,6 +37952,20 @@ __metadata: languageName: node linkType: hard +"std-env@npm:^3.7.0": + version: 3.7.0 + resolution: "std-env@npm:3.7.0" + checksum: 10/6ee0cca1add3fd84656b0002cfbc5bfa20340389d9ba4720569840f1caa34bce74322aef4c93f046391583e50649d0cf81a5f8fe1d411e50b659571690a45f12 + languageName: node + linkType: hard + +"std-env@npm:^3.9.0": + version: 3.9.0 + resolution: "std-env@npm:3.9.0" + checksum: 10/3044b2c54a74be4f460db56725571241ab3ac89a91f39c7709519bc90fa37148784bc4cd7d3a301aa735f43bd174496f263563f76703ce3e81370466ab7c235b + languageName: node + linkType: hard + "steno@npm:^0.4.1": version: 0.4.4 resolution: "steno@npm:0.4.4" @@ -38531,7 +38048,7 @@ __metadata: languageName: node linkType: hard -"string-length@npm:^4.0.1, string-length@npm:^4.0.2": +"string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" dependencies: @@ -38823,6 +38340,15 @@ __metadata: languageName: node linkType: hard +"strip-literal@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-literal@npm:3.0.0" + dependencies: + js-tokens: "npm:^9.0.1" + checksum: 10/da1616f654f3ff481e078597b4565373a5eeed78b83de4a11a1a1b98292a9036f2474e528eff19b6eed93370428ff957a473827057c117495086436725d7efad + languageName: node + linkType: hard + "strnum@npm:^1.0.5": version: 1.0.5 resolution: "strnum@npm:1.0.5" @@ -38852,6 +38378,18 @@ __metadata: languageName: node linkType: hard +"stylehacks@npm:^7.0.4": + version: 7.0.4 + resolution: "stylehacks@npm:7.0.4" + dependencies: + browserslist: "npm:^4.23.3" + postcss-selector-parser: "npm:^6.1.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10/fc9d6b1e0b996d139a77f391df6db49ee1ab7e8fdeb32a8fa6b4c11512e72eb072470c32080171e46ebe123c9c96d763b9e4421b09c9c428985077940b6ba085 + languageName: node + linkType: hard + "stylis@npm:4.1.3": version: 4.1.3 resolution: "stylis@npm:4.1.3" @@ -38952,6 +38490,23 @@ __metadata: languageName: node linkType: hard +"svgo@npm:^3.3.2": + version: 3.3.2 + resolution: "svgo@npm:3.3.2" + dependencies: + "@trysound/sax": "npm:0.2.0" + commander: "npm:^7.2.0" + css-select: "npm:^5.1.0" + css-tree: "npm:^2.3.1" + css-what: "npm:^6.1.0" + csso: "npm:^5.0.5" + picocolors: "npm:^1.0.0" + bin: + svgo: ./bin/svgo + checksum: 10/82fdea9b938884d808506104228e4d3af0050d643d5b46ff7abc903ff47a91bbf6561373394868aaf07a28f006c4057b8fbf14bbd666298abdd7cc590d4f7700 + languageName: node + linkType: hard + "swiper@npm:^9.3.2": version: 9.3.2 resolution: "swiper@npm:9.3.2" @@ -38982,15 +38537,6 @@ __metadata: languageName: node linkType: hard -"synckit@npm:^0.11.8": - version: 0.11.8 - resolution: "synckit@npm:0.11.8" - dependencies: - "@pkgr/core": "npm:^0.2.4" - checksum: 10/9bb2cf11edaf31ba781f1c719dd58087323201bda6392254538aef4dea216aa02a32e25f06643bcfa1c1a2c95e0d84186d82cfb66f9a0ab3a2be4816c696a8a3 - languageName: node - linkType: hard - "systeminformation@npm:^5.23.18": version: 5.23.18 resolution: "systeminformation@npm:5.23.18" @@ -39007,6 +38553,13 @@ __metadata: languageName: node linkType: hard +"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 10/1769336dd21481ae6347611ca5fca47add0962fd8e80466515032125eca0084a4f0ede11e65341b9c0018ef4e1cf1ad820adbb0fba7cc99865c6005734000b0a + languageName: node + linkType: hard + "tar-fs@npm:^2.0.0": version: 2.1.3 resolution: "tar-fs@npm:2.1.3" @@ -39117,6 +38670,56 @@ __metadata: languageName: node linkType: hard +"terser-webpack-plugin@npm:^5.3.10": + version: 5.3.10 + resolution: "terser-webpack-plugin@npm:5.3.10" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.20" + jest-worker: "npm:^27.4.5" + schema-utils: "npm:^3.1.1" + serialize-javascript: "npm:^6.0.1" + terser: "npm:^5.26.0" + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: 10/fb1c2436ae1b4e983be043fa0a3d355c047b16b68f102437d08c736d7960c001e7420e2f722b9d99ce0dc70ca26a68cc63c0b82bc45f5b48671142b352a9d938 + languageName: node + linkType: hard + +"terser@npm:^5.10.0": + version: 5.16.3 + resolution: "terser@npm:5.16.3" + dependencies: + "@jridgewell/source-map": "npm:^0.3.2" + acorn: "npm:^8.5.0" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10/0eec388af3b0e1fe947d78741cca7c68affd9127b854046f21d4375dfaba9d54f98b6a7145a373d7357fd28f0b78321a862c311f16bd26d46bc1276420499974 + languageName: node + linkType: hard + +"terser@npm:^5.26.0": + version: 5.30.0 + resolution: "terser@npm:5.30.0" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.8.2" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10/78e6ce9e95ec7fc40e694da2e749fa80c3a99c916626349361c22d4cf2e510e8e6e49859c955416088e40688f99115cd595cb033fd5a8a7f0fc03c527ed8efe3 + languageName: node + linkType: hard + "test-exclude@npm:^6.0.0": version: 6.0.0 resolution: "test-exclude@npm:6.0.0" @@ -39250,6 +38853,13 @@ __metadata: languageName: node linkType: hard +"tinybench@npm:^2.9.0": + version: 2.9.0 + resolution: "tinybench@npm:2.9.0" + checksum: 10/cfa1e1418e91289219501703c4693c70708c91ffb7f040fd318d24aef419fb5a43e0c0160df9471499191968b2451d8da7f8087b08c3133c251c40d24aced06c + languageName: node + linkType: hard + "tinycolor2@npm:^1.4.1": version: 1.6.0 resolution: "tinycolor2@npm:1.6.0" @@ -39257,7 +38867,14 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.9": +"tinyexec@npm:^0.3.2": + version: 0.3.2 + resolution: "tinyexec@npm:0.3.2" + checksum: 10/b9d5fed3166fb1acd1e7f9a89afcd97ccbe18b9c1af0278e429455f6976d69271ba2d21797e7c36d57d6b05025e525d2882d88c2ab435b60d1ddf2fea361de57 + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.9": version: 0.2.14 resolution: "tinyglobby@npm:0.2.14" dependencies: @@ -39267,6 +38884,27 @@ __metadata: languageName: node linkType: hard +"tinypool@npm:^1.1.1": + version: 1.1.1 + resolution: "tinypool@npm:1.1.1" + checksum: 10/0d54139e9dbc6ef33349768fa78890a4d708d16a7ab68e4e4ef3bb740609ddf0f9fd13292c2f413fbba756166c97051a657181c8f7ae92ade690604f183cc01d + languageName: node + linkType: hard + +"tinyrainbow@npm:^2.0.0": + version: 2.0.0 + resolution: "tinyrainbow@npm:2.0.0" + checksum: 10/94d4e16246972614a5601eeb169ba94f1d49752426312d3cf8cc4f2cc663a2e354ffc653aa4de4eebccbf9eeebdd0caef52d1150271fdfde65d7ae7f3dcb9eb5 + languageName: node + linkType: hard + +"tinyspy@npm:^4.0.3": + version: 4.0.3 + resolution: "tinyspy@npm:4.0.3" + checksum: 10/b6a3ed40dd76a2b3c020250cf1401506b456509d1fb9dba0c7b0e644d258dac722843b85c57ccc36c8687db1e7978cb6adcc43e3b71c475910c085b96d41cb53 + languageName: node + linkType: hard + "tldts-core@npm:^6.1.66": version: 6.1.66 resolution: "tldts-core@npm:6.1.66" @@ -39381,15 +39019,6 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^5.1.1": - version: 5.1.2 - resolution: "tough-cookie@npm:5.1.2" - dependencies: - tldts: "npm:^6.1.32" - checksum: 10/de430e6e6d34b794137e05b8ac2aa6b74ebbe6cdceb4126f168cf1e76101162a4b2e0e7587c3b70e728bd8654fc39958b2035be7619ee6f08e7257610ba4cd04 - languageName: node - linkType: hard - "tr46@npm:^5.0.0": version: 5.0.0 resolution: "tr46@npm:5.0.0" @@ -39399,15 +39028,6 @@ __metadata: languageName: node linkType: hard -"tr46@npm:^5.1.0": - version: 5.1.1 - resolution: "tr46@npm:5.1.1" - dependencies: - punycode: "npm:^2.3.1" - checksum: 10/833a0e1044574da5790148fd17866d4ddaea89e022de50279967bcd6b28b4ce0d30d59eb3acf9702b60918975b3bad481400337e3a2e6326cffa5c77b874753d - languageName: node - linkType: hard - "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -39510,53 +39130,6 @@ __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.2.5": - version: 29.3.4 - resolution: "ts-jest@npm:29.3.4" - dependencies: - bs-logger: "npm:^0.2.6" - ejs: "npm:^3.1.10" - fast-json-stable-stringify: "npm:^2.1.0" - jest-util: "npm:^29.0.0" - json5: "npm:^2.2.3" - lodash.memoize: "npm:^4.1.2" - make-error: "npm:^1.3.6" - semver: "npm:^7.7.2" - type-fest: "npm:^4.41.0" - yargs-parser: "npm:^21.1.1" - peerDependencies: - "@babel/core": ">=7.0.0-beta.0 <8" - "@jest/transform": ^29.0.0 - "@jest/types": ^29.0.0 - babel-jest: ^29.0.0 - jest: ^29.0.0 - typescript: ">=4.3 <6" - peerDependenciesMeta: - "@babel/core": - optional: true - "@jest/transform": - optional: true - "@jest/types": - optional: true - babel-jest: - optional: true - esbuild: - optional: true - bin: - ts-jest: cli.js - checksum: 10/9f22469ef9cbdfb819fe03c4554a83af66d810e7ac72efca433d098f09b73c15b5f5d83a56732e01b40baf621e288c2e0178fad45d304ff69d18d8e0490498d3 - languageName: node - linkType: hard - "ts-morph@npm:^24.0.0": version: 24.0.0 resolution: "ts-morph@npm:24.0.0" @@ -39666,7 +39239,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": version: 2.5.0 resolution: "tslib@npm:2.5.0" checksum: 10/ea556fbdf396fe15dbd45e242754e86e7c36e0dce8644404a7c8a81ae1e940744dc639569aeca1ae370a7f804d82872f3fd8564eb23be9adb7618201d0314dac @@ -39680,7 +39253,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.6.3, tslib@npm:^2.8.1": +"tslib@npm:^2.6.3": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 @@ -39694,17 +39267,6 @@ __metadata: languageName: node linkType: hard -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" - dependencies: - tslib: "npm:^1.8.1" - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 10/ea036bec1dd024e309939ffd49fda7a351c0e87a1b8eb049570dd119d447250e2c56e0e6c00554e8205760e7417793fdebff752a46e573fbe07d4f375502a5b2 - languageName: node - linkType: hard - "tsx@npm:^4.16.2": version: 4.19.4 resolution: "tsx@npm:4.19.4" @@ -39869,7 +39431,7 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^4.31.0, type-fest@npm:^4.41.0": +"type-fest@npm:^4.31.0": version: 4.41.0 resolution: "type-fest@npm:4.41.0" checksum: 10/617ace794ac0893c2986912d28b3065ad1afb484cad59297835a0807dc63286c39e8675d65f7de08fafa339afcb8fe06a36e9a188b9857756ae1e92ee8bda212 @@ -40264,67 +39826,6 @@ __metadata: languageName: node linkType: hard -"unrs-resolver@npm:^1.7.11": - version: 1.7.13 - resolution: "unrs-resolver@npm:1.7.13" - dependencies: - "@unrs/resolver-binding-darwin-arm64": "npm:1.7.13" - "@unrs/resolver-binding-darwin-x64": "npm:1.7.13" - "@unrs/resolver-binding-freebsd-x64": "npm:1.7.13" - "@unrs/resolver-binding-linux-arm-gnueabihf": "npm:1.7.13" - "@unrs/resolver-binding-linux-arm-musleabihf": "npm:1.7.13" - "@unrs/resolver-binding-linux-arm64-gnu": "npm:1.7.13" - "@unrs/resolver-binding-linux-arm64-musl": "npm:1.7.13" - "@unrs/resolver-binding-linux-ppc64-gnu": "npm:1.7.13" - "@unrs/resolver-binding-linux-riscv64-gnu": "npm:1.7.13" - "@unrs/resolver-binding-linux-riscv64-musl": "npm:1.7.13" - "@unrs/resolver-binding-linux-s390x-gnu": "npm:1.7.13" - "@unrs/resolver-binding-linux-x64-gnu": "npm:1.7.13" - "@unrs/resolver-binding-linux-x64-musl": "npm:1.7.13" - "@unrs/resolver-binding-wasm32-wasi": "npm:1.7.13" - "@unrs/resolver-binding-win32-arm64-msvc": "npm:1.7.13" - "@unrs/resolver-binding-win32-ia32-msvc": "npm:1.7.13" - "@unrs/resolver-binding-win32-x64-msvc": "npm:1.7.13" - napi-postinstall: "npm:^0.2.2" - dependenciesMeta: - "@unrs/resolver-binding-darwin-arm64": - optional: true - "@unrs/resolver-binding-darwin-x64": - optional: true - "@unrs/resolver-binding-freebsd-x64": - optional: true - "@unrs/resolver-binding-linux-arm-gnueabihf": - optional: true - "@unrs/resolver-binding-linux-arm-musleabihf": - optional: true - "@unrs/resolver-binding-linux-arm64-gnu": - optional: true - "@unrs/resolver-binding-linux-arm64-musl": - optional: true - "@unrs/resolver-binding-linux-ppc64-gnu": - optional: true - "@unrs/resolver-binding-linux-riscv64-gnu": - optional: true - "@unrs/resolver-binding-linux-riscv64-musl": - optional: true - "@unrs/resolver-binding-linux-s390x-gnu": - optional: true - "@unrs/resolver-binding-linux-x64-gnu": - optional: true - "@unrs/resolver-binding-linux-x64-musl": - optional: true - "@unrs/resolver-binding-wasm32-wasi": - optional: true - "@unrs/resolver-binding-win32-arm64-msvc": - optional: true - "@unrs/resolver-binding-win32-ia32-msvc": - optional: true - "@unrs/resolver-binding-win32-x64-msvc": - optional: true - checksum: 10/362aa31e5cd635cf5955a7eb3fe58230a1a32bd5daba4c71e7620e0a0fcd35fffb926655e32d4834a82d48b676cf8a2208cf1de30e30b4bc85c2dc67fa60acb8 - languageName: node - linkType: hard - "untildify@npm:^4.0.0": version: 4.0.0 resolution: "untildify@npm:4.0.0" @@ -40438,6 +39939,23 @@ __metadata: languageName: node linkType: hard +"url-loader@npm:4.1.1": + version: 4.1.1 + resolution: "url-loader@npm:4.1.1" + dependencies: + loader-utils: "npm:^2.0.0" + mime-types: "npm:^2.1.27" + schema-utils: "npm:^3.0.0" + peerDependencies: + file-loader: "*" + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + checksum: 10/f7e7258156f607bdd74469d22868a3522177bd895bb0eb1919363e32116ad7ed0c666b076d32dd700f1681c53d2edf046382bd9f6d9e77a19d4dd8ea36511da2 + languageName: node + linkType: hard + "url@npm:0.11.0, url@npm:^0.11.0": version: 0.11.0 resolution: "url@npm:0.11.0" @@ -40448,6 +39966,16 @@ __metadata: languageName: node linkType: hard +"url@npm:^0.11.4": + version: 0.11.4 + resolution: "url@npm:0.11.4" + dependencies: + punycode: "npm:^1.4.1" + qs: "npm:^6.12.3" + checksum: 10/e787d070f0756518b982a4653ef6cdf4d9030d8691eee2d483344faf2b530b71d302287fa63b292299455fea5075c502a5ad5f920cb790e95605847f957a65e4 + languageName: node + linkType: hard + "use-deep-compare-effect@npm:^1.8.1": version: 1.8.1 resolution: "use-deep-compare-effect@npm:1.8.1" @@ -40507,6 +40035,13 @@ __metadata: languageName: node linkType: hard +"utila@npm:~0.4": + version: 0.4.0 + resolution: "utila@npm:0.4.0" + checksum: 10/b068d8cb140588da0d0c80ee3c14c6b75d3f68760d8a1c6c3908d0270e9e4056454ff16189586481b7382926c44674f6929d08e06eaf9ec8f62736cd900169c5 + languageName: node + linkType: hard + "utils-merge@npm:1.0.1": version: 1.0.1 resolution: "utils-merge@npm:1.0.1" @@ -40569,16 +40104,7 @@ __metadata: languageName: node linkType: hard -"validate-npm-package-name@npm:5.0.0, validate-npm-package-name@npm:^5.0.0": - version: 5.0.0 - resolution: "validate-npm-package-name@npm:5.0.0" - dependencies: - builtins: "npm:^5.0.0" - checksum: 10/5342a994986199b3c28e53a8452a14b2bb5085727691ea7aa0d284a6606b127c371e0925ae99b3f1ef7cc7d2c9de75f52eb61a3d1cc45e39bca1e3a9444cbb4e - languageName: node - linkType: hard - -"validate-npm-package-name@npm:^3.0.0": +"validate-npm-package-name@npm:3.0.0, validate-npm-package-name@npm:^3.0.0": version: 3.0.0 resolution: "validate-npm-package-name@npm:3.0.0" dependencies: @@ -40587,10 +40113,12 @@ __metadata: languageName: node linkType: hard -"validate-npm-package-name@npm:^6.0.2": - version: 6.0.2 - resolution: "validate-npm-package-name@npm:6.0.2" - checksum: 10/f0e022b0a7f11345a92b64121b059b720204cd64406a0d65d81526181dcb70aef551c7c6bf9ca37b91607a7c6ff4d62e1f63a86c8d9b7346d722a641a4bd8789 +"validate-npm-package-name@npm:5.0.0, validate-npm-package-name@npm:^5.0.0": + version: 5.0.0 + resolution: "validate-npm-package-name@npm:5.0.0" + dependencies: + builtins: "npm:^5.0.0" + checksum: 10/5342a994986199b3c28e53a8452a14b2bb5085727691ea7aa0d284a6606b127c371e0925ae99b3f1ef7cc7d2c9de75f52eb61a3d1cc45e39bca1e3a9444cbb4e languageName: node linkType: hard @@ -40695,6 +40223,132 @@ __metadata: languageName: node linkType: hard +"vite-node@npm:3.2.4": + version: 3.2.4 + resolution: "vite-node@npm:3.2.4" + dependencies: + cac: "npm:^6.7.14" + debug: "npm:^4.4.1" + es-module-lexer: "npm:^1.7.0" + pathe: "npm:^2.0.3" + vite: "npm:^5.0.0 || ^6.0.0 || ^7.0.0-0" + bin: + vite-node: vite-node.mjs + checksum: 10/343244ecabbab3b6e1a3065dabaeefa269965a7a7c54652d4b7a7207ee82185e887af97268c61755dcb2dd6a6ce5d9e114400cbd694229f38523e935703cc62f + languageName: node + linkType: hard + +"vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0": + version: 7.1.4 + resolution: "vite@npm:7.1.4" + dependencies: + esbuild: "npm:^0.25.0" + fdir: "npm:^6.5.0" + fsevents: "npm:~2.3.3" + picomatch: "npm:^4.0.3" + postcss: "npm:^8.5.6" + rollup: "npm:^4.43.0" + tinyglobby: "npm:^0.2.14" + peerDependencies: + "@types/node": ^20.19.0 || >=22.12.0 + jiti: ">=1.21.0" + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: ">=0.54.8" + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + bin: + vite: bin/vite.js + checksum: 10/40c6292227e8177470b9f1014fabe2fa324222d6bdc06eb994f7aa6872a56790cd1e45a2f7017a381413eb2fde48fde0f2f58933a045936ca6af2061862bf338 + languageName: node + linkType: hard + +"vitest@npm:^3.2.4": + version: 3.2.4 + resolution: "vitest@npm:3.2.4" + dependencies: + "@types/chai": "npm:^5.2.2" + "@vitest/expect": "npm:3.2.4" + "@vitest/mocker": "npm:3.2.4" + "@vitest/pretty-format": "npm:^3.2.4" + "@vitest/runner": "npm:3.2.4" + "@vitest/snapshot": "npm:3.2.4" + "@vitest/spy": "npm:3.2.4" + "@vitest/utils": "npm:3.2.4" + chai: "npm:^5.2.0" + debug: "npm:^4.4.1" + expect-type: "npm:^1.2.1" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.3" + picomatch: "npm:^4.0.2" + std-env: "npm:^3.9.0" + tinybench: "npm:^2.9.0" + tinyexec: "npm:^0.3.2" + tinyglobby: "npm:^0.2.14" + tinypool: "npm:^1.1.1" + tinyrainbow: "npm:^2.0.0" + vite: "npm:^5.0.0 || ^6.0.0 || ^7.0.0-0" + vite-node: "npm:3.2.4" + why-is-node-running: "npm:^2.3.0" + peerDependencies: + "@edge-runtime/vm": "*" + "@types/debug": ^4.1.12 + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + "@vitest/browser": 3.2.4 + "@vitest/ui": 3.2.4 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/debug": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: 10/f10bbce093ecab310ecbe484536ef4496fb9151510b2be0c5907c65f6d31482d9c851f3182531d1d27d558054aa78e8efd9d4702ba6c82058657e8b6a52507ee + languageName: node + linkType: hard + "vizion@npm:~2.2.1": version: 2.2.1 resolution: "vizion@npm:2.2.1" @@ -40748,6 +40402,16 @@ __metadata: languageName: node linkType: hard +"watchpack@npm:^2.4.1": + version: 2.4.1 + resolution: "watchpack@npm:2.4.1" + dependencies: + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.1.2" + checksum: 10/0736ebd20b75d3931f9b6175c819a66dee29297c1b389b2e178bc53396a6f867ecc2fd5d87a713ae92dcb73e487daec4905beee20ca00a9e27f1184a7c2bca5e + languageName: node + linkType: hard + "wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": version: 1.7.3 resolution: "wbuf@npm:1.7.3" @@ -40807,6 +40471,21 @@ __metadata: languageName: node linkType: hard +"webpack-dev-middleware@npm:^5.3.4": + version: 5.3.4 + resolution: "webpack-dev-middleware@npm:5.3.4" + dependencies: + colorette: "npm:^2.0.10" + memfs: "npm:^3.4.3" + mime-types: "npm:^2.1.31" + range-parser: "npm:^1.2.1" + schema-utils: "npm:^4.0.0" + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 10/3004374130f31c2910da39b80e24296009653bb11caa0b8449d962b67e003d7e73d01fbcfda9be1f1f04179f66a9c39f4caf7963df54303b430e39ba5a94f7c2 + languageName: node + linkType: hard + "webpack-dev-middleware@npm:^7.4.2": version: 7.4.2 resolution: "webpack-dev-middleware@npm:7.4.2" @@ -40871,6 +40550,138 @@ __metadata: languageName: node linkType: hard +"webpack-dev-server@npm:^4.15.2": + version: 4.15.2 + resolution: "webpack-dev-server@npm:4.15.2" + dependencies: + "@types/bonjour": "npm:^3.5.9" + "@types/connect-history-api-fallback": "npm:^1.3.5" + "@types/express": "npm:^4.17.13" + "@types/serve-index": "npm:^1.9.1" + "@types/serve-static": "npm:^1.13.10" + "@types/sockjs": "npm:^0.3.33" + "@types/ws": "npm:^8.5.5" + ansi-html-community: "npm:^0.0.8" + bonjour-service: "npm:^1.0.11" + chokidar: "npm:^3.5.3" + colorette: "npm:^2.0.10" + compression: "npm:^1.7.4" + connect-history-api-fallback: "npm:^2.0.0" + default-gateway: "npm:^6.0.3" + express: "npm:^4.17.3" + graceful-fs: "npm:^4.2.6" + html-entities: "npm:^2.3.2" + http-proxy-middleware: "npm:^2.0.3" + ipaddr.js: "npm:^2.0.1" + launch-editor: "npm:^2.6.0" + open: "npm:^8.0.9" + p-retry: "npm:^4.5.0" + rimraf: "npm:^3.0.2" + schema-utils: "npm:^4.0.0" + selfsigned: "npm:^2.1.1" + serve-index: "npm:^1.9.1" + sockjs: "npm:^0.3.24" + spdy: "npm:^4.0.2" + webpack-dev-middleware: "npm:^5.3.4" + ws: "npm:^8.13.0" + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + bin: + webpack-dev-server: bin/webpack-dev-server.js + checksum: 10/86ca4fb49d2a264243b2284c6027a9a91fd7d47737bbb4096e873be8a3f8493a9577b1535d7cc84de1ee991da7da97686c85788ccac547b0f5cf5c7686aacee9 + languageName: node + linkType: hard + +"webpack-manifest-plugin@npm:^5.0.0": + version: 5.0.0 + resolution: "webpack-manifest-plugin@npm:5.0.0" + dependencies: + tapable: "npm:^2.0.0" + webpack-sources: "npm:^2.2.0" + peerDependencies: + webpack: ^5.47.0 + checksum: 10/466ade444c23d4a8ec3d1a108ec2142468cb260570533acf2cf68806065ccdef649dbac0fa6b0700f4c6d2497535ae950a20e83b26edb25ccfa9bb51538fa607 + languageName: node + linkType: hard + +"webpack-sources@npm:^2.2.0": + version: 2.3.1 + resolution: "webpack-sources@npm:2.3.1" + dependencies: + source-list-map: "npm:^2.0.1" + source-map: "npm:^0.6.1" + checksum: 10/0c4bb91f2899205648da25b68edf4495a360692af2c426cde98b188367478c93d5e33e2b08665e070ac0ece59ade8d52175da656a212b44701ce4a271ca66695 + languageName: node + linkType: hard + +"webpack-sources@npm:^3.2.3": + version: 3.2.3 + resolution: "webpack-sources@npm:3.2.3" + checksum: 10/a661f41795d678b7526ae8a88cd1b3d8ce71a7d19b6503da8149b2e667fc7a12f9b899041c1665d39e38245ed3a59ab68de648ea31040c3829aa695a5a45211d + languageName: node + linkType: hard + +"webpack@npm:^5.97.0": + version: 5.97.1 + resolution: "webpack@npm:5.97.1" + dependencies: + "@types/eslint-scope": "npm:^3.7.7" + "@types/estree": "npm:^1.0.6" + "@webassemblyjs/ast": "npm:^1.14.1" + "@webassemblyjs/wasm-edit": "npm:^1.14.1" + "@webassemblyjs/wasm-parser": "npm:^1.14.1" + acorn: "npm:^8.14.0" + browserslist: "npm:^4.24.0" + chrome-trace-event: "npm:^1.0.2" + enhanced-resolve: "npm:^5.17.1" + es-module-lexer: "npm:^1.2.1" + eslint-scope: "npm:5.1.1" + events: "npm:^3.2.0" + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.2.11" + json-parse-even-better-errors: "npm:^2.3.1" + loader-runner: "npm:^4.2.0" + mime-types: "npm:^2.1.27" + neo-async: "npm:^2.6.2" + schema-utils: "npm:^3.2.0" + tapable: "npm:^2.1.1" + terser-webpack-plugin: "npm:^5.3.10" + watchpack: "npm:^2.4.1" + webpack-sources: "npm:^3.2.3" + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 10/665bd3b8c84b20f0b1f250159865e4d3e9b76c682030313d49124d5f8e96357ccdcc799dd9fe0ebf010fdb33dbc59d9863d79676a308e868e360ac98f7c09987 + languageName: node + linkType: hard + +"webpackbar@npm:^7.0.0": + version: 7.0.0 + resolution: "webpackbar@npm:7.0.0" + dependencies: + ansis: "npm:^3.2.0" + consola: "npm:^3.2.3" + pretty-time: "npm:^1.1.0" + std-env: "npm:^3.7.0" + peerDependencies: + "@rspack/core": "*" + webpack: 3 || 4 || 5 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10/d123164e26cf3ab77611574602cc2bdd339b3f7e929074d90b53bd4409ab1b778e746cd0ea232f78a7746a938638d1bc4d218fe69aff396c41c77da15a26e659 + languageName: node + linkType: hard + "websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": version: 0.7.4 resolution: "websocket-driver@npm:0.7.4" @@ -40898,6 +40709,13 @@ __metadata: languageName: node linkType: hard +"whatwg-mimetype@npm:^2.3.0": + version: 2.3.0 + resolution: "whatwg-mimetype@npm:2.3.0" + checksum: 10/3582c1d74d708716013433bbab45cb9b31ef52d276adfbe2205d948be1ec9bb1a4ac05ce6d9045f3acc4104489e1344c857b14700002385a4b997a5673ff6416 + languageName: node + linkType: hard + "whatwg-mimetype@npm:^4.0.0": version: 4.0.0 resolution: "whatwg-mimetype@npm:4.0.0" @@ -40926,16 +40744,6 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^14.1.1": - version: 14.2.0 - resolution: "whatwg-url@npm:14.2.0" - dependencies: - tr46: "npm:^5.1.0" - webidl-conversions: "npm:^7.0.0" - checksum: 10/f0a95b0601c64f417c471536a2d828b4c16fe37c13662483a32f02f183ed0f441616609b0663fb791e524e8cd56d9a86dd7366b1fc5356048ccb09b576495e7c - languageName: node - linkType: hard - "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" @@ -41105,6 +40913,18 @@ __metadata: languageName: node linkType: hard +"why-is-node-running@npm:^2.3.0": + version: 2.3.0 + resolution: "why-is-node-running@npm:2.3.0" + dependencies: + siginfo: "npm:^2.0.0" + stackback: "npm:0.0.2" + bin: + why-is-node-running: cli.js + checksum: 10/0de6e6cd8f2f94a8b5ca44e84cf1751eadcac3ebedcdc6e5fbbe6c8011904afcbc1a2777c53496ec02ced7b81f2e7eda61e76bf8262a8bc3ceaa1f6040508051 + languageName: node + linkType: hard + "wicg-inert@npm:^3.0.3": version: 3.1.2 resolution: "wicg-inert@npm:3.1.2" @@ -41128,53 +40948,6 @@ __metadata: languageName: node linkType: hard -"worker-factory@npm:^7.0.45": - version: 7.0.45 - resolution: "worker-factory@npm:7.0.45" - dependencies: - "@babel/runtime": "npm:^7.28.3" - fast-unique-numbers: "npm:^9.0.23" - tslib: "npm:^2.8.1" - checksum: 10/94320723e9e890615e8ce2eb0c946ea124262a1e43939a0ce5c332d33fad72f8111899f54654426dd8049a78f14ee486e78abb6971765a1ab02e3c18e10803a7 - languageName: node - linkType: hard - -"worker-timers-broker@npm:^8.0.10": - version: 8.0.10 - resolution: "worker-timers-broker@npm:8.0.10" - dependencies: - "@babel/runtime": "npm:^7.28.3" - broker-factory: "npm:^3.1.9" - fast-unique-numbers: "npm:^9.0.23" - tslib: "npm:^2.8.1" - worker-timers-worker: "npm:^9.0.10" - checksum: 10/074445ab1732c4f0185f30ff4018ad0a6a2a93d233c10fa2591ca84d35050378d0342080703341cfe2fab79fcf1ab976b3b8c095ce0c47f1d043e4b6177e5bc4 - languageName: node - linkType: hard - -"worker-timers-worker@npm:^9.0.10": - version: 9.0.10 - resolution: "worker-timers-worker@npm:9.0.10" - dependencies: - "@babel/runtime": "npm:^7.28.3" - tslib: "npm:^2.8.1" - worker-factory: "npm:^7.0.45" - checksum: 10/162e174cb80539c7bc34c2cd922cf9259be8ab520cc48e8b40c6c63f19cfb682fe2a624e2a1f4123fe14d0f8b5614bbac8aeef4de5587e0d6da7e1fc391a870c - languageName: node - linkType: hard - -"worker-timers@npm:^8.0.23": - version: 8.0.24 - resolution: "worker-timers@npm:8.0.24" - dependencies: - "@babel/runtime": "npm:^7.28.3" - tslib: "npm:^2.8.1" - worker-timers-broker: "npm:^8.0.10" - worker-timers-worker: "npm:^9.0.10" - checksum: 10/d79833605f8ee17f71b0762d5bcde1c986bf05d6c13f7f50c730b9d47ca25c988d5f0b75bab68a61681576f15d35435b49fe110edb776fc0d802878687606f67 - languageName: node - linkType: hard - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" @@ -41236,7 +41009,7 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:5.0.1, write-file-atomic@npm:^5.0.0, write-file-atomic@npm:^5.0.1": +"write-file-atomic@npm:5.0.1, write-file-atomic@npm:^5.0.0": version: 5.0.1 resolution: "write-file-atomic@npm:5.0.1" dependencies: @@ -41333,9 +41106,9 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.18.0": - version: 8.18.0 - resolution: "ws@npm:8.18.0" +"ws@npm:^8.13.0": + version: 8.18.2 + resolution: "ws@npm:8.18.2" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -41344,13 +41117,13 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10/70dfe53f23ff4368d46e4c0b1d4ca734db2c4149c6f68bc62cb16fc21f753c47b35fcc6e582f3bdfba0eaeb1c488cddab3c2255755a5c3eecb251431e42b3ff6 + checksum: 10/018e04ec95561d88248d53a2eaf094b4ae131e9b062f2679e6e8a62f04649bc543448f1e038125225ac6bbb25f54c1e65d7a2cc9dbc1e28b43e5e6b7162ad88e languageName: node linkType: hard -"ws@npm:^8.18.3": - version: 8.18.3 - resolution: "ws@npm:8.18.3" +"ws@npm:^8.18.0": + version: 8.18.0 + resolution: "ws@npm:8.18.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -41359,7 +41132,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10/725964438d752f0ab0de582cd48d6eeada58d1511c3f613485b5598a83680bedac6187c765b0fe082e2d8cc4341fc57707c813ae780feee82d0c5efe6a4c61b6 + checksum: 10/70dfe53f23ff4368d46e4c0b1d4ca734db2c4149c6f68bc62cb16fc21f753c47b35fcc6e582f3bdfba0eaeb1c488cddab3c2255755a5c3eecb251431e42b3ff6 languageName: node linkType: hard @@ -41586,13 +41359,6 @@ __metadata: languageName: node linkType: hard -"yoctocolors-cjs@npm:^2.1.2": - version: 2.1.3 - resolution: "yoctocolors-cjs@npm:2.1.3" - checksum: 10/b2144b38807673a4254dae06fe1a212729550609e606289c305e45c585b36fab1dbba44fe6cde90db9b28be465ec63f4c2a50867aeec6672f6bc36b6c9a361a0 - languageName: node - linkType: hard - "zen-observable-ts@npm:0.8.19": version: 0.8.19 resolution: "zen-observable-ts@npm:0.8.19" From 0dbca4c4f90a44e86d11af4f1e1b3b9245fbe433 Mon Sep 17 00:00:00 2001 From: Pavel Denisjuk Date: Fri, 5 Sep 2025 11:54:34 +0200 Subject: [PATCH 02/13] wip: migrate tests to vitest --- .../wac/utils/listPackagesWithJestTests.ts | 90 +- .../defaultPermissionsMerger.test.ts | 1 + .../api-aco/__tests__/filter.hooks.test.ts | 1 + packages/api-aco/__tests__/filter.so.test.ts | 1 + .../api-aco/__tests__/flp.apiTokens.test.ts | 1 + packages/api-aco/__tests__/flp.cms.test.ts | 3 +- packages/api-aco/__tests__/flp.fm.test.ts | 746 +++++++++-------- packages/api-aco/__tests__/flp.tasks.test.ts | 10 +- .../__tests__/folder.extensions.test.ts | 1 + .../api-aco/__tests__/folder.flp.crud.test.ts | 1 + .../__tests__/folder.flp.inheritance.test.ts | 1 + .../__tests__/folder.flp.security.test.ts | 1 + .../api-aco/__tests__/folder.hooks.test.ts | 1 + packages/api-aco/__tests__/folder.so.test.ts | 1 + .../api-aco/__tests__/model.graphql.test.ts | 1 + .../api-aco/__tests__/record.graphql.test.ts | 1 + .../api-aco/__tests__/record.hooks.test.ts | 12 +- packages/api-aco/__tests__/record.so.test.ts | 5 +- .../__tests__/utils/expectNotAuthorized.ts | 2 + packages/api-aco/jest.setup.js | 18 - packages/api-aco/tsconfig.json | 2 +- packages/api-aco/vitest.setup.ts | 15 + packages/api-admin-settings/.typedoc.json | 4 - .../__tests__/services/settings.test.ts | 3 +- .../__tests__/setup/setupAfterEnv.js | 3 +- packages/api-admin-settings/jest.config.js | 3 - packages/api-admin-settings/vitest.config.ts | 5 + .../__tests__/__api__/setupAfterEnv.js | 3 +- .../api-apw-scheduler-so-ddb/.typedoc.json | 4 - .../__tests__/__api__/setupAfterEnv.js | 3 +- .../api-apw-scheduler-so-ddb/jest.config.js | 3 - packages/api-apw/.typedoc.json | 4 - .../api-apw/__tests__/graphql/access.test.ts | 544 ------------ .../addChangeRequestInContentReview.test.ts | 555 ------------- .../graphql/changeRequest.crud.test.ts | 368 --------- .../__tests__/graphql/comment.crud.test.ts | 375 --------- .../graphql/commentOnChangeRequest.test.ts | 420 ---------- .../graphql/contentReview.crud.test.ts | 481 ----------- .../contentReview.linkToContent.test.ts | 230 ------ ...deleteEntrieContentReviewArtifacts.test.ts | 299 ------- .../graphql/entryPublishingWorkflow.test.ts | 778 ------------------ .../graphql/isReviewRequired.test.ts | 90 -- .../graphql/mocks/access/permissions.ts | 35 - .../__tests__/graphql/mocks/access/plugins.ts | 30 - .../__tests__/graphql/mocks/changeRequest.ts | 35 - .../__tests__/graphql/mocks/workflows.ts | 157 ---- .../graphql/pagePublishingWorkflow.test.ts | 582 ------------- .../pendingChangeRequestsCount.test.ts | 570 ------------- .../__tests__/graphql/provideSignOff.test.ts | 458 ----------- .../__tests__/graphql/retractSignOff.test.ts | 323 -------- .../__tests__/graphql/reviewer.crud.test.ts | 488 ----------- .../__tests__/graphql/scheduleAction.test.ts | 263 ------ .../graphql/totalCommentsCount.test.ts | 472 ----------- .../__tests__/graphql/workflow.crud.test.ts | 551 ------------- .../graphql/workflowHooks.crud.test.ts | 681 --------------- .../scheduleAction/crud.cms_entry.test.ts | 458 ----------- .../scheduleAction/crud.page.test.ts | 420 ---------- .../scheduleAction/tenancySecurity.ts | 64 -- .../__tests__/scheduleAction/useHandler.ts | 102 --- packages/api-apw/__tests__/types.ts | 5 - .../api-apw/__tests__/utils/cms.helpers.ts | 258 ------ packages/api-apw/__tests__/utils/context.ts | 69 -- .../__tests__/utils/createGraphQlHandler.ts | 415 ---------- .../__tests__/utils/defaultIdentity.ts | 26 - .../__tests__/utils/graphql/categories.ts | 44 - .../__tests__/utils/graphql/changeRequest.ts | 94 --- .../__tests__/utils/graphql/cms.entry.ts | 83 -- .../__tests__/utils/graphql/cms.group.ts | 32 - .../__tests__/utils/graphql/cms.model.ts | 70 -- .../__tests__/utils/graphql/comment.ts | 90 -- .../__tests__/utils/graphql/contentReview.ts | 182 ---- .../api-apw/__tests__/utils/graphql/login.ts | 23 - .../api-apw/__tests__/utils/graphql/pages.ts | 223 ----- .../__tests__/utils/graphql/reviewer.ts | 60 -- .../__tests__/utils/graphql/workflow.ts | 101 --- packages/api-apw/__tests__/utils/helpers.ts | 178 ---- .../__tests__/utils/tenancySecurity.ts | 77 -- .../__tests__/utils/useGraphQlHandler.ts | 5 - packages/api-apw/jest.setup.js | 14 - packages/api-audit-logs/src/app/index.ts | 3 - .../__tests__/getIdentity.test.ts | 1 + .../api-authentication-cognito/jest.config.js | 5 - .../vitest.config.ts | 5 + .../authenticateUsingHttpHeader.test.ts | 1 + .../__tests__/createAuthentication.test.ts | 1 + packages/api-authentication/jest.config.js | 5 - packages/api-authentication/tsconfig.json | 2 +- packages/api-authentication/vitest.config.ts | 5 + .../__tests__/Operations.test.ts | 1 + .../__tests__/OperationsBuilder.test.ts | 1 + .../__tests__/event.test.ts | 8 +- .../__tests__/transfer.test.ts | 4 +- .../jest.config.js | 7 - .../tsconfig.json | 2 +- .../vitest.config.ts | 8 + .../{.babelrc.js => .babelrc.cjs} | 0 .../__tests__/folder.extensions.test.ts | 1 + packages/api-file-manager-aco/jest.setup.js | 13 - packages/api-file-manager-aco/package.json | 1 + packages/api-file-manager-aco/tsconfig.json | 2 +- .../api-file-manager-aco/vitest.config.ts | 15 + .../api-file-manager-aco/webiny.config.js | 8 +- packages/api-file-manager-ddb/.typedoc.json | 4 - .../__tests__/__api__/setupAfterEnv.js | 3 +- .../__tests__/file.customDates.test.ts | 1 + .../__tests__/file.customIdentities.test.ts | 1 + .../__tests__/file.extensions.test.ts | 1 + .../__tests__/file.lifecycle.test.ts | 1 + .../__tests__/fileModelModifier.test.ts | 3 +- .../__tests__/fileSchema.test.ts | 1 + .../api-file-manager/__tests__/files.test.ts | 10 +- .../__tests__/filesSecurity.test.ts | 6 +- .../__tests__/filesSettings.lifecycle.test.ts | 1 + .../__tests__/filesSettings.test.ts | 1 + packages/api-file-manager/jest.setup.js | 12 - .../src/FileManagerContextSetup.ts | 1 - packages/api-file-manager/tsconfig.json | 2 +- packages/api-file-manager/vitest.setup.ts | 14 + packages/api-headless-cms-aco/src/index.ts | 1 - .../__tests__/__api__/setupAfterEnv.js | 3 +- .../__tests__/__api__/setupAfterEnv.js | 3 +- packages/api-i18n-content/jest.config.js | 3 - packages/api-i18n-ddb/.typedoc.json | 4 - .../__tests__/__api__/setupAfterEnv.js | 3 +- .../api-log/__tests__/createLogger.test.ts | 1 + packages/api-log/__tests__/crud/crud.test.ts | 2 + .../logger/dynamodb/DynamoDbLogger.test.ts | 10 +- .../dynamodb/DynamoDbLoggerKeys.test.ts | 1 + .../DynamoDbStorageOperations.test.ts | 1 + .../api-log/__tests__/setup/setupAfterEnv.js | 7 + .../tasks/pruneLogs/PruneLogs.test.ts | 1 + packages/api-log/jest.setup.js | 6 - packages/api-log/tsconfig.json | 2 +- packages/api-log/vitest.config.ts | 5 + .../api-mailer/__tests__/password.test.ts | 1 + .../__tests__/settings.crud.test.ts | 4 +- .../__tests__/settings.graphql.test.ts | 4 +- .../__tests__/setup/setupAfterEnv.js | 3 +- .../__tests__/transporter.crud.test.ts | 32 +- packages/api-mailer/jest.setup.js | 11 - packages/api-mailer/tsconfig.json | 2 +- packages/api-mailer/vitest.config.ts | 13 + packages/api-page-builder-aco/src/index.ts | 6 - .../__tests__/__api__/setupAfterEnv.js | 3 +- .../__tests__/__api__/setupAfterEnv.js | 3 +- .../__tests__/setup/setupAfterEnv.js | 3 +- .../__tests__/__api__/presets.js | 10 +- .../__tests__/__api__/setupAfterEnv.js | 3 +- .../__tests__/__api__/setupAfterEnv.js | 3 +- .../__tests__/graphql/getLockRecord.test.ts | 1 + .../graphql/getLockedEntryLockRecord.test.ts | 1 + .../__tests__/graphql/isEntryLocked.test.ts | 1 + .../__tests__/graphql/listLockRecords.test.ts | 1 + .../__tests__/graphql/lockEntry.test.ts | 1 + .../graphql/requestEntryUnlock.test.ts | 1 + .../__tests__/graphql/unlockEntry.test.ts | 1 + .../__tests__/graphql/updateEntryLock.test.ts | 1 + .../useCase/isEntryLockedUseCase.test.ts | 1 + .../useCase/kickOutCurrentUser.test.ts | 4 +- .../useCase/lockEntryUseCase.test.ts | 1 + .../useCase/unlockEntryRequestUseCase.test.ts | 1 + .../useCase/unlockEntryUseCase.test.ts | 8 +- .../utils/convertWhereCondition.test.ts | 1 + .../utils/validateSameIdentity.test.ts | 11 +- packages/api-record-locking/jest.setup.js | 11 - packages/api-record-locking/tsconfig.json | 2 +- packages/api-record-locking/vitest.config.ts | 13 + .../__tests__/login.test.ts | 1 + .../__tests__/users.test.ts | 1 + packages/api-security-cognito/jest.setup.js | 11 - packages/api-security-cognito/tsconfig.json | 2 +- packages/api-security-cognito/vitest.setup.ts | 16 + .../__tests__/__api__/setupAfterEnv.js | 3 +- .../api-security/__tests__/apiKeys.test.ts | 10 +- .../api-security/__tests__/groups.test.ts | 1 + .../api-security/__tests__/identity.test.ts | 3 +- .../api-security/__tests__/install.test.ts | 1 + .../__tests__/lifecycleEvents.apiKeys.test.ts | 1 + .../__tests__/lifecycleEvents.groups.test.ts | 1 + packages/api-security/__tests__/login.test.ts | 1 + .../__tests__/parallelQueries.test.ts | 1 + packages/api-security/__tests__/teams.test.ts | 1 + .../aacl/customPermissionsFiltering.test.ts | 1 + ...stomPermissionsHasAccessOldVersion.test.ts | 1 + .../customPermissionsHasWcpAccess.test.ts | 6 +- .../aacl/customPermissionsNoWcpAccess.test.ts | 10 +- .../__tests__/withoutAuthorization.test.ts | 1 + .../__tests__/handlers/graphQlHandler.ts | 6 +- .../__tests__/handlers/helpers/core.ts | 27 - .../__tests__/handlers/logger/logger.test.ts | 1 + .../__tests__/install.test.ts | 49 +- .../__tests__/introspect.test.ts | 8 +- packages/api-serverless-cms/jest.setup.js | 15 - packages/api-serverless-cms/tsconfig.json | 2 +- packages/api-serverless-cms/vitest.setup.ts | 18 + .../__tests__/__api__/setupAfterEnv.js | 3 +- .../api-tenant-manager/__tests__/crud.test.ts | 1 + packages/api-tenant-manager/jest.setup.js | 9 - packages/api-tenant-manager/tsconfig.json | 2 +- packages/api-tenant-manager/vitest.setup.ts | 14 + packages/api-wcp/__tests__/context.test.ts | 1 + packages/api-wcp/__tests__/utils.test.ts | 1 + packages/api-wcp/jest.config.js | 5 - packages/api-wcp/tsconfig.json | 2 +- packages/api-wcp/vitest.config.ts | 10 + .../context/websocketsContext.test.ts | 5 +- .../__tests__/graphql/crud.graphql.test.ts | 4 +- .../__tests__/graphql/schema.graphql.test.ts | 1 + .../__tests__/handler/handler.test.ts | 4 +- .../__tests__/handler/register.test.ts | 1 + .../websocketsConnectionRegistry.test.ts | 1 + .../__tests__/runner/websocketsRunner.test.ts | 1 + .../transport/WebsocketsTransport.test.ts | 12 +- .../{middleware.ts => middleware.test.ts} | 1 + .../WebsocketsEventValidator.test.ts | 1 + packages/api-websockets/jest.setup.js | 11 - packages/api-websockets/tsconfig.json | 2 +- packages/api-websockets/vitest.config.ts | 16 + packages/api/__tests__/Context.test.ts | 8 +- .../api/__tests__/ServiceDiscovery.test.ts | 1 + packages/api/__tests__/benchmark.test.ts | 10 +- packages/api/__tests__/setup/setupAfterEnv.js | 5 +- packages/api/jest.setup.js | 5 - packages/api/tsconfig.json | 94 +-- packages/api/vitest.config.ts | 5 + .../__tests__/migration.test.ts | 12 +- .../__tests__/setup/setupAfterEnv.js | 3 +- packages/data-migration/jest.config.js | 3 - packages/data-migration/tsconfig.json | 2 +- packages/data-migration/vitest.config.ts | 5 + .../__tests__/DynamoDbDriver.test.ts | 1 + .../__tests__/assignFields.test.ts | 1 + .../__tests__/plugins/attributesUtil.test.ts | 1 + .../__tests__/plugins/filterUtil.test.ts | 1 + .../__tests__/plugins/filters.test.ts | 1 + .../__tests__/setup/setupAfterEnv.js | 3 +- packages/db-dynamodb/jest.config.js | 5 - packages/db-dynamodb/tsconfig.json | 2 +- packages/db-dynamodb/vitest.config.ts | 5 + .../di-container/__tests__/container.test.ts | 6 +- packages/di-container/jest.config.js | 10 - packages/di-container/tsconfig.json | 2 +- packages/di-container/vitest.config.ts | 11 + .../__tests__/composedEventHandlers.test.ts | 1 + .../handler-aws/__tests__/eventBridge.test.ts | 1 + .../handler-aws/__tests__/gateway.test.ts | 1 + .../handler-aws/__tests__/handler.test.ts | 1 + packages/handler-aws/__tests__/raw.test.ts | 1 + packages/handler-aws/__tests__/s3.test.ts | 1 + packages/handler-aws/jest.config.js | 5 - packages/handler-aws/tsconfig.json | 2 +- packages/handler-aws/vitest.config.ts | 5 + packages/handler-client/jest.config.js | 5 - .../__tests__/DateTimeZScalar.test.ts | 1 + .../__tests__/NumberScalar.test.ts | 1 + .../__tests__/TimeScalar.test.ts | 1 + .../disableIntrospectionQuery.test.ts | 1 + .../handler-graphql/__tests__/graphql.test.ts | 1 + packages/handler-graphql/jest.config.js | 5 - packages/handler-graphql/tsconfig.json | 2 +- packages/handler-graphql/vitest.config.ts | 5 + packages/handler/__tests__/benchmark.test.ts | 5 +- packages/handler/__tests__/caching.test.ts | 1 + .../__tests__/customErrorHandler.test.ts | 1 + packages/handler/__tests__/headers.test.ts | 1 + .../handler/__tests__/modifyFastify.test.ts | 1 + packages/handler/__tests__/onRequest.test.ts | 6 +- packages/handler/__tests__/routes.test.ts | 1 + packages/handler/jest.config.js | 5 - packages/handler/tsconfig.json | 2 +- packages/handler/vitest.config.ts | 5 + .../__tests__/setup/setupAfterEnv.js | 3 +- 272 files changed, 902 insertions(+), 12882 deletions(-) delete mode 100644 packages/api-aco/jest.setup.js create mode 100644 packages/api-aco/vitest.setup.ts delete mode 100644 packages/api-admin-settings/.typedoc.json delete mode 100644 packages/api-admin-settings/jest.config.js create mode 100644 packages/api-admin-settings/vitest.config.ts delete mode 100644 packages/api-apw-scheduler-so-ddb/.typedoc.json delete mode 100644 packages/api-apw-scheduler-so-ddb/jest.config.js delete mode 100644 packages/api-apw/.typedoc.json delete mode 100644 packages/api-apw/__tests__/graphql/access.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/addChangeRequestInContentReview.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/changeRequest.crud.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/comment.crud.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/commentOnChangeRequest.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/contentReview.crud.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/contentReview.linkToContent.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/deleteEntrieContentReviewArtifacts.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/entryPublishingWorkflow.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/isReviewRequired.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/mocks/access/permissions.ts delete mode 100644 packages/api-apw/__tests__/graphql/mocks/access/plugins.ts delete mode 100644 packages/api-apw/__tests__/graphql/mocks/changeRequest.ts delete mode 100644 packages/api-apw/__tests__/graphql/mocks/workflows.ts delete mode 100644 packages/api-apw/__tests__/graphql/pagePublishingWorkflow.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/pendingChangeRequestsCount.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/provideSignOff.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/retractSignOff.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/reviewer.crud.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/scheduleAction.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/totalCommentsCount.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/workflow.crud.test.ts delete mode 100644 packages/api-apw/__tests__/graphql/workflowHooks.crud.test.ts delete mode 100644 packages/api-apw/__tests__/scheduleAction/crud.cms_entry.test.ts delete mode 100644 packages/api-apw/__tests__/scheduleAction/crud.page.test.ts delete mode 100644 packages/api-apw/__tests__/scheduleAction/tenancySecurity.ts delete mode 100644 packages/api-apw/__tests__/scheduleAction/useHandler.ts delete mode 100644 packages/api-apw/__tests__/types.ts delete mode 100644 packages/api-apw/__tests__/utils/cms.helpers.ts delete mode 100644 packages/api-apw/__tests__/utils/context.ts delete mode 100644 packages/api-apw/__tests__/utils/createGraphQlHandler.ts delete mode 100644 packages/api-apw/__tests__/utils/defaultIdentity.ts delete mode 100644 packages/api-apw/__tests__/utils/graphql/categories.ts delete mode 100644 packages/api-apw/__tests__/utils/graphql/changeRequest.ts delete mode 100644 packages/api-apw/__tests__/utils/graphql/cms.entry.ts delete mode 100644 packages/api-apw/__tests__/utils/graphql/cms.group.ts delete mode 100644 packages/api-apw/__tests__/utils/graphql/cms.model.ts delete mode 100644 packages/api-apw/__tests__/utils/graphql/comment.ts delete mode 100644 packages/api-apw/__tests__/utils/graphql/contentReview.ts delete mode 100644 packages/api-apw/__tests__/utils/graphql/login.ts delete mode 100644 packages/api-apw/__tests__/utils/graphql/pages.ts delete mode 100644 packages/api-apw/__tests__/utils/graphql/reviewer.ts delete mode 100644 packages/api-apw/__tests__/utils/graphql/workflow.ts delete mode 100644 packages/api-apw/__tests__/utils/helpers.ts delete mode 100644 packages/api-apw/__tests__/utils/tenancySecurity.ts delete mode 100644 packages/api-apw/__tests__/utils/useGraphQlHandler.ts delete mode 100644 packages/api-apw/jest.setup.js delete mode 100644 packages/api-authentication-cognito/jest.config.js create mode 100644 packages/api-authentication-cognito/vitest.config.ts delete mode 100644 packages/api-authentication/jest.config.js create mode 100644 packages/api-authentication/vitest.config.ts delete mode 100644 packages/api-dynamodb-to-elasticsearch/jest.config.js create mode 100644 packages/api-dynamodb-to-elasticsearch/vitest.config.ts rename packages/api-file-manager-aco/{.babelrc.js => .babelrc.cjs} (100%) delete mode 100644 packages/api-file-manager-aco/jest.setup.js create mode 100644 packages/api-file-manager-aco/vitest.config.ts delete mode 100644 packages/api-file-manager-ddb/.typedoc.json delete mode 100644 packages/api-file-manager/jest.setup.js create mode 100644 packages/api-file-manager/vitest.setup.ts delete mode 100644 packages/api-i18n-content/jest.config.js delete mode 100644 packages/api-i18n-ddb/.typedoc.json create mode 100644 packages/api-log/__tests__/setup/setupAfterEnv.js delete mode 100644 packages/api-log/jest.setup.js create mode 100644 packages/api-log/vitest.config.ts delete mode 100644 packages/api-mailer/jest.setup.js create mode 100644 packages/api-mailer/vitest.config.ts delete mode 100644 packages/api-record-locking/jest.setup.js create mode 100644 packages/api-record-locking/vitest.config.ts delete mode 100644 packages/api-security-cognito/jest.setup.js create mode 100644 packages/api-security-cognito/vitest.setup.ts delete mode 100644 packages/api-serverless-cms/jest.setup.js create mode 100644 packages/api-serverless-cms/vitest.setup.ts delete mode 100644 packages/api-tenant-manager/jest.setup.js create mode 100644 packages/api-tenant-manager/vitest.setup.ts delete mode 100644 packages/api-wcp/jest.config.js create mode 100644 packages/api-wcp/vitest.config.ts rename packages/api-websockets/__tests__/utils/{middleware.ts => middleware.test.ts} (98%) delete mode 100644 packages/api-websockets/jest.setup.js create mode 100644 packages/api-websockets/vitest.config.ts delete mode 100644 packages/api/jest.setup.js create mode 100644 packages/api/vitest.config.ts delete mode 100644 packages/data-migration/jest.config.js create mode 100644 packages/data-migration/vitest.config.ts delete mode 100644 packages/db-dynamodb/jest.config.js create mode 100644 packages/db-dynamodb/vitest.config.ts delete mode 100644 packages/di-container/jest.config.js create mode 100644 packages/di-container/vitest.config.ts delete mode 100644 packages/handler-aws/jest.config.js create mode 100644 packages/handler-aws/vitest.config.ts delete mode 100644 packages/handler-client/jest.config.js delete mode 100644 packages/handler-graphql/jest.config.js create mode 100644 packages/handler-graphql/vitest.config.ts delete mode 100644 packages/handler/jest.config.js create mode 100644 packages/handler/vitest.config.ts diff --git a/.github/workflows/wac/utils/listPackagesWithJestTests.ts b/.github/workflows/wac/utils/listPackagesWithJestTests.ts index 18d7f37ec47..b9eec764901 100644 --- a/.github/workflows/wac/utils/listPackagesWithJestTests.ts +++ b/.github/workflows/wac/utils/listPackagesWithJestTests.ts @@ -93,69 +93,6 @@ const CUSTOM_HANDLERS: Record Array> = { ]; }, - "api-form-builder": () => { - return [ - { cmd: "packages/api-form-builder -- --storage=ddb-es,ddb", storage: "ddb-es" }, - { cmd: "packages/api-form-builder -- --storage=ddb-os,ddb", storage: "ddb-os" }, - { cmd: "packages/api-form-builder -- --storage=ddb", storage: "ddb" } - ]; - }, - - "api-form-builder-so-ddb-es": () => { - return [ - { - cmd: "packages/api-form-builder-so-ddb-es -- --storage=ddb-es,ddb", - storage: "ddb-es" - }, - { - cmd: "packages/api-form-builder-so-ddb-es -- --storage=ddb-os,ddb", - storage: "ddb-os" - } - ]; - }, - - "api-page-builder": () => { - return [ - ...shardPackageTestExecution({ - cmd: "packages/api-page-builder -- --storage=ddb-es,ddb", - storage: "ddb-es" - }), - ...shardPackageTestExecution({ - cmd: "packages/api-page-builder -- --storage=ddb-os,ddb", - storage: "ddb-os" - }), - ...shardPackageTestExecution({ - cmd: "packages/api-page-builder -- --storage=ddb", - storage: "ddb" - }) - ]; - }, - "api-page-builder-so-ddb-es": () => { - return [ - { - cmd: "packages/api-page-builder-so-ddb-es -- --storage=ddb-es,ddb", - storage: "ddb-es" - }, - { - cmd: "packages/api-page-builder-so-ddb-es -- --storage=ddb-os,ddb", - storage: "ddb-os" - } - ]; - }, - - "api-page-builder-import-export": () => { - return [ - { - cmd: "packages/api-page-builder-import-export -- --storage=ddb", - storage: "ddb" - } - ]; - }, - - "api-prerendering-service": () => { - return [{ cmd: "packages/api-prerendering-service -- --storage=ddb", storage: "ddb" }]; - }, - "api-mailer": () => { return [ { cmd: "packages/api-mailer -- --storage=ddb", storage: "ddb" }, @@ -225,13 +162,13 @@ const CUSTOM_HANDLERS: Record Array> = { } ]; }, - "api-apw": () => { - return [ - { cmd: "packages/api-apw -- --storage=ddb", storage: "ddb" } - // TODO: With ddb-es setup, some tests are failing! - // "packages/api-apw -- --storage=ddb-es,ddb" - ]; - }, + // "api-apw": () => { + // return [ + // { cmd: "packages/api-apw -- --storage=ddb", storage: "ddb" } + // // TODO: With ddb-es setup, some tests are failing! + // // "packages/api-apw -- --storage=ddb-es,ddb" + // ]; + // }, "api-aco": () => { return [ { cmd: "packages/api-aco -- --storage=ddb", storage: "ddb" }, @@ -246,19 +183,6 @@ const CUSTOM_HANDLERS: Record Array> = { { cmd: "packages/api-audit-logs -- --storage=ddb-os,ddb", storage: "ddb-os" } ]; }, - "api-page-builder-aco": () => { - return [ - { cmd: "packages/api-page-builder-aco -- --storage=ddb", storage: "ddb" }, - { - cmd: "packages/api-page-builder-aco -- --storage=ddb-es,ddb", - storage: "ddb-es" - }, - { - cmd: "packages/api-page-builder-aco -- --storage=ddb-os,ddb", - storage: "ddb-os" - } - ]; - }, "app-aco": () => { return [ { diff --git a/packages/api-aco/__tests__/defaultPermissionsMerger.test.ts b/packages/api-aco/__tests__/defaultPermissionsMerger.test.ts index dd87efd5f80..a7a310384e4 100644 --- a/packages/api-aco/__tests__/defaultPermissionsMerger.test.ts +++ b/packages/api-aco/__tests__/defaultPermissionsMerger.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { DefaultPermissionsMerger } from "~/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/DefaultPermissionsMerger"; import { createIdentity } from "./utils/identity"; import { SecurityPermission } from "@webiny/api-security/types"; diff --git a/packages/api-aco/__tests__/filter.hooks.test.ts b/packages/api-aco/__tests__/filter.hooks.test.ts index 076f49962da..e87c89c42b3 100644 --- a/packages/api-aco/__tests__/filter.hooks.test.ts +++ b/packages/api-aco/__tests__/filter.hooks.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; import { assignFilterLifecycleEvents, tracker } from "./mocks/lifecycle.mock"; diff --git a/packages/api-aco/__tests__/filter.so.test.ts b/packages/api-aco/__tests__/filter.so.test.ts index e825942f218..8e9fcb76252 100644 --- a/packages/api-aco/__tests__/filter.so.test.ts +++ b/packages/api-aco/__tests__/filter.so.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { filterMocks } from "./mocks/filter.mock"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; import { userMock } from "~tests/mocks/user.mock"; diff --git a/packages/api-aco/__tests__/flp.apiTokens.test.ts b/packages/api-aco/__tests__/flp.apiTokens.test.ts index 01bb64e7206..3b97cd51e5d 100644 --- a/packages/api-aco/__tests__/flp.apiTokens.test.ts +++ b/packages/api-aco/__tests__/flp.apiTokens.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; import { SecurityIdentity } from "@webiny/api-security/types"; diff --git a/packages/api-aco/__tests__/flp.cms.test.ts b/packages/api-aco/__tests__/flp.cms.test.ts index 076fb5f2db8..2f8b2270611 100644 --- a/packages/api-aco/__tests__/flp.cms.test.ts +++ b/packages/api-aco/__tests__/flp.cms.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; import { SecurityIdentity } from "@webiny/api-security/types"; import { expectNotAuthorized } from "./utils/expectNotAuthorized"; @@ -435,7 +436,7 @@ describe("Folder Level Permissions - CMS GraphQL API", () => { } }); - it("as a user with 'viewer' access to a folder, I should not be able to create, update, or delete content in it", async () => { + test("as a user with 'viewer' access to a folder, I should not be able to create, update, or delete content in it", async () => { const gqlIdentityA = useGraphQlHandler({ identity: identityA }); const gqlIdentityC = useGraphQlHandler({ identity: identityC, diff --git a/packages/api-aco/__tests__/flp.fm.test.ts b/packages/api-aco/__tests__/flp.fm.test.ts index c9d4ce2d170..c9bf79a82a0 100644 --- a/packages/api-aco/__tests__/flp.fm.test.ts +++ b/packages/api-aco/__tests__/flp.fm.test.ts @@ -1,10 +1,8 @@ +import { describe, test, expect } from "vitest"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; import { expectNotAuthorized } from "./utils/expectNotAuthorized"; import { SecurityIdentity } from "@webiny/api-security/types"; import { mdbid } from "@webiny/utils"; -import { jest } from "@jest/globals"; - -jest.setTimeout(100_000); const FOLDER_TYPE = "FmFile"; @@ -28,6 +26,8 @@ const createSampleFileData = (overrides: Record = {}) => { }; }; +const testOptions = { timeout: 100_000 }; + describe("Folder Level Permissions - File Manager GraphQL API", () => { const gqlIdentityA = useGraphQlHandler({ identity: identityA }); const gqlIdentityB = useGraphQlHandler({ @@ -41,442 +41,462 @@ describe("Folder Level Permissions - File Manager GraphQL API", () => { test.todo("as a user without FM permissions, I should not be able to CRUD files"); - test("as a full-access user, I should be able to CRUD files in root folder", async () => { - const createdFiles = []; - for (let i = 1; i <= 4; i++) { - createdFiles.push( - await gqlIdentityA.fm - .createFile({ data: createSampleFileData() }) - .then(([response]) => { - return response.data.fileManager.createFile.data; - }) - ); - } - - await expect( - gqlIdentityA.fm.listFiles().then(([response]) => { - return response.data.fileManager.listFiles.data; - }) - ).resolves.toHaveLength(4); + test( + "as a full-access user, I should be able to CRUD files in root folder", + testOptions, + async () => { + const createdFiles = []; + for (let i = 1; i <= 4; i++) { + createdFiles.push( + await gqlIdentityA.fm + .createFile({ data: createSampleFileData() }) + .then(([response]) => { + return response.data.fileManager.createFile.data; + }) + ); + } - for (let i = 0; i < createdFiles.length; i++) { - const createdFile = createdFiles[i]; await expect( - gqlIdentityA.fm.getFile({ id: createdFile.id }).then(([response]) => { - return response.data.fileManager.getFile.data; + gqlIdentityA.fm.listFiles().then(([response]) => { + return response.data.fileManager.listFiles.data; }) - ).resolves.toEqual(createdFiles[i]); - } - }); + ).resolves.toHaveLength(4); - test("as a non-full-access user, I should be able to CRUD files in root folder", async () => { - const createdFiles = []; - for (let i = 1; i <= 4; i++) { - createdFiles.push( - await gqlIdentityB.fm - .createFile({ data: createSampleFileData() }) - .then(([response]) => { - return response.data.fileManager.createFile.data; + for (let i = 0; i < createdFiles.length; i++) { + const createdFile = createdFiles[i]; + await expect( + gqlIdentityA.fm.getFile({ id: createdFile.id }).then(([response]) => { + return response.data.fileManager.getFile.data; }) - ); + ).resolves.toEqual(createdFiles[i]); + } } + ); + + test( + "as a non-full-access user, I should be able to CRUD files in root folder", + testOptions, + async () => { + const createdFiles = []; + for (let i = 1; i <= 4; i++) { + createdFiles.push( + await gqlIdentityB.fm + .createFile({ data: createSampleFileData() }) + .then(([response]) => { + return response.data.fileManager.createFile.data; + }) + ); + } - await expect( - gqlIdentityB.fm.listFiles().then(([response]) => { - return response.data.fileManager.listFiles.data; - }) - ).resolves.toHaveLength(4); - - for (let i = 0; i < createdFiles.length; i++) { - const createdFile = createdFiles[i]; await expect( - gqlIdentityB.fm.getFile({ id: createdFile.id }).then(([response]) => { - return response.data.fileManager.getFile.data; + gqlIdentityB.fm.listFiles().then(([response]) => { + return response.data.fileManager.listFiles.data; }) - ).resolves.toEqual(createdFiles[i]); + ).resolves.toHaveLength(4); + + for (let i = 0; i < createdFiles.length; i++) { + const createdFile = createdFiles[i]; + await expect( + gqlIdentityB.fm.getFile({ id: createdFile.id }).then(([response]) => { + return response.data.fileManager.getFile.data; + }) + ).resolves.toEqual(createdFiles[i]); + } } - }); + ); + + test( + "as a user, I should not be able to CRUD files in an inaccessible folder", + testOptions, + async () => { + const folder = await gqlIdentityA.aco + .createFolder({ + data: { + title: "Folder A", + slug: "folder-a", + type: FOLDER_TYPE + } + }) + .then(([response]) => { + return response.data.aco.createFolder.data; + }); + + const createdFiles = []; + for (let i = 1; i <= 4; i++) { + createdFiles.push( + await gqlIdentityA.fm + .createFile({ + data: createSampleFileData({ + location: { folderId: folder.id } + }) + }) + .then(([response]) => { + return response.data.fileManager.createFile.data; + }) + ); + } - test("as a user, I should not be able to CRUD files in an inaccessible folder", async () => { - const folder = await gqlIdentityA.aco - .createFolder({ + // Only identity B (and identity A, the owner) can see the folder and its files. + await gqlIdentityA.aco.updateFolder({ + id: folder.id, data: { - title: "Folder A", - slug: "folder-a", - type: FOLDER_TYPE + permissions: [ + { + target: `admin:${identityB.id}`, + level: "owner" + } + ] } - }) - .then(([response]) => { - return response.data.aco.createFolder.data; }); - const createdFiles = []; - for (let i = 1; i <= 4; i++) { - createdFiles.push( - await gqlIdentityA.fm + // Getting files in the folder should be forbidden for identity C. + for (let i = 0; i < createdFiles.length; i++) { + const createdFile = createdFiles[i]; + await expectNotAuthorized( + gqlIdentityC.fm.getFile({ id: createdFile.id }).then(([response]) => { + return response.data.fileManager.getFile; + }) + ); + } + + // Listing files in the folder should be forbidden for identity C. + await expect( + gqlIdentityC.fm.listFiles().then(([response]) => { + return response.data.fileManager.listFiles; + }) + ).resolves.toEqual({ + data: [], + error: null, + meta: { + cursor: null, + hasMoreItems: false, + totalCount: 0 + } + }); + + // Creating a file in the folder should be forbidden for identity C. + await expectNotAuthorized( + gqlIdentityC.fm .createFile({ data: createSampleFileData({ location: { folderId: folder.id } }) }) .then(([response]) => { - return response.data.fileManager.createFile.data; + return response.data.fileManager.createFile; }) ); - } - // Only identity B (and identity A, the owner) can see the folder and its files. - await gqlIdentityA.aco.updateFolder({ - id: folder.id, - data: { - permissions: [ - { - target: `admin:${identityB.id}`, - level: "owner" - } - ] + // Updating a file in the folder should be forbidden for identity C. + for (let i = 0; i < createdFiles.length; i++) { + const createdFile = createdFiles[i]; + await expectNotAuthorized( + gqlIdentityC.fm + .updateFile({ + id: createdFile.id, + data: { name: createdFile.name + "-update" } + }) + .then(([response]) => { + return response.data.fileManager.updateFile; + }) + ); } - }); - - // Getting files in the folder should be forbidden for identity C. - for (let i = 0; i < createdFiles.length; i++) { - const createdFile = createdFiles[i]; - await expectNotAuthorized( - gqlIdentityC.fm.getFile({ id: createdFile.id }).then(([response]) => { - return response.data.fileManager.getFile; - }) - ); - } - // Listing files in the folder should be forbidden for identity C. - await expect( - gqlIdentityC.fm.listFiles().then(([response]) => { - return response.data.fileManager.listFiles; - }) - ).resolves.toEqual({ - data: [], - error: null, - meta: { - cursor: null, - hasMoreItems: false, - totalCount: 0 + // Deleting a file in the folder should be forbidden for identity C. + for (let i = 0; i < createdFiles.length; i++) { + const createdFile = createdFiles[i]; + await expectNotAuthorized( + gqlIdentityC.fm.deleteFile({ id: createdFile.id }).then(([response]) => { + return response.data.fileManager.deleteFile; + }) + ); } - }); - // Creating a file in the folder should be forbidden for identity C. - await expectNotAuthorized( - gqlIdentityC.fm - .createFile({ - data: createSampleFileData({ - location: { folderId: folder.id } - }) - }) - .then(([response]) => { - return response.data.fileManager.createFile; - }) - ); + // Set identity C as owner of the folder. CRUD should now be allowed. + await gqlIdentityA.aco.updateFolder({ + id: folder.id, + data: { + permissions: [ + { + target: `admin:${identityC.id}`, + level: "owner" + } + ] + } + }); - // Updating a file in the folder should be forbidden for identity C. - for (let i = 0; i < createdFiles.length; i++) { - const createdFile = createdFiles[i]; - await expectNotAuthorized( - gqlIdentityC.fm - .updateFile({ - id: createdFile.id, - data: { name: createdFile.name + "-update" } - }) - .then(([response]) => { - return response.data.fileManager.updateFile; + // Getting files in the folder should be now allowed for identity C. + for (let i = 0; i < createdFiles.length; i++) { + const createdFile = createdFiles[i]; + await expect( + gqlIdentityC.fm.getFile({ id: createdFile.id }).then(([response]) => { + return response.data.fileManager.getFile; }) - ); - } - - // Deleting a file in the folder should be forbidden for identity C. - for (let i = 0; i < createdFiles.length; i++) { - const createdFile = createdFiles[i]; - await expectNotAuthorized( - gqlIdentityC.fm.deleteFile({ id: createdFile.id }).then(([response]) => { - return response.data.fileManager.deleteFile; - }) - ); - } - - // Set identity C as owner of the folder. CRUD should now be allowed. - await gqlIdentityA.aco.updateFolder({ - id: folder.id, - data: { - permissions: [ - { - target: `admin:${identityC.id}`, - level: "owner" - } - ] + ).resolves.toMatchObject({ + data: { id: createdFile.id }, + error: null + }); } - }); - // Getting files in the folder should be now allowed for identity C. - for (let i = 0; i < createdFiles.length; i++) { - const createdFile = createdFiles[i]; + // Listing files in the folder should be now allowed for identity C. await expect( - gqlIdentityC.fm.getFile({ id: createdFile.id }).then(([response]) => { - return response.data.fileManager.getFile; + gqlIdentityC.fm.listFiles().then(([response]) => { + return response.data.fileManager.listFiles; }) ).resolves.toMatchObject({ - data: { id: createdFile.id }, - error: null + data: [ + { id: createdFiles[3].id }, + { id: createdFiles[2].id }, + { id: createdFiles[1].id }, + { id: createdFiles[0].id } + ], + error: null, + meta: { + cursor: null, + hasMoreItems: false, + totalCount: 4 + } }); - } - - // Listing files in the folder should be now allowed for identity C. - await expect( - gqlIdentityC.fm.listFiles().then(([response]) => { - return response.data.fileManager.listFiles; - }) - ).resolves.toMatchObject({ - data: [ - { id: createdFiles[3].id }, - { id: createdFiles[2].id }, - { id: createdFiles[1].id }, - { id: createdFiles[0].id } - ], - error: null, - meta: { - cursor: null, - hasMoreItems: false, - totalCount: 4 - } - }); - - // Creating a file in the folder should be now allowed for identity C. - await expect( - gqlIdentityC.fm - .createFile({ - data: createSampleFileData({ - location: { folderId: folder.id } - }) - }) - .then(([response]) => { - return response.data.fileManager.createFile; - }) - ).resolves.toMatchObject({ - data: { id: expect.any(String) } - }); - // Updating a file in the folder should be now allowed for identity C. - for (let i = 0; i < createdFiles.length; i++) { - const createdFile = createdFiles[i]; + // Creating a file in the folder should be now allowed for identity C. await expect( gqlIdentityC.fm - .updateFile({ - id: createdFile.id, - data: { name: createdFile.name + "-update" } + .createFile({ + data: createSampleFileData({ + location: { folderId: folder.id } + }) }) .then(([response]) => { - return response.data.fileManager.updateFile; + return response.data.fileManager.createFile; }) ).resolves.toMatchObject({ - data: { name: createdFile.name + "-update" } + data: { id: expect.any(String) } }); - } - // Deleting a file in the folder should be now allowed for identity C. - for (let i = 0; i < createdFiles.length; i++) { - const createdFile = createdFiles[i]; - await expect( - gqlIdentityC.fm.deleteFile({ id: createdFile.id }).then(([response]) => { - return response.data.fileManager.deleteFile; - }) - ).resolves.toMatchObject({ data: true, error: null }); + // Updating a file in the folder should be now allowed for identity C. + for (let i = 0; i < createdFiles.length; i++) { + const createdFile = createdFiles[i]; + await expect( + gqlIdentityC.fm + .updateFile({ + id: createdFile.id, + data: { name: createdFile.name + "-update" } + }) + .then(([response]) => { + return response.data.fileManager.updateFile; + }) + ).resolves.toMatchObject({ + data: { name: createdFile.name + "-update" } + }); + } + + // Deleting a file in the folder should be now allowed for identity C. + for (let i = 0; i < createdFiles.length; i++) { + const createdFile = createdFiles[i]; + await expect( + gqlIdentityC.fm.deleteFile({ id: createdFile.id }).then(([response]) => { + return response.data.fileManager.deleteFile; + }) + ).resolves.toMatchObject({ data: true, error: null }); + } } - }); + ); + + test( + "as a user, I should not be able to CRUD files in an inaccessible folder (no-access level)", + testOptions, + async () => { + const folder = await gqlIdentityA.aco + .createFolder({ + data: { + title: "Folder A", + slug: "folder-a", + type: FOLDER_TYPE + } + }) + .then(([response]) => { + return response.data.aco.createFolder.data; + }); + + const createdFiles = []; + for (let i = 1; i <= 4; i++) { + createdFiles.push( + await gqlIdentityA.fm + .createFile({ + data: createSampleFileData({ + location: { folderId: folder.id } + }) + }) + .then(([response]) => { + return response.data.fileManager.createFile.data; + }) + ); + } - test("as a user, I should not be able to CRUD files in an inaccessible folder (no-access level)", async () => { - const folder = await gqlIdentityA.aco - .createFolder({ + // Let's update the folder: identity A assigns `no-access` level to identity B + await gqlIdentityA.aco.updateFolder({ + id: folder.id, data: { - title: "Folder A", - slug: "folder-a", - type: FOLDER_TYPE + permissions: [ + { + target: `admin:${identityB.id}`, + level: "no-access" + } + ] } - }) - .then(([response]) => { - return response.data.aco.createFolder.data; }); - const createdFiles = []; - for (let i = 1; i <= 4; i++) { - createdFiles.push( - await gqlIdentityA.fm + // Getting files in the folder should be forbidden for identity B. + for (let i = 0; i < createdFiles.length; i++) { + const createdFile = createdFiles[i]; + await expectNotAuthorized( + gqlIdentityB.fm.getFile({ id: createdFile.id }).then(([response]) => { + return response.data.fileManager.getFile; + }) + ); + } + + // Listing files in the folder should be forbidden for identity B. + await expect( + gqlIdentityB.fm.listFiles().then(([response]) => { + return response.data.fileManager.listFiles; + }) + ).resolves.toEqual({ + data: [], + error: null, + meta: { + cursor: null, + hasMoreItems: false, + totalCount: 0 + } + }); + + // Creating a file in the folder should be forbidden for identity B. + await expectNotAuthorized( + gqlIdentityB.fm .createFile({ data: createSampleFileData({ location: { folderId: folder.id } }) }) .then(([response]) => { - return response.data.fileManager.createFile.data; + return response.data.fileManager.createFile; }) ); - } - - // Let's update the folder: identity A assigns `no-access` level to identity B - await gqlIdentityA.aco.updateFolder({ - id: folder.id, - data: { - permissions: [ - { - target: `admin:${identityB.id}`, - level: "no-access" - } - ] - } - }); - - // Getting files in the folder should be forbidden for identity B. - for (let i = 0; i < createdFiles.length; i++) { - const createdFile = createdFiles[i]; - await expectNotAuthorized( - gqlIdentityB.fm.getFile({ id: createdFile.id }).then(([response]) => { - return response.data.fileManager.getFile; - }) - ); - } - // Listing files in the folder should be forbidden for identity B. - await expect( - gqlIdentityB.fm.listFiles().then(([response]) => { - return response.data.fileManager.listFiles; - }) - ).resolves.toEqual({ - data: [], - error: null, - meta: { - cursor: null, - hasMoreItems: false, - totalCount: 0 + // Updating a file in the folder should be forbidden for identity B. + for (let i = 0; i < createdFiles.length; i++) { + const createdFile = createdFiles[i]; + await expectNotAuthorized( + gqlIdentityB.fm + .updateFile({ + id: createdFile.id, + data: { name: createdFile.name + "-update" } + }) + .then(([response]) => { + return response.data.fileManager.updateFile; + }) + ); } - }); - // Creating a file in the folder should be forbidden for identity B. - await expectNotAuthorized( - gqlIdentityB.fm - .createFile({ - data: createSampleFileData({ - location: { folderId: folder.id } + // Deleting a file in the folder should be forbidden for identity B. + for (let i = 0; i < createdFiles.length; i++) { + const createdFile = createdFiles[i]; + await expectNotAuthorized( + gqlIdentityB.fm.deleteFile({ id: createdFile.id }).then(([response]) => { + return response.data.fileManager.deleteFile; }) + ); + } + } + ); + + test( + "as a user, I should not be able to delete folders that have content they cannot see", + testOptions, + async () => { + const folderA = await gqlIdentityA.aco + .createFolder({ + data: { + title: "Folder A", + slug: "folder-a", + type: FOLDER_TYPE + } }) .then(([response]) => { - return response.data.fileManager.createFile; + return response.data.aco.createFolder.data; + }); + + const folderB = await gqlIdentityA.aco + .createFolder({ + data: { + title: "Folder B", + slug: "folder-b", + parentId: folderA.id, + type: FOLDER_TYPE + } }) - ); + .then(([response]) => { + return response.data.aco.createFolder.data; + }); - // Updating a file in the folder should be forbidden for identity B. - for (let i = 0; i < createdFiles.length; i++) { - const createdFile = createdFiles[i]; - await expectNotAuthorized( - gqlIdentityB.fm - .updateFile({ - id: createdFile.id, - data: { name: createdFile.name + "-update" } - }) - .then(([response]) => { - return response.data.fileManager.updateFile; + for (let i = 1; i <= 4; i++) { + await gqlIdentityA.fm.createFile({ + data: createSampleFileData({ + location: { folderId: folderB.id } }) - ); - } + }); + } - // Deleting a file in the folder should be forbidden for identity B. - for (let i = 0; i < createdFiles.length; i++) { - const createdFile = createdFiles[i]; - await expectNotAuthorized( - gqlIdentityB.fm.deleteFile({ id: createdFile.id }).then(([response]) => { - return response.data.fileManager.deleteFile; + // Deleting folderA should be forbidden because there is content in it. In this case, + // user actually sees this content, so we expect a "delete all child folders and files" + // error, not a "not authorized" error. + await expect( + gqlIdentityC.aco.deleteFolder({ id: folderA.id }).then(([response]) => { + return response.data.aco.deleteFolder; }) - ); - } - }); - - test("as a user, I should not be able to delete folders that have content they cannot see", async () => { - const folderA = await gqlIdentityA.aco - .createFolder({ - data: { - title: "Folder A", - slug: "folder-a", - type: FOLDER_TYPE + ).resolves.toMatchObject({ + data: null, + error: { + code: "DELETE_FOLDER_WITH_CHILDREN", + data: { + folder: { + slug: "folder-a" + }, + hasFolders: true, + hasContent: false + }, + message: "Delete all child folders and entries before proceeding." } - }) - .then(([response]) => { - return response.data.aco.createFolder.data; }); - const folderB = await gqlIdentityA.aco - .createFolder({ + // Only identity B (and identity A, the owner) can see the folder B and its files. + await gqlIdentityA.aco.updateFolder({ + id: folderB.id, data: { - title: "Folder B", - slug: "folder-b", - parentId: folderA.id, - type: FOLDER_TYPE + permissions: [ + { + target: `admin:${identityB.id}`, + level: "owner" + } + ] } - }) - .then(([response]) => { - return response.data.aco.createFolder.data; }); - for (let i = 1; i <= 4; i++) { - await gqlIdentityA.fm.createFile({ - data: createSampleFileData({ - location: { folderId: folderB.id } - }) - }); + // Again, deleting folderA should be forbidden because there is content in it. In this + // case, user doesn't see this content, so we expect a "not authorized" error. + await expectNotAuthorized( + gqlIdentityC.aco.deleteFolder({ id: folderA.id }).then(([response]) => { + return response.data.aco.deleteFolder; + }), + { + folder: { id: folderA.id }, + + // There are no entries in the folder, but there is one invisible / inaccessible folder. + hasContent: false, + hasFolders: true + } + ); } - - // Deleting folderA should be forbidden because there is content in it. In this case, - // user actually sees this content, so we expect a "delete all child folders and files" - // error, not a "not authorized" error. - await expect( - gqlIdentityC.aco.deleteFolder({ id: folderA.id }).then(([response]) => { - return response.data.aco.deleteFolder; - }) - ).resolves.toMatchObject({ - data: null, - error: { - code: "DELETE_FOLDER_WITH_CHILDREN", - data: { - folder: { - slug: "folder-a" - }, - hasFolders: true, - hasContent: false - }, - message: "Delete all child folders and entries before proceeding." - } - }); - - // Only identity B (and identity A, the owner) can see the folder B and its files. - await gqlIdentityA.aco.updateFolder({ - id: folderB.id, - data: { - permissions: [ - { - target: `admin:${identityB.id}`, - level: "owner" - } - ] - } - }); - - // Again, deleting folderA should be forbidden because there is content in it. In this - // case, user doesn't see this content, so we expect a "not authorized" error. - await expectNotAuthorized( - gqlIdentityC.aco.deleteFolder({ id: folderA.id }).then(([response]) => { - return response.data.aco.deleteFolder; - }), - { - folder: { id: folderA.id }, - - // There are no entries in the folder, but there is one invisible / inaccessible folder. - hasContent: false, - hasFolders: true - } - ); - }); + ); }); diff --git a/packages/api-aco/__tests__/flp.tasks.test.ts b/packages/api-aco/__tests__/flp.tasks.test.ts index 2a7f529b10b..403e432fb63 100644 --- a/packages/api-aco/__tests__/flp.tasks.test.ts +++ b/packages/api-aco/__tests__/flp.tasks.test.ts @@ -1,14 +1,14 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { CreateFlp, DeleteFlp } from "~/flp/useCases"; import { useHandler } from "~tests/utils/useHandler"; import type { Folder } from "~/folder/folder.types"; import { ROOT_FOLDER } from "~/constants"; -import { jest } from "@jest/globals"; describe("Folder Level Permissions - CREATE FLP", () => { const { handler } = useHandler(); beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it("should create an FLP record without a parent folder", async () => { @@ -119,7 +119,7 @@ describe("Folder Level Permissions - DELETE FLP", () => { const { handler } = useHandler(); beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it("should throw an error if the folder is not provided", async () => { @@ -165,7 +165,7 @@ describe("Folder Level Permissions - UPDATE FLP - Simple", () => { const type = "type"; beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it("should update a root folder's permissions", async () => { @@ -423,7 +423,7 @@ describe("Folder Level Permissions - UPDATE FLP - Complex", () => { const type = "type"; beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it("should handle multi-branch updates with different permissions", async () => { diff --git a/packages/api-aco/__tests__/folder.extensions.test.ts b/packages/api-aco/__tests__/folder.extensions.test.ts index 891fa796363..65db04bd61b 100644 --- a/packages/api-aco/__tests__/folder.extensions.test.ts +++ b/packages/api-aco/__tests__/folder.extensions.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; import { createFolderModelModifier } from "~/folder/createFolderModelModifier"; import { folderMocks } from "~tests/mocks/folder.mock"; diff --git a/packages/api-aco/__tests__/folder.flp.crud.test.ts b/packages/api-aco/__tests__/folder.flp.crud.test.ts index 5f24be98aa0..01cc6cd3f60 100644 --- a/packages/api-aco/__tests__/folder.flp.crud.test.ts +++ b/packages/api-aco/__tests__/folder.flp.crud.test.ts @@ -1,3 +1,4 @@ +import { describe, it, test, expect } from "vitest"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; import { SecurityIdentity } from "@webiny/api-security/types"; import { expectNotAuthorized } from "./utils/expectNotAuthorized"; diff --git a/packages/api-aco/__tests__/folder.flp.inheritance.test.ts b/packages/api-aco/__tests__/folder.flp.inheritance.test.ts index c3fce30046e..43c82ef570f 100644 --- a/packages/api-aco/__tests__/folder.flp.inheritance.test.ts +++ b/packages/api-aco/__tests__/folder.flp.inheritance.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; import { SecurityIdentity } from "@webiny/api-security/types"; import { createSecurityTeamPlugin } from "@webiny/api-security"; diff --git a/packages/api-aco/__tests__/folder.flp.security.test.ts b/packages/api-aco/__tests__/folder.flp.security.test.ts index 5689042157f..8fcdca32245 100644 --- a/packages/api-aco/__tests__/folder.flp.security.test.ts +++ b/packages/api-aco/__tests__/folder.flp.security.test.ts @@ -1,3 +1,4 @@ +import { describe, it, test, expect } from "vitest"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; import { SecurityIdentity } from "@webiny/api-security/types"; import { expectNotAuthorized } from "~tests/utils/expectNotAuthorized"; diff --git a/packages/api-aco/__tests__/folder.hooks.test.ts b/packages/api-aco/__tests__/folder.hooks.test.ts index d578e6bd165..796cb7e24a3 100644 --- a/packages/api-aco/__tests__/folder.hooks.test.ts +++ b/packages/api-aco/__tests__/folder.hooks.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; import { assignFolderLifecycleEvents, tracker } from "./mocks/lifecycle.mock"; diff --git a/packages/api-aco/__tests__/folder.so.test.ts b/packages/api-aco/__tests__/folder.so.test.ts index de4c476ece7..e78aab6870b 100644 --- a/packages/api-aco/__tests__/folder.so.test.ts +++ b/packages/api-aco/__tests__/folder.so.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { mdbid } from "@webiny/utils"; import { folderMocks } from "./mocks/folder.mock"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; diff --git a/packages/api-aco/__tests__/model.graphql.test.ts b/packages/api-aco/__tests__/model.graphql.test.ts index 4eb76c11343..0524a82185a 100644 --- a/packages/api-aco/__tests__/model.graphql.test.ts +++ b/packages/api-aco/__tests__/model.graphql.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; import { createMockAcoApp, MOCK_APP_NAME } from "~tests/mocks/app"; diff --git a/packages/api-aco/__tests__/record.graphql.test.ts b/packages/api-aco/__tests__/record.graphql.test.ts index adef527befd..8de0b4e57ee 100644 --- a/packages/api-aco/__tests__/record.graphql.test.ts +++ b/packages/api-aco/__tests__/record.graphql.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import prettier from "prettier"; import { createDefaultAppsSchemaSnapshot } from "./snapshots/defaultAppsSchema"; import { createCustomAppsSchemaSnapshot } from "./snapshots/customAppsSchema"; diff --git a/packages/api-aco/__tests__/record.hooks.test.ts b/packages/api-aco/__tests__/record.hooks.test.ts index 12c04f1b971..6451240900e 100644 --- a/packages/api-aco/__tests__/record.hooks.test.ts +++ b/packages/api-aco/__tests__/record.hooks.test.ts @@ -1,10 +1,8 @@ -import { jest } from "@jest/globals"; +import { describe, it, expect, beforeEach } from "vitest"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; import { assignRecordLifecycleEvents, tracker } from "./mocks/lifecycle.mock"; import { createMockAcoApp } from "~tests/mocks/app"; -jest.retryTimes(0); - const id = "id-lifecycle-events"; const type = "demo-lifecycle-events"; const title = "Record Lifecycle Events Title"; @@ -72,7 +70,7 @@ describe("Search Record Lifecycle Events", () => { }); }); - it("should trigger create lifecycle events", async () => { + it("should trigger create lifecycle events", { retry: 0 }, async () => { const [response] = await search.createRecord({ data: { id, @@ -118,7 +116,7 @@ describe("Search Record Lifecycle Events", () => { expect(tracker.isExecuted("searchRecord:afterDelete")).toEqual(false); }); - it("should trigger update lifecycle events", async () => { + it("should trigger update lifecycle events", { retry: 0 }, async () => { await search.createRecord({ data: { id, @@ -180,7 +178,7 @@ describe("Search Record Lifecycle Events", () => { expect(tracker.isExecuted("searchRecord:afterDelete")).toEqual(false); }); - it("should trigger move lifecycle events", async () => { + it("should trigger move lifecycle events", { retry: 0 }, async () => { await search.createRecord({ data: { id, @@ -241,7 +239,7 @@ describe("Search Record Lifecycle Events", () => { }); }); - it("should trigger delete lifecycle events", async () => { + it("should trigger delete lifecycle events", { retry: 0 }, async () => { await search.createRecord({ data: { id, diff --git a/packages/api-aco/__tests__/record.so.test.ts b/packages/api-aco/__tests__/record.so.test.ts index b58eeefa52d..0eb74e18561 100644 --- a/packages/api-aco/__tests__/record.so.test.ts +++ b/packages/api-aco/__tests__/record.so.test.ts @@ -1,11 +1,10 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { recordMocks } from "./mocks/record.mock"; import { userMock } from "~tests/mocks/user.mock"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; import { createMockAcoApp } from "~tests/mocks/app"; -import { jest } from "@jest/globals"; -jest.setTimeout(500000); -describe("`search` CRUD", () => { +describe("`search` CRUD", { timeout: 500_000 }, () => { let folder1: Record; let folder2: Record; let search: ReturnType["search"]; diff --git a/packages/api-aco/__tests__/utils/expectNotAuthorized.ts b/packages/api-aco/__tests__/utils/expectNotAuthorized.ts index 1b31507f89d..434c2ff4541 100644 --- a/packages/api-aco/__tests__/utils/expectNotAuthorized.ts +++ b/packages/api-aco/__tests__/utils/expectNotAuthorized.ts @@ -1,3 +1,5 @@ +import { expect } from "vitest"; + export const expectNotAuthorized = async ( promise: Promise, data: Record | null = null diff --git a/packages/api-aco/jest.setup.js b/packages/api-aco/jest.setup.js deleted file mode 100644 index d5f1bfe02d9..00000000000 --- a/packages/api-aco/jest.setup.js +++ /dev/null @@ -1,18 +0,0 @@ -import base from "../../jest.config.base"; -import { getPresets } from "@webiny/project-utils/testing/presets/index.js"; - -export default async () => { - const config = await base( - { path: import.meta.dirname }, - await getPresets( - ["@webiny/api-admin-users", "storage-operations"], - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-file-manager", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] - ) - ); - - return config; -}; diff --git a/packages/api-aco/tsconfig.json b/packages/api-aco/tsconfig.json index a7be807b666..954ff8b4513 100644 --- a/packages/api-aco/tsconfig.json +++ b/packages/api-aco/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.setup.ts"], "references": [ { "path": "../api" }, { "path": "../api-authentication" }, diff --git a/packages/api-aco/vitest.setup.ts b/packages/api-aco/vitest.setup.ts new file mode 100644 index 00000000000..98753218546 --- /dev/null +++ b/packages/api-aco/vitest.setup.ts @@ -0,0 +1,15 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-admin-users", "storage-operations"], + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-file-manager", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ path: import.meta.dirname, presets }); +}; diff --git a/packages/api-admin-settings/.typedoc.json b/packages/api-admin-settings/.typedoc.json deleted file mode 100644 index 03d1159bcdd..00000000000 --- a/packages/api-admin-settings/.typedoc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "API Headless CMS", - "entryPoints": ["types.ts"] -} diff --git a/packages/api-admin-settings/__tests__/services/settings.test.ts b/packages/api-admin-settings/__tests__/services/settings.test.ts index a1cc64620e6..feb8859e7df 100644 --- a/packages/api-admin-settings/__tests__/services/settings.test.ts +++ b/packages/api-admin-settings/__tests__/services/settings.test.ts @@ -1,6 +1,7 @@ +import { describe, it, expect } from "vitest"; +import { put } from "@webiny/db-dynamodb"; import { createMockContextHandler } from "../context"; import { AdminSettingsVariant } from "~/types"; -import { put } from "@webiny/db-dynamodb"; const createData = (variant: AdminSettingsVariant) => { return { diff --git a/packages/api-admin-settings/__tests__/setup/setupAfterEnv.js b/packages/api-admin-settings/__tests__/setup/setupAfterEnv.js index d335a2b969d..b2c7521ed7c 100644 --- a/packages/api-admin-settings/__tests__/setup/setupAfterEnv.js +++ b/packages/api-admin-settings/__tests__/setup/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/api-admin-settings/jest.config.js b/packages/api-admin-settings/jest.config.js deleted file mode 100644 index ce2a1cae33d..00000000000 --- a/packages/api-admin-settings/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const base = require("../../jest.config.base"); - -module.exports = base({ path: __dirname }); diff --git a/packages/api-admin-settings/vitest.config.ts b/packages/api-admin-settings/vitest.config.ts new file mode 100644 index 00000000000..bb4c9279b9d --- /dev/null +++ b/packages/api-admin-settings/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname }); +}; diff --git a/packages/api-admin-users-so-ddb/__tests__/__api__/setupAfterEnv.js b/packages/api-admin-users-so-ddb/__tests__/__api__/setupAfterEnv.js index d335a2b969d..b2c7521ed7c 100644 --- a/packages/api-admin-users-so-ddb/__tests__/__api__/setupAfterEnv.js +++ b/packages/api-admin-users-so-ddb/__tests__/__api__/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/api-apw-scheduler-so-ddb/.typedoc.json b/packages/api-apw-scheduler-so-ddb/.typedoc.json deleted file mode 100644 index dd8e2c016d4..00000000000 --- a/packages/api-apw-scheduler-so-ddb/.typedoc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "API APW Schedule Action DynamoDB", - "entryPoints": ["types.ts"] -} diff --git a/packages/api-apw-scheduler-so-ddb/__tests__/__api__/setupAfterEnv.js b/packages/api-apw-scheduler-so-ddb/__tests__/__api__/setupAfterEnv.js index d335a2b969d..b2c7521ed7c 100644 --- a/packages/api-apw-scheduler-so-ddb/__tests__/__api__/setupAfterEnv.js +++ b/packages/api-apw-scheduler-so-ddb/__tests__/__api__/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/api-apw-scheduler-so-ddb/jest.config.js b/packages/api-apw-scheduler-so-ddb/jest.config.js deleted file mode 100644 index ce2a1cae33d..00000000000 --- a/packages/api-apw-scheduler-so-ddb/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const base = require("../../jest.config.base"); - -module.exports = base({ path: __dirname }); diff --git a/packages/api-apw/.typedoc.json b/packages/api-apw/.typedoc.json deleted file mode 100644 index f71ad3795ea..00000000000 --- a/packages/api-apw/.typedoc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "API APW", - "entryPoints": ["types.ts"] -} diff --git a/packages/api-apw/__tests__/graphql/access.test.ts b/packages/api-apw/__tests__/graphql/access.test.ts deleted file mode 100644 index c9da2d76e39..00000000000 --- a/packages/api-apw/__tests__/graphql/access.test.ts +++ /dev/null @@ -1,544 +0,0 @@ -/** - * This test will check if the user, which has access to a single model, can do valid actions. - */ -import { CmsModel } from "@webiny/api-headless-cms/types"; -import { accessTestGroup, accessTestModel } from "./mocks/access/plugins"; -import { permissions } from "./mocks/access/permissions"; -import mocks from "./mocks/workflows"; -import { ApwWorkflowApplications } from "~/types"; -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; - -const model = accessTestModel.contentModel as CmsModel; - -describe("access", () => { - const workflowIdentity = { - id: "90962378", - type: "admin", - displayName: "Workflow Name", - email: "worflow-mock@webiny.local" - }; - - const gqlHandler = useGraphQlHandler({ - path: "/graphql", - plugins: [accessTestGroup, accessTestModel], - storageOperationPlugins: [] - }); - - const { - securityIdentity, - reviewer: reviewerGQL, - // workflow - createWorkflowMutation, - // content review - createContentReviewMutation, - getContentReviewQuery, - deleteContentReviewMutation, - // comment - createCommentMutation, - updateCommentMutation, - deleteCommentMutation, - getCommentQuery, - // change request - createChangeRequestMutation, - updateChangeRequestMutation, - deleteChangeRequestMutation - } = gqlHandler; - - const { - // content entry - createContentEntryMutation, - // utils - until - } = useGraphQlHandler({ - path: "/cms/manage/en-US", - identity: { - id: "someUserId", - displayName: "User", - type: "user", - email: "testing@webiny.com" - }, - permissions, - plugins: [accessTestGroup, accessTestModel] - }); - - const login = async () => { - return await securityIdentity.login(); - }; - - const setupReviewer = async () => { - await login(); - - await until( - () => reviewerGQL.listReviewersQuery({}).then(([data]) => data), - (response: any) => { - return response.data.apw.listReviewers.data.length === 1; - }, - { - name: "Wait for listReviewers" - } - ); - - const [listReviewersResponse] = await reviewerGQL.listReviewersQuery({}); - const [reviewer] = listReviewersResponse.data.apw.listReviewers.data; - return reviewer; - }; - - const entryTitle = "Test entry #1"; - let entryId: string; - - beforeEach(async () => { - const reviewer = await setupReviewer(); - const createWorkflowInput = mocks.createWorkflow( - { - title: `Main review workflow - CMS`, - app: ApwWorkflowApplications.CMS, - scope: { - type: "custom", - data: { - models: [model.modelId] - } - } - }, - [reviewer] - ); - - const [createWorkflowResponse] = await createWorkflowMutation({ - data: createWorkflowInput - }); - if (createWorkflowResponse.data?.apw?.createWorkflow?.error?.message) { - throw new Error(createWorkflowResponse.data?.apw?.createWorkflow?.error?.message); - } else if (!createWorkflowResponse.data?.apw?.createWorkflow?.data?.id) { - throw new Error(`Could not create workflow.`); - } - - const [createEntryResponse] = await createContentEntryMutation(model, { - data: { - title: entryTitle - } - }); - - if (!createEntryResponse.data?.createAccessTestModel?.data?.id) { - throw new Error(`Missing content entry.`); - } - - entryId = createEntryResponse.data.createAccessTestModel.data.id; - }); - - const setupContentReview = async () => { - if (!entryId) { - throw new Error(`Missing "entryId" - should be created before calling this method.`); - } - const [createReviewRequestResponse] = await createContentReviewMutation({ - data: { - content: { - id: entryId, - type: "cms_entry", - settings: { - modelId: model.modelId - } - } - } - }); - return createReviewRequestResponse; - }; - - it("should create request for review and delete it", async () => { - const createContentReviewResponse = await setupContentReview(); - - expect(createContentReviewResponse).toMatchObject({ - data: { - apw: { - createContentReview: { - data: { - id: expect.any(String), - content: { - id: entryId - }, - steps: [ - { - id: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedBy: null, - signOffProvidedOn: null, - status: "active" - } - ], - title: entryTitle - }, - error: null - } - } - } - }); - - const contentReviewId = createContentReviewResponse.data.apw.createContentReview.data.id; - - const [getReviewRequestResponse] = await getContentReviewQuery({ - id: contentReviewId - }); - - expect(getReviewRequestResponse).toMatchObject({ - data: { - apw: { - getContentReview: { - data: { - id: contentReviewId - }, - error: null - } - } - } - }); - - const [deleteReviewRequestResponse] = await deleteContentReviewMutation({ - id: contentReviewId - }); - - expect(deleteReviewRequestResponse).toMatchObject({ - data: { - apw: { - deleteContentReview: { - data: true, - error: null - } - } - } - }); - }); - - it("should create change request, update it and delete it", async () => { - const createContentReviewResponse = await setupContentReview(); - const contentReview = createContentReviewResponse.data.apw.createContentReview.data; - - const changeRequestStepId = `${contentReview.id}#${contentReview.steps[0].id}`; - - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: { - step: changeRequestStepId, - title: `Requesting change on "${entryTitle}"`, - body: [ - { - type: "h1", - text: "Really important!" - } - ], - resolved: false, - media: { - src: "cloudfront.net/my-file" - } - } - }); - - expect(createChangeRequestResponse).toMatchObject({ - data: { - apw: { - createChangeRequest: { - data: { - id: expect.any(String), - step: changeRequestStepId - }, - error: null - } - } - } - }); - - const changeRequestId = createChangeRequestResponse.data.apw.createChangeRequest.data.id; - - const [updateChangeRequestResponse] = await updateChangeRequestMutation({ - id: changeRequestId, - data: { - title: `Requesting change on "${entryTitle}" - updated`, - body: [ - { - type: "h1", - text: "Really important! - updated" - } - ], - resolved: false, - media: { - src: "cloudfront.net/my-file-updated" - } - } - }); - - expect(updateChangeRequestResponse).toMatchObject({ - data: { - apw: { - updateChangeRequest: { - data: { - id: expect.any(String), - step: changeRequestStepId, - title: `Requesting change on "${entryTitle}" - updated`, - body: [ - { - type: "h1", - text: "Really important! - updated" - } - ], - resolved: false, - media: { - src: "cloudfront.net/my-file-updated" - } - }, - error: null - } - } - } - }); - - const [deleteChangeRequestResponse] = await deleteChangeRequestMutation({ - id: changeRequestId - }); - - expect(deleteChangeRequestResponse).toMatchObject({ - data: { - apw: { - deleteChangeRequest: { - data: true, - error: null - } - } - } - }); - }); - - it("should not able to update the change request, when user is not the owner", async () => { - const createContentReviewResponse = await setupContentReview(); - const contentReview = createContentReviewResponse.data.apw.createContentReview.data; - const changeRequestStepId = `${contentReview.id}#${contentReview.steps[0].id}`; - - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: { - step: changeRequestStepId, - title: `Requesting change on "${entryTitle}"`, - body: [ - { - type: "h1", - text: "Really important!" - } - ], - resolved: false, - media: { - src: "cloudfront.net/my-file" - } - } - }); - - /** - * Login another user, that is not creator of the change request. - */ - const notChangeRequestCreatorHandler = useGraphQlHandler({ - path: "/graphql", - identity: workflowIdentity - }); - await notChangeRequestCreatorHandler.securityIdentity.login(); - - /** - * Try to update the same change request with other user - */ - const changeRequestId = createChangeRequestResponse.data.apw.createChangeRequest.data.id; - const [updateChangeRequestResponse] = - await notChangeRequestCreatorHandler.updateChangeRequestMutation({ - id: changeRequestId, - data: { - title: `Requesting change on "${entryTitle}" - updated`, - body: [ - { - type: "h1", - text: "Really important! - updated" - } - ], - resolved: false, - media: { - src: "cloudfront.net/my-file-updated" - } - } - }); - - expect(updateChangeRequestResponse.data?.apw?.updateChangeRequest).toMatchObject({ - data: null, - error: { - message: "A change request can only be updated by its creator.", - code: "ONLY_CREATOR_CAN_UPDATE_CHANGE_REQUEST" - } - }); - }); - - it("should not able to delete the change request, when user is not the owner", async () => { - const createContentReviewResponse = await setupContentReview(); - const contentReview = createContentReviewResponse.data.apw.createContentReview.data; - const changeRequestStepId = `${contentReview.id}#${contentReview.steps[0].id}`; - - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: { - step: changeRequestStepId, - title: `Requesting change on "${entryTitle}"`, - body: [ - { - type: "h1", - text: "Really important!" - } - ], - resolved: false, - media: { - src: "cloudfront.net/my-file" - } - } - }); - - /** - * Login another user, that is not creator of the change request. - */ - const notChangeRequestCreatorHandler = useGraphQlHandler({ - path: "/graphql", - identity: workflowIdentity - }); - await notChangeRequestCreatorHandler.securityIdentity.login(); - - /** - * Try to delete the same change request with other user - */ - const changeRequestId = createChangeRequestResponse.data.apw.createChangeRequest.data.id; - const [deleteChangeRequestResponse] = - await notChangeRequestCreatorHandler.deleteChangeRequestMutation({ - id: changeRequestId - }); - - expect(deleteChangeRequestResponse.data?.apw?.deleteChangeRequest).toMatchObject({ - data: null, - error: { - message: "A change request can only be deleted by its creator.", - code: "ONLY_CREATOR_CAN_DELETE_CHANGE_REQUEST" - } - }); - }); - - it("should create comment, update it and delete it", async () => { - const createContentReviewResponse = await setupContentReview(); - const contentReview = createContentReviewResponse.data.apw.createContentReview.data; - - const changeRequestStepId = `${contentReview.id}#${contentReview.steps[0].id}`; - - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: { - step: changeRequestStepId, - title: `Requesting change on "${entryTitle}"`, - body: [ - { - type: "h1", - text: "Really important!" - } - ], - resolved: false, - media: { - src: "cloudfront.net/my-file" - } - } - }); - - const changeRequest = createChangeRequestResponse.data.apw.createChangeRequest.data; - - const [createCommentResponse] = await createCommentMutation({ - data: { - body: [ - { - type: "p", - text: "Comment Test" - } - ], - changeRequest: changeRequest.id, - media: { - src: "cloudfront.net/my-file" - } - } - }); - - expect(createCommentResponse).toMatchObject({ - data: { - apw: { - createComment: { - data: { - id: expect.any(String) - }, - error: null - } - } - } - }); - const commentId = createCommentResponse.data.apw.createComment.data.id; - - const [getCommentResponse] = await getCommentQuery({ - id: commentId - }); - - expect(getCommentResponse).toMatchObject({ - data: { - apw: { - getComment: { - data: { - id: commentId, - body: [ - { - type: "p", - text: "Comment Test" - } - ], - changeRequest: changeRequest.id, - media: { - src: "cloudfront.net/my-file" - } - }, - error: null - } - } - } - }); - - const [updateCommentResponse] = await updateCommentMutation({ - id: commentId, - data: { - body: [ - { - type: "h1", - text: "Heading" - } - ] - } - }); - - expect(updateCommentResponse).toMatchObject({ - data: { - apw: { - updateComment: { - data: { - id: commentId, - body: [ - { - type: "h1", - text: "Heading" - } - ] - }, - error: null - } - } - } - }); - - const [deleteCommentResponse] = await deleteCommentMutation({ - id: commentId - }); - - expect(deleteCommentResponse).toEqual({ - data: { - apw: { - deleteComment: { - data: true, - error: null - } - } - } - }); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/addChangeRequestInContentReview.test.ts b/packages/api-apw/__tests__/graphql/addChangeRequestInContentReview.test.ts deleted file mode 100644 index a833cffca57..00000000000 --- a/packages/api-apw/__tests__/graphql/addChangeRequestInContentReview.test.ts +++ /dev/null @@ -1,555 +0,0 @@ -import { mocks as changeRequestMock } from "./mocks/changeRequest"; -import { createSetupForPageContentReview } from "../utils/helpers"; -import { ApwContentReview, PageWithWorkflow } from "~/types"; -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; - -const richTextMock = [ - { - tag: "h1", - content: "Testing H1 tags" - }, - { - tag: "p", - content: "Some small piece of text to test P tags" - }, - { - tag: "div", - content: [ - { - tag: "p", - text: "Text inside the div > p" - }, - { - tag: "a", - href: "https://www.webiny.com", - text: "Webiny" - } - ] - } -]; - -describe(`Add change requests on a step in a "Content Review"`, () => { - const gqlHandler = useGraphQlHandler({ - path: "/graphql" - }); - const { - createChangeRequestMutation, - listChangeRequestsQuery, - deleteContentReviewMutation, - createContentReviewMutation, - getContentReviewQuery, - listContentReviewsQuery, - until - } = gqlHandler; - - const createContentReview = async (page: PageWithWorkflow) => { - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - return createContentReviewResponse.data.apw.createContentReview.data; - }; - - const expectedContent = { - id: expect.any(String), - type: expect.any(String), - version: expect.any(Number), - settings: null, - publishedBy: null, - publishedOn: null, - scheduledBy: null, - scheduledOn: null - }; - - test("should able to add change request in a content review", async () => { - const { page } = await createSetupForPageContentReview(gqlHandler); - const contentReview = await createContentReview(page); - const [step1, step2] = contentReview.steps; - - await until( - () => listContentReviewsQuery({}).then(([data]: any) => data), - (response: any) => { - const list = response.data.apw.listContentReviews.data; - return list.length === 1; - }, - { - name: `Wait for "ContentReview" entry to be available in list query` - } - ); - /* - * Create a new change request entry for step 1. - */ - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ - step: `${contentReview.id}#${step1.id}` - }) - }); - const changeRequested = createChangeRequestResponse.data.apw.createChangeRequest.data; - - await until( - () => listChangeRequestsQuery({}).then(([data]: any) => data), - (response: any) => { - const list = response.data.apw.listChangeRequests.data; - return list.length === 1; - }, - { - name: `Wait for "ChangeRequest" entry to be available in list query` - } - ); - - await until( - () => listContentReviewsQuery({}).then(([data]: any) => data), - (response: any) => { - const [entry] = response.data.apw.listContentReviews.data as ApwContentReview[]; - return ( - entry && - entry.steps.find(step => step.id === step1.id)?.pendingChangeRequests === 1 - ); - }, - { - name: `Wait for "ContentReview" entry to be available in list query` - } - ); - - /** - * List all change requests for a given step in content review. - */ - const [listChangeRequestsResponse] = await listChangeRequestsQuery({ - where: { - step: `${contentReview.id}#${step1.id}` - } - }); - expect(listChangeRequestsResponse).toEqual({ - data: { - apw: { - listChangeRequests: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - ...changeRequested - } - ], - error: null, - meta: { - hasMoreItems: false, - totalCount: 1, - cursor: null - } - } - } - } - }); - - /** - * Add couple of change request to a step 2 in the content review. - */ - const changeRequests = []; - for (let i = 0; i < 2; i++) { - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ - step: `${contentReview.id}#${step2.id}`, - title: "Please make change in heading-" + i - }) - }); - - changeRequests.push(createChangeRequestResponse.data.apw.createChangeRequest.data); - - await until( - () => listContentReviewsQuery({}).then(([data]: any) => data), - (response: any) => { - const [entry] = response.data.apw.listContentReviews.data as ApwContentReview[]; - return ( - entry && - entry.steps.find(step => step.id === step2.id)?.pendingChangeRequests === - i + 1 - ); - }, - { - name: `Wait for updated "ContentReview" entry to be available in list query iteration: ${ - i + 1 - }` - } - ); - } - - await until( - () => - listChangeRequestsQuery({ - where: { - step: `${contentReview.id}#${step2.id}` - } - }).then(([data]: any) => data), - (response: any) => { - const list = response.data.apw.listChangeRequests.data; - return list.length === 2; - }, - { - name: `Wait for "ChangeRequest" entry to be available in list query for step2` - } - ); - - /** - * List all changeRequests for a step2 in the content review. - */ - const [listChangeRequestsResponse2] = await listChangeRequestsQuery({ - where: { - step: `${contentReview.id}#${step2.id}` - } - }); - expect(listChangeRequestsResponse2).toEqual({ - data: { - apw: { - listChangeRequests: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - ...changeRequests[1] - }, - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - ...changeRequests[0] - } - ], - error: null, - meta: { - hasMoreItems: false, - totalCount: 2, - cursor: null - } - } - } - } - }); - - /** - * List all changeRequests for all the steps in the content review. - */ - const [listChangeRequestsResponse3] = await listChangeRequestsQuery({}); - expect(listChangeRequestsResponse3).toEqual({ - data: { - apw: { - listChangeRequests: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - ...changeRequests[1] - }, - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - ...changeRequests[0] - }, - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - ...changeRequested - } - ], - error: null, - meta: { - hasMoreItems: false, - totalCount: 3, - cursor: null - } - } - } - } - }); - - /** - * Should have 1 pending change requests for step 1 and 2 pending change requests for step 2. - */ - const [getContentReviewResponse] = await getContentReviewQuery({ id: contentReview.id }); - expect(getContentReviewResponse).toEqual({ - data: { - apw: { - getContentReview: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - reviewStatus: "underReview", - title: expect.any(String), - content: expect.objectContaining(expectedContent), - steps: [ - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 1, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 2, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - } - ] - }, - error: null - } - } - } - }); - }); - - test(`should delete all "change requests" when a "content review" gets deleted`, async () => { - const { page, createPage } = await createSetupForPageContentReview(gqlHandler); - const page2 = await createPage(gqlHandler); - const pages = [page, page2]; - /* - * Create two new content review entries. - */ - const contentReviews = []; - for (let i = 0; i < 2; i++) { - const contentReview = await createContentReview(pages[i]); - contentReviews.push(contentReview); - } - - /** - * Add two change requests on each content review entry. - */ - const changeRequests = []; - for (let i = 0; i < contentReviews.length; i++) { - const contentReview = contentReviews[i]; - for (let j = 0; j < 2; j++) { - const [createCommentResponse] = await createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ - step: `${contentReview.id}#${contentReview.steps[0].id}`, - title: `Please change heading-${i}-${j}` - }) - }); - changeRequests.push(createCommentResponse.data.apw.createChangeRequest.data); - } - } - - await until( - () => listChangeRequestsQuery({}).then(([data]: any) => data), - (response: any) => { - const list = response.data.apw.listChangeRequests.data; - return list.length === 4; - }, - { - name: "Wait for entry to be available in list query" - } - ); - - /** - * List all changeRequests. - */ - let [listChangeRequestsResponse] = await listChangeRequestsQuery({}); - expect(listChangeRequestsResponse).toEqual({ - data: { - apw: { - listChangeRequests: { - data: [ - { - id: changeRequests[3].id, - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - ...changeRequests[3] - }, - { - id: changeRequests[2].id, - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - ...changeRequests[2] - }, - { - id: changeRequests[1].id, - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - ...changeRequests[1] - }, - { - id: changeRequests[0].id, - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - body: richTextMock, - ...changeRequests[0] - } - ], - error: null, - meta: { - hasMoreItems: false, - totalCount: 4, - cursor: null - } - } - } - } - }); - /** - * Let's delete the first content review entry. - */ - const [deleteContentReviewResponse] = await deleteContentReviewMutation({ - id: contentReviews[0].id - }); - expect(deleteContentReviewResponse).toEqual({ - data: { - apw: { - deleteContentReview: { - data: true, - error: null - } - } - } - }); - - await until( - () => listChangeRequestsQuery({}).then(([data]: any) => data), - (response: any) => { - const list = response.data.apw.listChangeRequests.data; - return list.length === 2; - }, - { - name: "Wait for entry to be available in list query" - } - ); - - /** - * List all the changeRequests associated with the deleted change request. - */ - [listChangeRequestsResponse] = await listChangeRequestsQuery({ - where: { - step: `${contentReviews[0].id}#${contentReviews[0].steps[0].id}` - } - }); - expect(listChangeRequestsResponse).toEqual({ - data: { - apw: { - listChangeRequests: { - data: [], - error: null, - meta: { - hasMoreItems: false, - totalCount: 0, - cursor: null - } - } - } - } - }); - - /** - * List all the changeRequests without any filters. - */ - [listChangeRequestsResponse] = await listChangeRequestsQuery({}); - expect(listChangeRequestsResponse).toEqual({ - data: { - apw: { - listChangeRequests: { - data: [ - { - id: changeRequests[3].id, - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - ...changeRequests[3] - }, - { - id: changeRequests[2].id, - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - ...changeRequests[2] - } - ], - error: null, - meta: { - hasMoreItems: false, - totalCount: 2, - cursor: null - } - } - } - } - }); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/changeRequest.crud.test.ts b/packages/api-apw/__tests__/graphql/changeRequest.crud.test.ts deleted file mode 100644 index 31766fdb636..00000000000 --- a/packages/api-apw/__tests__/graphql/changeRequest.crud.test.ts +++ /dev/null @@ -1,368 +0,0 @@ -import { createPageContentReviewSetup } from "../utils/helpers"; -import { mocks as changeRequestMock } from "./mocks/changeRequest"; -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; -import { createTransport } from "@webiny/api-mailer"; -import { jest } from "@jest/globals"; - -const updatedRichText = [ - { - tag: "h1", - content: "Testing H1 tags - Updated" - }, - { - tag: "p", - content: "Some small piece of text to test P tags - Updated" - }, - { - tag: "div", - content: [ - { - tag: "p", - text: "Text inside the div > p" - }, - { - tag: "a", - href: "https://www.webiny.com", - text: "Webiny" - } - ] - } -]; - -jest.mock("~/plugins/hooks/notifications/appUrl", () => { - return { - getAppUrl: async () => { - return { - appUrl: "https://webiny.local" - }; - } - }; -}); - -describe("ChangeRequest crud test", () => { - const gqlHandler = useGraphQlHandler({ - path: "/graphql" - }); - - const { - getChangeRequestQuery, - listChangeRequestsQuery, - createChangeRequestMutation, - updateChangeRequestMutation, - deleteChangeRequestMutation, - until - } = gqlHandler; - - test(`should able to create, update, get, list and delete a "change request"`, async () => { - const { contentReview } = await createPageContentReviewSetup(gqlHandler); - const changeRequestStep = `${contentReview.id}#${contentReview.steps[0].id}`; - /* - * Create a new entry. - */ - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ step: changeRequestStep }) - }); - const createdChangeRequest = createChangeRequestResponse.data.apw.createChangeRequest.data; - - expect(createChangeRequestResponse).toEqual({ - data: { - apw: { - createChangeRequest: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - title: expect.any(String), - body: expect.any(Object), - media: expect.any(Object), - step: expect.any(String), - resolved: null - }, - error: null - } - } - } - }); - - await until( - () => getChangeRequestQuery({ id: createdChangeRequest.id }).then(([data]) => data), - (response: any) => response.data.apw.getChangeRequest.data !== null, - { - name: "Wait for getChangeRequest query" - } - ); - - /** - * Now that we have a entry, we should be able to get it. - */ - const [getChangeRequestByIdResponse] = await getChangeRequestQuery({ - id: createdChangeRequest.id - }); - expect(getChangeRequestByIdResponse).toEqual({ - data: { - apw: { - getChangeRequest: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - title: expect.any(String), - body: expect.any(Object), - media: expect.any(Object), - step: expect.any(String), - resolved: null - }, - error: null - } - } - } - }); - - /** - * Let's update the entry. - */ - const [updateChangeRequestResponse] = await updateChangeRequestMutation({ - id: createdChangeRequest.id, - data: { - body: updatedRichText, - resolved: true - } - }); - expect(updateChangeRequestResponse).toEqual({ - data: { - apw: { - updateChangeRequest: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - title: expect.any(String), - body: updatedRichText, - media: expect.any(Object), - step: expect.any(String), - resolved: true - }, - error: null - } - } - } - }); - - await until( - () => listChangeRequestsQuery({}).then(([data]) => data), - (response: any) => { - const [updatedItem] = response.data.apw.listChangeRequests.data; - return updatedItem && createdChangeRequest.savedOn !== updatedItem.savedOn; - }, - { - name: "Wait for updated entry to be available via listChangeRequests query" - } - ); - - /** - * Let's list all entries should return only one. - */ - const [listChangeRequestsResponse] = await listChangeRequestsQuery({}); - expect(listChangeRequestsResponse).toEqual({ - data: { - apw: { - listChangeRequests: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - title: expect.any(String), - media: expect.any(Object), - step: expect.any(String), - resolved: true, - body: updatedRichText - } - ], - error: null, - meta: { - hasMoreItems: false, - totalCount: 1, - cursor: null - } - } - } - } - }); - - /** - * Delete the only entry we have. - */ - const [deleteChangeRequestResponse] = await deleteChangeRequestMutation({ - id: createdChangeRequest.id - }); - expect(deleteChangeRequestResponse).toEqual({ - data: { - apw: { - deleteChangeRequest: { - data: true, - error: null - } - } - } - }); - - await until( - () => listChangeRequestsQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listChangeRequests.data; - return list.length === 0; - }, - { - name: "Wait for empty list after deleting entry" - } - ); - - /** - * Now that we've deleted the only entry we had, we should get empty list as response. - */ - const [listChangeRequestsAgainResponse] = await listChangeRequestsQuery({}); - expect(listChangeRequestsAgainResponse).toEqual({ - data: { - apw: { - listChangeRequests: { - data: [], - error: null, - meta: { - hasMoreItems: false, - totalCount: 0, - cursor: null - } - } - } - } - }); - }); - - test(`should not able to create "change request" with wrong step`, async () => { - /* - * Create a new entry. - */ - let [createChangeRequestResponse] = await createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ - step: "61af1a60f04e49226e6cc17e#design_review" - }) - }); - - expect(createChangeRequestResponse).toEqual({ - data: { - apw: { - createChangeRequest: { - data: null, - error: { - message: expect.any(String), - code: "MALFORMED_CHANGE_REQUEST_STEP", - data: expect.any(Object) - } - } - } - } - }); - const nonExistingContentReview = "61af1a60f04e49226e6cc17e#0001#design_review"; - - [createChangeRequestResponse] = await createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ - step: nonExistingContentReview - }) - }); - - expect(createChangeRequestResponse).toEqual({ - data: { - apw: { - createChangeRequest: { - data: null, - error: { - message: expect.any(String), - code: "NOT_FOUND", - data: expect.any(Object) - } - } - } - } - }); - }); - - it("should send an e-mail to all reviewers after the change request was created", async () => { - const fn = jest.fn(() => { - return null; - }); - - const handler = useGraphQlHandler({ - path: "/graphql", - identity: { - id: "mockIdentityId", - type: "admin", - displayName: "Mock Identity", - email: "mock@webiny.local" - }, - plugins: [ - createTransport(async () => { - return { - name: "test-dummy-transport", - send: async () => { - fn.apply(null); - return { - result: null, - error: null - }; - } - }; - }) - ] - }); - - await handler.securityIdentity.login(); - await gqlHandler.securityIdentity.login(); - - const { contentReview } = await createPageContentReviewSetup(gqlHandler); - const changeRequestStep = `${contentReview.id}#${contentReview.steps[0].id}`; - /* - * Create a new entry. - */ - const [createChangeRequestResponse] = await handler.createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ step: changeRequestStep }) - }); - - expect(createChangeRequestResponse).toMatchObject({ - data: { - apw: { - createChangeRequest: { - data: { - id: expect.any(String) - }, - error: null - } - } - } - }); - /** - * Test expects the mock function to be called as it represents creating notification text and body. - */ - expect(fn).toBeCalledTimes(1); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/comment.crud.test.ts b/packages/api-apw/__tests__/graphql/comment.crud.test.ts deleted file mode 100644 index c7cb5384d68..00000000000 --- a/packages/api-apw/__tests__/graphql/comment.crud.test.ts +++ /dev/null @@ -1,375 +0,0 @@ -import { mocks as changeRequestMock } from "./mocks/changeRequest"; -import { createPageContentReviewSetup } from "../utils/helpers"; -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; -import { createTransport } from "@webiny/api-mailer"; -import { jest } from "@jest/globals"; - -const richTextMock = [ - { - tag: "h1", - content: "Testing H1 tags" - }, - { - tag: "p", - content: "Some small piece of text to test P tags" - }, - { - tag: "div", - content: [ - { - tag: "p", - text: "Text inside the div > p" - }, - { - tag: "a", - href: "https://www.webiny.com", - text: "Webiny" - } - ] - } -]; - -const updatedRichText = [ - { - tag: "h1", - content: "Testing H1 tags - Updated" - }, - { - tag: "p", - content: "Some small piece of text to test P tags - Updated" - }, - { - tag: "div", - content: [ - { - tag: "p", - text: "Text inside the div > p" - }, - { - tag: "a", - href: "https://www.webiny.com", - text: "Webiny" - } - ] - } -]; - -jest.mock("~/plugins/hooks/notifications/appUrl", () => { - return { - getAppUrl: async () => { - return { - appUrl: "https://webiny.local" - }; - } - }; -}); - -describe("Comment crud test", () => { - const gqlHandler = useGraphQlHandler({ - path: "/graphql" - }); - - const { - getCommentQuery, - listCommentsQuery, - createCommentMutation, - updateCommentMutation, - deleteCommentMutation, - createChangeRequestMutation, - until - } = gqlHandler; - - const setupChangeRequest = async (handler?: typeof gqlHandler) => { - const { contentReview } = await createPageContentReviewSetup(handler || gqlHandler); - const changeRequestStep = `${contentReview.id}#${contentReview.steps[0].id}`; - /* - * Create a new entry. - */ - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ step: changeRequestStep }) - }); - return createChangeRequestResponse.data.apw.createChangeRequest.data; - }; - - test("should able to create, update, get, list and delete a comment", async () => { - const changeRequest = await setupChangeRequest(); - /* - * Create a new entry. - */ - const [createCommentResponse] = await createCommentMutation({ - data: { - body: richTextMock, - changeRequest: changeRequest.id, - media: { - src: "cloudfront.net/my-file" - } - } - }); - const comment = createCommentResponse.data.apw.createComment.data; - - expect(createCommentResponse).toEqual({ - data: { - apw: { - createComment: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - body: richTextMock, - changeRequest: changeRequest.id, - media: expect.any(Object) - }, - error: null - } - } - } - }); - - await until( - () => getCommentQuery({ id: comment.id }).then(([data]) => data), - (response: any) => response.data.apw.getComment.data !== null, - { - name: "Wait for getComment query" - } - ); - - /** - * Now that we have an entry, we should be able to get it. - */ - const [getCommentByIdResponse] = await getCommentQuery({ id: comment.id }); - expect(getCommentByIdResponse).toEqual({ - data: { - apw: { - getComment: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - body: richTextMock, - changeRequest: changeRequest.id, - media: expect.any(Object) - }, - error: null - } - } - } - }); - - /* - * Should return error in case of no entry found. - */ - const [getCommentResponse] = await getCommentQuery({ id: "123" }); - expect(getCommentResponse).toEqual({ - data: { - apw: { - getComment: { - data: null, - error: { - code: "NOT_FOUND", - data: null, - message: `Entry by ID "123" not found.` - } - } - } - } - }); - - /** - * Let's update the entry. - */ - const [updateCommentResponse] = await updateCommentMutation({ - id: comment.id, - data: { - body: updatedRichText - } - }); - expect(updateCommentResponse).toEqual({ - data: { - apw: { - updateComment: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - body: updatedRichText, - changeRequest: changeRequest.id, - media: expect.any(Object) - }, - error: null - } - } - } - }); - - await until( - () => listCommentsQuery({}).then(([data]) => data), - (response: any) => { - const [updatedItem] = response.data.apw.listComments.data; - return updatedItem && comment.savedOn !== updatedItem.savedOn; - }, - { - name: "Wait for updated entry to be available via listReviewers query" - } - ); - - /** - * Let's list all workflow entries should return only one. - */ - const [listCommentsResponse] = await listCommentsQuery({ where: {} }); - expect(listCommentsResponse).toEqual({ - data: { - apw: { - listComments: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - body: updatedRichText, - changeRequest: changeRequest.id, - media: expect.any(Object) - } - ], - error: null, - meta: { - hasMoreItems: false, - totalCount: 1, - cursor: null - } - } - } - } - }); - - /** - * Delete the only entry we have. - */ - const [deleteCommentResponse] = await deleteCommentMutation({ id: comment.id }); - expect(deleteCommentResponse).toEqual({ - data: { - apw: { - deleteComment: { - data: true, - error: null - } - } - } - }); - - await until( - () => listCommentsQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listComments.data; - return list.length === 0; - }, - { - name: "Wait for empty list via listReviewers query after deleting entry" - } - ); - - /** - * Now that we've deleted the only entry we had, we should get empty list as response from "listComments". - */ - const [listCommentsAgainResponse] = await listCommentsQuery({}); - expect(listCommentsAgainResponse).toEqual({ - data: { - apw: { - listComments: { - data: [], - error: null, - meta: { - hasMoreItems: false, - totalCount: 0, - cursor: null - } - } - } - } - }); - }); - - it("should send an e-mail to all reviewers after the comment was created", async () => { - const fn = jest.fn(() => { - return null; - }); - - const handler = useGraphQlHandler({ - path: "/graphql", - identity: { - id: "mockIdentityId", - type: "admin", - displayName: "Mock Identity", - email: "mock@webiny.local" - }, - plugins: [ - createTransport(async () => { - return { - name: "test-dummy-transport", - send: async () => { - fn.apply(null); - return { - result: null, - error: null - }; - } - }; - }) - ] - }); - - await handler.securityIdentity.login(); - await gqlHandler.securityIdentity.login(); - - const changeRequest = await setupChangeRequest(handler); - /* - * Create a new entry. - */ - const [createCommentResponse] = await handler.createCommentMutation({ - data: { - body: richTextMock, - changeRequest: changeRequest.id, - media: { - src: "cloudfront.net/my-file" - } - } - }); - - expect(createCommentResponse).toMatchObject({ - data: { - apw: { - createComment: { - data: { - id: expect.any(String) - }, - error: null - } - } - } - }); - /** - * Test expects the mock function to be called as it represents creating notification text and body. - * We expect 2 calls, because change request creation produces an e-mail. - */ - expect(fn).toBeCalledTimes(2); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/commentOnChangeRequest.test.ts b/packages/api-apw/__tests__/graphql/commentOnChangeRequest.test.ts deleted file mode 100644 index 33c34a52f6d..00000000000 --- a/packages/api-apw/__tests__/graphql/commentOnChangeRequest.test.ts +++ /dev/null @@ -1,420 +0,0 @@ -import { mocks as changeRequestMock } from "./mocks/changeRequest"; -import { createPageContentReviewSetup } from "../utils/helpers"; -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; - -const richTextMock = [ - { - tag: "h1", - content: "Testing H1 tags" - }, - { - tag: "p", - content: "Some small piece of text to test P tags" - }, - { - tag: "div", - content: [ - { - tag: "p", - text: "Text inside the div > p" - }, - { - tag: "a", - href: "https://www.webiny.com", - text: "Webiny" - } - ] - } -]; - -const expectedComment = expect.objectContaining({ - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - body: richTextMock, - changeRequest: expect.any(String) -}); - -describe("Comment on a change request test", () => { - const gqlHandler = useGraphQlHandler({ - path: "/graphql" - }); - - const { - createChangeRequestMutation, - createCommentMutation, - listCommentsQuery, - deleteChangeRequestMutation, - until - } = gqlHandler; - - const getChangeRequestStep = async () => { - const { contentReview } = await createPageContentReviewSetup(gqlHandler); - return `${contentReview.id}#${contentReview.steps[0].id}`; - }; - - test("should able to comment on a change request", async () => { - const { contentReview } = await createPageContentReviewSetup(gqlHandler); - const changeRequestStep = `${contentReview.id}#${contentReview.steps[0].id}`; - /* - * Create a new change request entry. - */ - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ step: changeRequestStep }) - }); - const changeRequested = createChangeRequestResponse.data.apw.createChangeRequest.data; - - /** - * Add a comment to this change request. - */ - const [createCommentResponse] = await createCommentMutation({ - data: { - body: richTextMock, - changeRequest: changeRequested.id - } - }); - const firstComment = createCommentResponse.data.apw.createComment.data; - expect(createCommentResponse).toEqual({ - data: { - apw: { - createComment: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - body: richTextMock, - changeRequest: changeRequested.id, - media: null - }, - error: null - } - } - } - }); - - await until( - () => listCommentsQuery({}).then(([data]) => data), - (response: any) => response.data.apw.listComments.data.length === 1, - { - name: "Wait for entry to be available via list query" - } - ); - - /** - * List all comments for a given change request. - */ - const [listCommentsResponse] = await listCommentsQuery({ - where: { - changeRequest: { - id: changeRequested.id - } - } - }); - expect(listCommentsResponse).toEqual({ - data: { - apw: { - listComments: { - data: [ - { - id: firstComment.id, - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - body: richTextMock, - changeRequest: changeRequested.id, - media: null - } - ], - error: null, - meta: { - hasMoreItems: false, - totalCount: 1, - cursor: null - } - } - } - } - }); - - /** - * Add another comment to the change request. - */ - const [anotherCreateCommentResponse] = await createCommentMutation({ - data: { - body: richTextMock, - changeRequest: changeRequested.id - } - }); - const secondComment = anotherCreateCommentResponse.data.apw.createComment.data; - - await until( - () => listCommentsQuery({}).then(([data]) => data), - (response: any) => response.data.apw.listComments.data.length === 2, - { - name: "Wait for entry to be available via list query" - } - ); - - /** - * Again, list all comments for a given change request. - */ - const [listCommentsResponse2] = await listCommentsQuery({ - where: { - changeRequest: { - id: changeRequested.id - } - }, - sort: ["createdOn_DESC"] - }); - expect(listCommentsResponse2).toEqual({ - data: { - apw: { - listComments: { - data: [ - { - id: secondComment.id, - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - body: richTextMock, - changeRequest: changeRequested.id, - media: null - }, - { - id: firstComment.id, - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - body: richTextMock, - changeRequest: changeRequested.id, - media: null - } - ], - error: null, - meta: { - hasMoreItems: false, - totalCount: 2, - cursor: null - } - } - } - } - }); - }); - - test("should able to delete all comments when a change request gets deleted", async () => { - const changeRequestStep = await getChangeRequestStep(); - /* - * Create two new change request entries. - */ - const changesRequested: { id: string }[] = []; - for (let i = 0; i < 2; i++) { - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ step: changeRequestStep }) - }); - changesRequested.push(createChangeRequestResponse.data.apw.createChangeRequest.data); - } - const totalChangeRequest = 2; - const commentsPerChangeRequest = 20; - const totalComments = totalChangeRequest * commentsPerChangeRequest; - /** - * Add two comments on each change request. - */ - const comments = []; - for (let i = 0; i < changesRequested.length; i++) { - for (let j = 0; j < commentsPerChangeRequest; j++) { - const [createCommentResponse] = await createCommentMutation({ - data: { - body: richTextMock, - changeRequest: changesRequested[i].id - } - }); - comments.push(createCommentResponse.data.apw.createComment.data); - } - } - - await until( - () => listCommentsQuery({}).then(([data]) => data), - (response: any) => { - return response.data.apw.listComments.meta.totalCount === totalComments; - }, - { - name: "Wait for entry to be available via list query" - } - ); - - /** - * List all comments. - */ - let [listCommentsResponse] = await listCommentsQuery({ - sort: ["createdOn_DESC"], - limit: 10 - }); - expect(listCommentsResponse).toEqual({ - data: { - apw: { - listComments: { - data: expect.arrayContaining([expectedComment]), - error: null, - meta: { - hasMoreItems: true, - totalCount: totalComments, - cursor: expect.any(String) - } - } - } - } - }); - /** - * Let's delete the first change request. - */ - const [deleteChangeRequest] = await deleteChangeRequestMutation({ - id: changesRequested[0].id - }); - expect(deleteChangeRequest).toEqual({ - data: { - apw: { - deleteChangeRequest: { - data: true, - error: null - } - } - } - }); - - await until( - () => - listCommentsQuery({ - where: { - changeRequest: { - id: changesRequested[0].id - } - } - }).then(([data]) => data), - (response: any) => { - return response.data.apw.listComments.meta.totalCount === 0; - }, - { - name: "Wait for entry to be removed from list query" - } - ); - - /** - * List all the comments associated with the deleted change request. - */ - [listCommentsResponse] = await listCommentsQuery({ - where: { - changeRequest: { - id: changesRequested[0].id - } - } - }); - expect(listCommentsResponse).toEqual({ - data: { - apw: { - listComments: { - data: [], - error: null, - meta: { - hasMoreItems: false, - totalCount: 0, - cursor: null - } - } - } - } - }); - - /** - * List all the comments without any filters. - */ - [listCommentsResponse] = await listCommentsQuery({ - sort: ["createdOn_DESC"], - limit: commentsPerChangeRequest - }); - expect(listCommentsResponse).toEqual({ - data: { - apw: { - listComments: { - data: expect.arrayContaining([expectedComment]), - error: null, - meta: { - hasMoreItems: false, - totalCount: commentsPerChangeRequest, - cursor: null - } - } - } - } - }); - }); - - test(`should return error when trying commenting on non-existing change request`, async () => { - /** - * Try adding a comment to a non-existing change request. - */ - let [createCommentResponse] = await createCommentMutation({ - data: { - body: richTextMock, - changeRequest: "" - } - }); - expect(createCommentResponse).toEqual({ - data: { - apw: { - createComment: { - data: null, - error: { - code: "MALFORMED_CHANGE_REQUEST_ID", - message: expect.any(String), - data: expect.any(Object) - } - } - } - } - }); - - [createCommentResponse] = await createCommentMutation({ - data: { - body: richTextMock, - changeRequest: "6205072093e05300095591a2#0001" - } - }); - expect(createCommentResponse).toEqual({ - data: { - apw: { - createComment: { - data: null, - error: { - code: "NOT_FOUND", - message: expect.any(String), - data: expect.any(Object) - } - } - } - } - }); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/contentReview.crud.test.ts b/packages/api-apw/__tests__/graphql/contentReview.crud.test.ts deleted file mode 100644 index 5210c254718..00000000000 --- a/packages/api-apw/__tests__/graphql/contentReview.crud.test.ts +++ /dev/null @@ -1,481 +0,0 @@ -import { ApwContentReviewStepStatus } from "~/types"; -import { createSetupForPageContentReview } from "../utils/helpers"; -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; -import { createTransport } from "@webiny/api-mailer"; -import { jest } from "@jest/globals"; - -jest.mock("~/plugins/hooks/notifications/appUrl", () => { - return { - getAppUrl: async () => { - return { - appUrl: "https://webiny.local" - }; - } - }; -}); - -describe("Content Review crud test", () => { - const identityRoot = { - id: "root", - displayName: "root", - type: "admin", - email: "testing@webiny.com" - }; - - const gqlHandler = useGraphQlHandler({ - path: "/graphql" - }); - - const rootGqlHandler = useGraphQlHandler({ - path: "/graphql", - identity: identityRoot - }); - - const { - getContentReviewQuery, - createContentReviewMutation, - deleteContentReviewMutation, - listContentReviewsQuery, - until - } = gqlHandler; - - const setup = async () => { - return createSetupForPageContentReview(gqlHandler); - }; - - const expectedContent = { - id: expect.any(String), - type: expect.any(String), - version: expect.any(Number), - settings: null, - publishedBy: null, - publishedOn: null, - scheduledBy: null, - scheduledOn: null - }; - - test(`should able to create, update, get, list and delete "Content Review"`, async () => { - const { page, workflow } = await setup(); - /* - Create a content review entry. - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - expect(createContentReviewResponse).toEqual({ - data: { - apw: { - createContentReview: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - title: expect.any(String), - reviewStatus: "underReview", - steps: workflow.steps.map((_, index) => ({ - status: - index === 0 - ? ApwContentReviewStepStatus.ACTIVE - : ApwContentReviewStepStatus.INACTIVE, - id: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - })), - content: expect.objectContaining(expectedContent) - }, - error: null - } - } - } - }); - - await until( - () => getContentReviewQuery({ id: createdContentReview.id }).then(([data]) => data), - (response: any) => response.data.apw.getContentReview.data !== null, - { - name: "Wait for getContentReview query" - } - ); - - /* - Now that we have a content review entry, we should be able to get it - */ - const [getContentReviewByIdResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - expect(getContentReviewByIdResponse).toEqual({ - data: { - apw: { - getContentReview: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - title: expect.any(String), - reviewStatus: "underReview", - steps: workflow.steps.map((_, index) => ({ - status: - index === 0 - ? ApwContentReviewStepStatus.ACTIVE - : ApwContentReviewStepStatus.INACTIVE, - id: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - })), - content: expect.objectContaining(expectedContent) - }, - error: null - } - } - } - }); - - await until( - () => listContentReviewsQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listContentReviews.data; - return list.length === 1; - }, - { - name: "Wait for updated entry to be available in list query" - } - ); - - /* - Let's list all workflow entries there should be only one - */ - const [listContentReviewsResponse] = await listContentReviewsQuery({}); - expect(listContentReviewsResponse).toEqual({ - data: { - apw: { - listContentReviews: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - title: expect.any(String), - reviewStatus: "underReview", - steps: workflow.steps.map((_, index) => ({ - status: - index === 0 - ? ApwContentReviewStepStatus.ACTIVE - : ApwContentReviewStepStatus.INACTIVE, - id: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - })), - totalComments: 0, - content: expect.objectContaining(expectedContent), - activeStep: { - title: expect.any(String) - }, - latestCommentId: null, - reviewers: expect.arrayContaining([expect.any(String)]) - } - ], - error: null, - meta: { - hasMoreItems: false, - totalCount: 1, - cursor: null - } - } - } - } - }); - - /* - Delete the only entry we have - */ - const [deleteContentReviewResponse] = await deleteContentReviewMutation({ - id: createdContentReview.id - }); - expect(deleteContentReviewResponse).toEqual({ - data: { - apw: { - deleteContentReview: { - data: true, - error: null - } - } - } - }); - - await until( - () => listContentReviewsQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listContentReviews.data; - return list.length === 0; - }, - { - name: "Wait for entry to be removed from list query" - } - ); - - /* - Now that we've deleted the only entry we had, we should get empty list as response from "listContentReviewsQuery" - */ - const [listContentReviewsAgainResponse] = await listContentReviewsQuery({ where: {} }); - expect(listContentReviewsAgainResponse).toEqual({ - data: { - apw: { - listContentReviews: { - data: [], - error: null, - meta: { - hasMoreItems: false, - totalCount: 0, - cursor: null - } - } - } - } - }); - }); - - test(`should able to filter "Content Review" list by "requiresMyAttention" status`, async () => { - const { page, workflow } = await setup(); - /* - Create a content review entry. - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - - expect(createContentReviewResponse).toMatchObject({ - data: { - apw: { - createContentReview: { - data: { - id: expect.any(String) - }, - error: null - } - } - } - }); - - /* - * List all the content reviews that requires the current logged in user's attention. - */ - const [listContentReviewsResponse] = await listContentReviewsQuery({ - where: { - reviewStatus: "requiresMyAttention" - } - }); - expect(listContentReviewsResponse).toEqual({ - data: { - apw: { - listContentReviews: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - title: expect.any(String), - reviewStatus: "underReview", - steps: workflow.steps.map((_, index) => ({ - status: - index === 0 - ? ApwContentReviewStepStatus.ACTIVE - : ApwContentReviewStepStatus.INACTIVE, - id: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - })), - totalComments: 0, - content: expect.objectContaining(expectedContent), - activeStep: { - title: expect.any(String) - }, - latestCommentId: null, - reviewers: expect.arrayContaining([expect.any(String)]) - } - ], - error: null, - meta: { - hasMoreItems: false, - totalCount: 1, - cursor: null - } - } - } - } - }); - - /* - * List all the content reviews that requires the root user's attention. - */ - const [listContentReviewsRootResponse] = await rootGqlHandler.listContentReviewsQuery({ - where: { - reviewStatus: "requiresMyAttention" - } - }); - expect(listContentReviewsRootResponse).toEqual({ - data: { - apw: { - listContentReviews: { - data: [], - error: null, - meta: { - hasMoreItems: false, - totalCount: 0, - cursor: null - } - } - } - } - }); - - /* - * Should be able to get created content reviews when using "listContentReviewsQuery" without filters . - */ - const [listContentReviewsResponse2] = await rootGqlHandler.listContentReviewsQuery({}); - expect(listContentReviewsResponse2).toEqual({ - data: { - apw: { - listContentReviews: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - title: expect.any(String), - reviewStatus: "underReview", - steps: expect.arrayContaining([ - expect.objectContaining({ - status: expect.any(String), - id: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - }) - ]), - totalComments: 0, - content: expect.objectContaining(expectedContent), - activeStep: { - title: expect.any(String) - }, - latestCommentId: null, - reviewers: expect.arrayContaining([expect.any(String)]) - } - ], - error: null, - meta: { - hasMoreItems: false, - totalCount: 1, - cursor: null - } - } - } - } - }); - }); - - it("should send an e-mail to all reviewers after the content review was created", async () => { - const fn = jest.fn(() => { - return null; - }); - - const handler = useGraphQlHandler({ - path: "/graphql", - identity: { - id: "mockIdentityId", - type: "admin", - displayName: "Mock Identity", - email: "mock@webiny.local" - }, - plugins: [ - createTransport(async () => { - return { - name: "test-dummy-transport", - send: async () => { - fn.apply(null); - return { - result: null, - error: null - }; - } - }; - }) - ] - }); - - await handler.securityIdentity.login(); - await gqlHandler.securityIdentity.login(); - await rootGqlHandler.securityIdentity.login(); - - const { page } = await setup(); - /* - Create a content review entry. - */ - const [createContentReviewResponse] = await handler.createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - - expect(createContentReviewResponse).toMatchObject({ - data: { - apw: { - createContentReview: { - data: { - id: expect.any(String) - }, - error: null - } - } - } - }); - /** - * Test expects the mock function to be called as it represents creating notification text and body. - */ - expect(fn).toBeCalledTimes(1); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/contentReview.linkToContent.test.ts b/packages/api-apw/__tests__/graphql/contentReview.linkToContent.test.ts deleted file mode 100644 index fbecab22b77..00000000000 --- a/packages/api-apw/__tests__/graphql/contentReview.linkToContent.test.ts +++ /dev/null @@ -1,230 +0,0 @@ -import { createSetupForPageContentReview } from "../utils/helpers"; -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; - -describe("Content Review assignment to a PB Page", () => { - const gqlHandler = useGraphQlHandler({ - path: "/graphql" - }); - - const { - createContentReviewMutation, - deleteContentReviewMutation, - getPageQuery, - deletePageMutation - } = gqlHandler; - - const setup = async () => { - return createSetupForPageContentReview(gqlHandler); - }; - - test(`Page should have a "contentReview" assigned to it`, async () => { - const { page } = await setup(); - /* - * Initiate a "content review" - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - - expect(createContentReviewResponse).toMatchObject({ - data: { - apw: { - createContentReview: { - data: { - id: expect.any(String) - }, - error: null - } - } - } - }); - - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - /** - * Now page should have this "contentReview" assigned to it. - */ - const [getPageResponse] = await getPageQuery({ id: page.id }); - expect(getPageResponse.data.pageBuilder.getPage.data.settings.apw.contentReviewId).toBe( - createdContentReview.id - ); - }); - - test(`Should not able to request "contentReview" more than once`, async () => { - const { page } = await setup(); - /* - * Initiate a "content review" - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - /** - * Now page should have this "contentReview" assigned to it. - */ - const [getPageResponse] = await getPageQuery({ id: page.id }); - expect(getPageResponse.data.pageBuilder.getPage.data.settings.apw.contentReviewId).toBe( - createdContentReview.id - ); - - /* - * Let's try to initiate another "content review" for the same content. - */ - const [createContentReviewAgainResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - expect(createContentReviewAgainResponse).toEqual({ - data: { - apw: { - createContentReview: { - data: null, - error: { - message: expect.any(String), - code: "REVIEW_ALREADY_EXIST", - data: expect.any(Object) - } - } - } - } - }); - }); - - test(`Page should not have a "contentReview" assigned after review deletion`, async () => { - const { page } = await setup(); - /* - * Initiate a "content review" - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - /** - * Now page should have this "contentReview" assigned to it. - */ - const [getPageResponse] = await getPageQuery({ id: page.id }); - expect(getPageResponse.data.pageBuilder.getPage.data.settings.apw.contentReviewId).toBe( - createdContentReview.id - ); - - /** - * Let's delete the "content review". - */ - const [deleteContentReviewResponse] = await deleteContentReviewMutation({ - id: createdContentReview.id - }); - expect(deleteContentReviewResponse).toEqual({ - data: { - apw: { - deleteContentReview: { - data: true, - error: null - } - } - } - }); - - /** - * Now page should not have this "contentReview" assigned to it. - */ - const [getPageAgainResponse] = await getPageQuery({ id: page.id }); - expect( - getPageAgainResponse.data.pageBuilder.getPage.data.settings.apw.contentReviewId - ).toBe(null); - }); - - test(`Should not let user delete a page if there is a "contentReview" assigned to it`, async () => { - const { page } = await setup(); - /* - * Initiate a "content review" - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - /** - * Now page should have this "contentReview" assigned to it. - */ - const [getPageResponse] = await getPageQuery({ id: page.id }); - expect(getPageResponse.data.pageBuilder.getPage.data.settings.apw.contentReviewId).toBe( - createdContentReview.id - ); - - /** - * Let's try deleting a page. - */ - const [deletePageResponse] = await deletePageMutation({ id: page.id }); - /** - * Should throw an error. - */ - expect(deletePageResponse).toEqual({ - data: { - pageBuilder: { - deletePage: { - data: null, - error: { - code: "CANNOT_DELETE_REVIEW_EXIST", - message: expect.any(String), - data: expect.any(Object) - } - } - } - } - }); - - /** - * Let's delete the "content review". - */ - const [deleteContentReviewResponse] = await deleteContentReviewMutation({ - id: createdContentReview.id - }); - expect(deleteContentReviewResponse).toEqual({ - data: { - apw: { - deleteContentReview: { - data: true, - error: null - } - } - } - }); - - /** - * Now page should not have this "contentReview" assigned to it. - */ - const [getPageAgainResponse] = await getPageQuery({ id: page.id }); - expect( - getPageAgainResponse.data.pageBuilder.getPage.data.settings.apw.contentReviewId - ).toBe(null); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/deleteEntrieContentReviewArtifacts.test.ts b/packages/api-apw/__tests__/graphql/deleteEntrieContentReviewArtifacts.test.ts deleted file mode 100644 index 94c07c3539d..00000000000 --- a/packages/api-apw/__tests__/graphql/deleteEntrieContentReviewArtifacts.test.ts +++ /dev/null @@ -1,299 +0,0 @@ -import { createSetupForPageContentReview } from "../utils/helpers"; -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; -import { mocks as changeRequestMock, richTextMock } from "./mocks/changeRequest"; - -describe(`Delete "content review" and associated "change requests" and "comments"`, () => { - const gqlHandler = useGraphQlHandler({ - path: "/graphql" - }); - const { - createContentReviewMutation, - getContentReviewQuery, - createChangeRequestMutation, - createCommentMutation, - listChangeRequestsQuery, - listCommentsQuery, - deleteContentReviewMutation, - getPageQuery - } = gqlHandler; - - /** - * Let's do the setup. - */ - const setup = async () => { - const { page } = await createSetupForPageContentReview(gqlHandler); - return { - page - }; - }; - - const expectedContent = { - id: expect.any(String), - type: expect.any(String), - version: expect.any(Number), - settings: null, - publishedBy: null, - publishedOn: null, - scheduledBy: null, - scheduledOn: null - }; - - test(`Should able to "delete" entire content review process`, async () => { - const { page } = await setup(); - - /** - * Initial a review. - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - /** - * Fetch the content review and check contentReview status. - */ - let [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - const contentReview = getContentReviewResponse.data.apw.getContentReview.data; - expect(contentReview.reviewStatus).toEqual("underReview"); - - /** - * Let's create a "change request" for every step of the publishing workflow. - */ - const changeRequests = []; - - for (let i = 0; i < contentReview.steps.length; i++) { - const currentStep = contentReview.steps[i]; - const changeRequestStep = `${contentReview.id}#${currentStep.id}`; - - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ step: changeRequestStep }) - }); - const changeRequest = createChangeRequestResponse.data.apw.createChangeRequest.data; - /** - * Save it for later. - */ - changeRequests.push(changeRequest); - /** - * Let's add two comments for each of these "change requests". - */ - - for (let j = 0; j < 2; j++) { - const [createCommentResponse] = await createCommentMutation({ - data: { - body: richTextMock, - changeRequest: changeRequest.id, - media: { - src: "cloudfront.net/my-file" - } - } - }); - expect(createCommentResponse).toEqual({ - data: { - apw: { - createComment: { - error: null, - data: expect.any(Object) - } - } - } - }); - } - } - - /** - * Fetch the content review and check if the updates were successful. - */ - [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - - expect(getContentReviewResponse.data.apw.getContentReview.data).toEqual({ - content: expect.objectContaining(expectedContent), - createdBy: { - displayName: expect.any(String), - id: expect.any(String), - type: expect.any(String) - }, - createdOn: expect.stringMatching(/^20/), - id: expect.any(String), - savedOn: expect.stringMatching(/^20/), - reviewStatus: "underReview", - steps: [ - { - id: expect.any(String), - pendingChangeRequests: 1, - signOffProvidedBy: null, - signOffProvidedOn: null, - status: "active" - }, - { - id: expect.any(String), - pendingChangeRequests: 1, - signOffProvidedBy: null, - signOffProvidedOn: null, - status: "inactive" - }, - { - id: expect.any(String), - pendingChangeRequests: 1, - signOffProvidedBy: null, - signOffProvidedOn: null, - status: "inactive" - } - ], - title: expect.any(String) - }); - - const [changeRequest1, changeRequest2, changeRequest3] = changeRequests; - /** - * Let's list comments for each change request. - */ - let [listCommentsResponse] = await listCommentsQuery({ - where: { changeRequest: { id: changeRequest1.id } } - }); - expect(listCommentsResponse).toEqual({ - data: { - apw: { - listComments: { - data: expect.any(Object), - error: null, - meta: { - hasMoreItems: false, - totalCount: 2, - cursor: null - } - } - } - } - }); - - [listCommentsResponse] = await listCommentsQuery({ - where: { changeRequest: { id: changeRequest2.id } } - }); - expect(listCommentsResponse).toEqual({ - data: { - apw: { - listComments: { - data: expect.any(Object), - error: null, - meta: { - hasMoreItems: false, - totalCount: 2, - cursor: null - } - } - } - } - }); - - [listCommentsResponse] = await listCommentsQuery({ - where: { changeRequest: { id: changeRequest3.id } } - }); - expect(listCommentsResponse).toEqual({ - data: { - apw: { - listComments: { - data: expect.any(Object), - error: null, - meta: { - hasMoreItems: false, - totalCount: 2, - cursor: null - } - } - } - } - }); - - /** - * Let's delete the content review itself. - */ - const [deleteContentReviewResponse] = await deleteContentReviewMutation({ - id: contentReview.id - }); - expect(deleteContentReviewResponse).toEqual({ - data: { - apw: { - deleteContentReview: { - data: true, - error: null - } - } - } - }); - - /** - * Should return "NOT_FOUND" error when trying to fetch "content review" after deletion. - */ - [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - - expect(getContentReviewResponse).toEqual({ - data: { - apw: { - getContentReview: { - data: null, - error: { - message: expect.any(String), - code: "NOT_FOUND", - data: expect.any(Object) - } - } - } - } - }); - /** - * Should also delete all linked "changeRequests" after "content review" deletion. - */ - const [listChangeRequestsResponse] = await listChangeRequestsQuery({}); - expect(listChangeRequestsResponse).toEqual({ - data: { - apw: { - listChangeRequests: { - data: [], - error: null, - meta: { - hasMoreItems: false, - totalCount: 0, - cursor: null - } - } - } - } - }); - /** - * Should also delete all linked "comments" after "content review" deletion. - */ - [listCommentsResponse] = await listCommentsQuery({}); - expect(listCommentsResponse).toEqual({ - data: { - apw: { - listComments: { - data: [], - error: null, - meta: { - hasMoreItems: false, - totalCount: 0, - cursor: null - } - } - } - } - }); - - /** - * Should unlink attached "contentReview" from page settings after contentReview deletion. - */ - const [getPageResponse] = await getPageQuery({ id: page.id }); - const pageData = getPageResponse.data.pageBuilder.getPage.data; - expect(pageData.settings.apw.contentReviewId).toEqual(null); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/entryPublishingWorkflow.test.ts b/packages/api-apw/__tests__/graphql/entryPublishingWorkflow.test.ts deleted file mode 100644 index 7c2ccad4cdf..00000000000 --- a/packages/api-apw/__tests__/graphql/entryPublishingWorkflow.test.ts +++ /dev/null @@ -1,778 +0,0 @@ -import { createSetupForEntryContentReview } from "../utils/cms.helpers"; -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; -import { ApwContentTypes } from "~/scheduler/types"; - -const updatedProductName = "Updated Webiny product"; - -describe("Cms Entry Publishing Workflow", () => { - const cmsHandler = useGraphQlHandler({ - path: "/cms/manage/en-US" - }); - const { getContentEntryQuery, updateContentEntryMutation, createContentEntryFromMutation } = - cmsHandler; - - const coreHandler = useGraphQlHandler({ - path: "/graphql" - }); - - const { - createContentReviewMutation, - getContentReviewQuery, - provideSignOffMutation, - retractSignOffMutation, - publishContentMutation, - unpublishContentMutation - } = coreHandler; - - const setup = async () => { - return createSetupForEntryContentReview({ - coreHandler, - cmsHandler - }); - }; - - it(`should be able to "publish" entry for content review process`, async () => { - const { entry, model, workflow } = await setup(); - - /** - * Initial review. - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: entry.id, - type: ApwContentTypes.CMS_ENTRY, - settings: { - modelId: model.modelId - } - } - } - }); - - /* - * Check content status, it should be "under review". - */ - expect(createContentReviewResponse).toMatchObject({ - data: { - apw: { - createContentReview: { - data: { - id: expect.stringMatching(/^([a-z0-9]+)\#0001$/), - content: { - id: entry.id, - type: ApwContentTypes.CMS_ENTRY, - version: 1 - }, - reviewStatus: "underReview", - title: entry.name - }, - error: null - } - } - } - }); - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - /* - * We should be able to make updates to the entry. - */ - const [updateEntryResponse] = await updateContentEntryMutation(model, { - revision: entry.id, - data: { - sku: entry.sku, - description: entry.description, - body: entry.body, - name: updatedProductName - } - }); - const updatedProduct = updateEntryResponse.data.updateProduct.data; - /** - * CMS Entry should have "apw" properties after update. - */ - expect(updateEntryResponse).toMatchObject({ - data: { - updateProduct: { - data: { - id: entry.id, - entryId: entry.entryId, - meta: { - version: 1, - data: { - apw: { - workflowId: workflow.id, - contentReviewId: createdContentReview.id - } - } - } - }, - error: null - } - } - }); - /** - * Make sure that product is updated. - */ - const [getAfterUpdateProduct] = await getContentEntryQuery(model, { - revision: entry.id - }); - expect(getAfterUpdateProduct).toMatchObject({ - data: { - getProduct: { - data: { - id: entry.id, - entryId: entry.entryId, - name: updatedProductName - }, - error: null - } - } - }); - /** - * Fetch the content review and check if the updates were successful. - */ - const [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - const contentReview = getContentReviewResponse.data.apw.getContentReview.data; - expect(contentReview.reviewStatus).toEqual("underReview"); - expect(contentReview.title).toEqual(updatedProduct.name); - - /** - * Should not let us publish a entry. - */ - const [publishContentResponse] = await publishContentMutation({ id: contentReview.id }); - expect(publishContentResponse).toEqual({ - data: { - apw: { - publishContent: { - data: null, - error: { - code: "NOT_READY_TO_BE_PUBLISHED", - message: expect.any(String), - data: expect.any(Object) - } - } - } - } - }); - - /** - * Should be able to create a new revision, even though the content is "underReview". - */ - const [createProductFromResponse] = await createContentEntryFromMutation(model, { - revision: entry.id - }); - /** - * Should still have the workflow assigned. - * But, should not have "contentReviewId". - */ - expect(createProductFromResponse).toEqual({ - data: { - createProductFrom: { - data: { - id: `${entry.entryId}#0002`, - entryId: entry.entryId, - name: updatedProductName, - sku: entry.sku, - body: entry.body, - description: entry.description, - meta: { - data: { - apw: { - workflowId: workflow.id, - contentReviewId: null - } - }, - status: "draft", - version: 2 - } - }, - error: null - } - } - }); - - /** - * Let's provide sign-off to every step of the publishing workflow. - */ - const [step1, step2, step3] = contentReview.steps; - - const [provideSignOffResponse] = await provideSignOffMutation({ - id: contentReview.id, - step: step1.id - }); - - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - const [provideSignOff2Response] = await provideSignOffMutation({ - id: contentReview.id, - step: step2.id - }); - - expect(provideSignOff2Response).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - const [provideSignOff3Response] = await provideSignOffMutation({ - id: contentReview.id, - step: step3.id - }); - - expect(provideSignOff3Response).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - /** - * After providing sign-off to every step of the workflow, - * Now the content should be in "readyToBePublished" stage. - */ - const [getContentReviewAfterSignOffResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - const updatedContentReview = - getContentReviewAfterSignOffResponse.data.apw.getContentReview.data; - expect(updatedContentReview.reviewStatus).toEqual("readyToBePublished"); - expect(updatedContentReview.title).toEqual(updatedProduct.name); - - /** - * Let's retract the provided sign-off for a "required step" of the publishing workflow. - */ - const [retractSignOffResponse] = await retractSignOffMutation({ - id: contentReview.id, - step: step2.id - }); - expect(retractSignOffResponse).toEqual({ - data: { - apw: { - retractSignOff: { - data: true, - error: null - } - } - } - }); - - /** - * After retracting sign-off to a step of the workflow, - * Now the content should be back in "underReview" stage. - */ - const [getContentReviewAfterRetractingSignOffResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - expect( - getContentReviewAfterRetractingSignOffResponse.data.apw.getContentReview.data - .reviewStatus - ).toEqual("underReview"); - - /** - * Let's again provide the sign-off for step 2. - */ - const [provideSignOff2AgainResponse] = await provideSignOffMutation({ - id: contentReview.id, - step: step2.id - }); - - expect(provideSignOff2AgainResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - /** - * Let's confirm that the content is "published". - */ - const [getProductBeforeSignOffResponse] = await getContentEntryQuery(model, { - revision: entry.id - }); - expect(getProductBeforeSignOffResponse).toEqual({ - data: { - getProduct: { - data: { - ...updatedProduct, - meta: { - ...updatedProduct.meta, - status: "draft", - data: { - ...updatedProduct.meta.data - } - } - }, - error: null - } - } - }); - - /** - * Let's confirm that the content is "published". - */ - const [getProductBeforePublishResponse] = await getContentEntryQuery(model, { - revision: entry.id - }); - expect(getProductBeforePublishResponse).toEqual({ - data: { - getProduct: { - data: { - ...updatedProduct, - meta: { - ...updatedProduct.meta, - status: "draft", - data: { - ...updatedProduct.meta.data - } - } - }, - error: null - } - } - }); - - const cleanCoreHandler = useGraphQlHandler({ - path: "/graphql" - }); - /** - * After providing sign-off to every step of the workflow, - * Should be able to publish the entry. - * - * We need to use the clean handler, with no cache. - */ - const [publishContentAfterAllSignOffResponse] = - await cleanCoreHandler.publishContentMutation({ - id: contentReview.id - }); - expect(publishContentAfterAllSignOffResponse).toEqual({ - data: { - apw: { - publishContent: { - data: true, - error: null - } - } - } - }); - - const cleanCmsHandler = useGraphQlHandler({ - path: "/cms/manage/en-US" - }); - /** - * Let's confirm that the content is "published". - * - * We need to use the clean handler, with no cache. - */ - const [getProductResponse] = await cleanCmsHandler.getContentEntryQuery(model, { - revision: entry.id - }); - expect(getProductResponse).toEqual({ - data: { - getProduct: { - data: { - ...updatedProduct, - meta: { - ...updatedProduct.meta, - status: "published", - data: { - ...updatedProduct.meta.data - } - } - }, - error: null - } - } - }); - - expect(getProductResponse.data.getProduct.data.meta.status).toEqual("published"); - expect(getProductResponse.data.getProduct.data.meta.version).toEqual(1); - - /** - * Fetch the content review and check if the status has been updated successful. - */ - const [getContentReviewAfterPublishResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - - expect( - getContentReviewAfterPublishResponse.data.apw.getContentReview.data.reviewStatus - ).toEqual("published"); - }); - - test(`Should able to "unpublish" entry for content review process`, async () => { - const { entry, model } = await setup(); - - /** - * Initial a review. - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: entry.id, - type: ApwContentTypes.CMS_ENTRY, - settings: { - modelId: model.modelId - } - } - } - }); - expect(createContentReviewResponse).toEqual({ - data: { - apw: { - createContentReview: { - data: expect.any(Object), - error: null - } - } - } - }); - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - /* - * Check content status, it should be "under review". - */ - expect(createdContentReview.reviewStatus).toEqual("underReview"); - expect(createdContentReview.title).toEqual(entry.name); - - /* - * We should be able to make updates to the entry. - */ - const [updateProductResponse] = await updateContentEntryMutation(model, { - revision: entry.id, - data: { - sku: entry.sku, - description: entry.description, - body: entry.body, - name: updatedProductName - } - }); - const updatedProduct = updateProductResponse.data.updateProduct.data; - /** - * Fetch the content review and check if the updates were successful. - */ - const [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - const contentReview = getContentReviewResponse.data.apw.getContentReview.data; - expect(contentReview.reviewStatus).toEqual("underReview"); - expect(contentReview.title).toEqual(updatedProduct.name); - - /** - * Should not let us publish a entry. - */ - const [publishContentResponse] = await publishContentMutation({ - id: contentReview.id - }); - expect(publishContentResponse).toEqual({ - data: { - apw: { - publishContent: { - data: null, - error: { - code: "NOT_READY_TO_BE_PUBLISHED", - message: expect.any(String), - data: expect.any(Object) - } - } - } - } - }); - - /** - * Should be able to create a new revision, even though the content is "underReview". - */ - const [createProductFromResponse] = await createContentEntryFromMutation(model, { - revision: updatedProduct.id - }); - expect(createProductFromResponse).toEqual({ - data: { - createProductFrom: { - data: { - ...updatedProduct, - name: updatedProductName, - id: `${updatedProduct.entryId}#0002`, - meta: { - ...updatedProduct.meta, - data: { - ...updatedProduct.meta.data, - apw: { - ...updatedProduct.meta.data.apw, - contentReviewId: null - } - }, - version: 2 - } - }, - error: null - } - } - }); - - const createdFromProduct = createProductFromResponse.data.createProductFrom.data; - /** - * Should still have the workflow assigned. - * But, should not have "contentReviewId". - */ - expect(createdFromProduct.meta.data.apw).toEqual({ - workflowId: updatedProduct.meta.data.apw.workflowId, - contentReviewId: null - }); - - /** - * Let's provide sign-off to every step of the publishing workflow. - */ - const [step1, step2, step3] = contentReview.steps; - - const [provideSignOff1Response] = await provideSignOffMutation({ - id: contentReview.id, - step: step1.id - }); - - expect(provideSignOff1Response).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - const [provideSignOff2Response] = await provideSignOffMutation({ - id: contentReview.id, - step: step2.id - }); - - expect(provideSignOff2Response).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - const [provideSignOff3Response] = await provideSignOffMutation({ - id: contentReview.id, - step: step3.id - }); - - expect(provideSignOff3Response).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - /** - * After providing sign-off to every step of the workflow, - * Now the content should be in "readyToBePublished" stage. - */ - const [getContentReviewAfterSignOffResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - const updatedContentReview = - getContentReviewAfterSignOffResponse.data.apw.getContentReview.data; - expect(updatedContentReview.reviewStatus).toEqual("readyToBePublished"); - expect(updatedContentReview.title).toEqual(updatedProduct.name); - - /** - * Let's retract the provided sign-off for a "required step" of the publishing workflow. - */ - const [retractSignOffResponse] = await retractSignOffMutation({ - id: contentReview.id, - step: step2.id - }); - expect(retractSignOffResponse).toEqual({ - data: { - apw: { - retractSignOff: { - data: true, - error: null - } - } - } - }); - - /** - * After retracting sign-off to a step of the workflow, - * Now the content should be back in "underReview" stage. - */ - const [getContentReviewAfterRetractingResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - expect( - getContentReviewAfterRetractingResponse.data.apw.getContentReview.data.reviewStatus - ).toEqual("underReview"); - - /** - * Let's again provide the sign-off for step 2. - */ - const [provideSignOffAfterRetractingResponse] = await provideSignOffMutation({ - id: contentReview.id, - step: step2.id - }); - - expect(provideSignOffAfterRetractingResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - const cleanCoreHandler = useGraphQlHandler({ - path: "/graphql" - }); - /** - * After providing sign-off to every step of the workflow, - * Should be able to publish the entry. - * - * We need to use clean core handler, with no cache. - */ - const [publishContentAfterSignOffResponse] = await cleanCoreHandler.publishContentMutation({ - id: contentReview.id - }); - expect(publishContentAfterSignOffResponse).toEqual({ - data: { - apw: { - publishContent: { - data: true, - error: null - } - } - } - }); - - /** - * Let's confirm that the content is "published". - */ - const [getProductResponse] = await getContentEntryQuery(model, { - revision: updatedProduct.id - }); - expect(getProductResponse).toEqual({ - data: { - getProduct: { - data: { - ...updatedProduct, - meta: { - ...updatedProduct.meta, - data: { - ...updatedProduct.meta.data, - apw: { - ...updatedProduct.meta.data.apw, - contentReviewId: contentReview.id - } - }, - status: "published", - version: 1 - } - }, - error: null - } - } - }); - - expect(getProductResponse.data.getProduct.data.meta.status).toEqual("published"); - expect(getProductResponse.data.getProduct.data.meta.version).toEqual(1); - - /** - * Fetch the content review and check if the status has been updated successful. - */ - const [getContentReviewAfterPublishResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - - expect( - getContentReviewAfterPublishResponse.data.apw.getContentReview.data.reviewStatus - ).toEqual("published"); - - /** - * Let's "unpublish" the content. - */ - const [unPublishContentResponse] = await unpublishContentMutation({ - id: contentReview.id - }); - expect(unPublishContentResponse).toEqual({ - data: { - apw: { - unpublishContent: { - data: true, - error: null - } - } - } - }); - - const cleanCmsHandler = useGraphQlHandler({ - path: "/cms/manage/en-US" - }); - /** - * Let's confirm that the content is "unpublished". - */ - const [getProductAfterUnpublishResponse] = await cleanCmsHandler.getContentEntryQuery( - model, - { - revision: updatedProduct.id - } - ); - expect(getProductAfterUnpublishResponse).toEqual({ - data: { - getProduct: { - data: { - ...updatedProduct, - meta: { - ...updatedProduct.meta, - status: "unpublished", - version: 1 - } - }, - error: null - } - } - }); - - /** - * Fetch the content review and check if the status has been updated successful. - */ - const [getContentReviewAfterUnpublishResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - - expect( - getContentReviewAfterUnpublishResponse.data.apw.getContentReview.data.reviewStatus - ).toEqual("readyToBePublished"); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/isReviewRequired.test.ts b/packages/api-apw/__tests__/graphql/isReviewRequired.test.ts deleted file mode 100644 index 85142a229f9..00000000000 --- a/packages/api-apw/__tests__/graphql/isReviewRequired.test.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; -import { ApwContentTypes } from "~/types"; -import { createSetupForPageContentReview } from "../utils/helpers"; - -describe("Is review required test", () => { - const gqlHandler = useGraphQlHandler({ - path: "/graphql" - }); - const { isReviewRequiredQuery, createContentReviewMutation } = gqlHandler; - - const setup = async () => { - return createSetupForPageContentReview(gqlHandler); - }; - - test(`should able to create, update, get, list and delete "Content Review"`, async () => { - const { page } = await setup(); - - /** - * Should require a review but there should not be any existing content review. - */ - let [isReviewRequiredResponse] = await isReviewRequiredQuery({ - data: { - id: page.id, - type: ApwContentTypes.PAGE - } - }); - expect(isReviewRequiredResponse).toEqual({ - data: { - apw: { - isReviewRequired: { - data: { - isReviewRequired: true, - contentReviewId: null - }, - error: null - } - } - } - }); - - /* - * Let's create a content review. - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - expect(createContentReviewResponse).toEqual({ - data: { - apw: { - createContentReview: { - data: expect.any(Object), - error: null - } - } - } - }); - - /** - * Now, after initiating a content review, - * we should still get "isReviewRequired" and there should be any existing content review. - */ - [isReviewRequiredResponse] = await isReviewRequiredQuery({ - data: { - id: page.id, - type: ApwContentTypes.PAGE - } - }); - expect(isReviewRequiredResponse).toEqual({ - data: { - apw: { - isReviewRequired: { - data: { - isReviewRequired: true, - contentReviewId: createdContentReview.id - }, - error: null - } - } - } - }); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/mocks/access/permissions.ts b/packages/api-apw/__tests__/graphql/mocks/access/permissions.ts deleted file mode 100644 index 82f33c2a1fa..00000000000 --- a/packages/api-apw/__tests__/graphql/mocks/access/permissions.ts +++ /dev/null @@ -1,35 +0,0 @@ -export const permissions = [ - { - name: "content.i18n" - }, - { - name: "cms.endpoint.read" - }, - { - name: "cms.endpoint.manage" - }, - { - name: "cms.endpoint.preview" - }, - { - name: "cms.contentModel", - models: { - "en-US": ["accessTestModel"] - }, - rwd: "rwd", - own: false, - pw: null - }, - { - name: "cms.contentModelGroup", - rwd: "r", - own: false, - pw: null - }, - { - name: "cms.contentEntry", - rwd: "rwd", - own: false, - pw: "purc" - } -]; diff --git a/packages/api-apw/__tests__/graphql/mocks/access/plugins.ts b/packages/api-apw/__tests__/graphql/mocks/access/plugins.ts deleted file mode 100644 index f78840b069f..00000000000 --- a/packages/api-apw/__tests__/graphql/mocks/access/plugins.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { createCmsGroup, createCmsModel } from "@webiny/api-headless-cms"; - -export const accessTestGroup = createCmsGroup({ - id: "accessTestGroup", - slug: "accessTestGroup", - name: "Access Test Group", - description: "", - icon: "fa/fas" -}); - -export const accessTestModel = createCmsModel({ - name: "Access Test Model", - modelId: "accessTestModel", - description: "Used to test access", - group: { - id: accessTestGroup.contentModelGroup.id, - name: accessTestGroup.contentModelGroup.name - }, - fields: [ - { - id: "title", - storageId: "someOtherStorageId", - fieldId: "title", - type: "text", - label: "Title" - } - ], - layout: [["title"]], - titleFieldId: "title" -}); diff --git a/packages/api-apw/__tests__/graphql/mocks/changeRequest.ts b/packages/api-apw/__tests__/graphql/mocks/changeRequest.ts deleted file mode 100644 index 95f7b4969f8..00000000000 --- a/packages/api-apw/__tests__/graphql/mocks/changeRequest.ts +++ /dev/null @@ -1,35 +0,0 @@ -export const richTextMock = [ - { - tag: "h1", - content: "Testing H1 tags" - }, - { - tag: "p", - content: "Some small piece of text to test P tags" - }, - { - tag: "div", - content: [ - { - tag: "p", - text: "Text inside the div > p" - }, - { - tag: "a", - href: "https://www.webiny.com", - text: "Webiny" - } - ] - } -]; - -export const mocks = { - createChangeRequestInput: ({ step, title }: { step: string; title?: string }) => ({ - step: step, - title: title || "Please replace this heading", - body: richTextMock, - media: { - src: "cloudfront.net/my-file" - } - }) -}; diff --git a/packages/api-apw/__tests__/graphql/mocks/workflows.ts b/packages/api-apw/__tests__/graphql/mocks/workflows.ts deleted file mode 100644 index 2be46df8135..00000000000 --- a/packages/api-apw/__tests__/graphql/mocks/workflows.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { - ApwReviewer, - ApwWorkflowApplications, - ApwWorkflowStepTypes, - WorkflowScopeTypes -} from "~/types"; - -import { generateAlphaNumericId } from "@webiny/utils"; - -export interface CreateWorkflowParams { - title?: string; - app: ApwWorkflowApplications; - scope?: { - type: WorkflowScopeTypes; - data?: Record; - }; -} - -interface CreateWorkflowStepParams { - title: string; - type: ApwWorkflowStepTypes; - reviewers: Array<{ id: string }>; -} - -const createWorkflowStep = (params: CreateWorkflowStepParams) => ({ - ...params, - id: generateAlphaNumericId(12), - reviewers: params.reviewers.map(reviewer => reviewer.id) -}); - -export default { - reviewerModelId: "apwReviewerModelDefinition", - createWorkflowStep, - createWorkflow: (params: CreateWorkflowParams, reviewers: ApwReviewer[]) => ({ - title: "Main workflow", - steps: [ - createWorkflowStep({ - title: "Legal Review", - type: ApwWorkflowStepTypes.MANDATORY_BLOCKING, - reviewers - }) - ], - scope: { - type: "default", - data: null - }, - ...params - }), - createWorkflowWithThreeSteps: (params: CreateWorkflowParams, reviewers: ApwReviewer[]) => ({ - title: "Main workflow", - steps: [ - createWorkflowStep({ - title: "Legal Review", - type: ApwWorkflowStepTypes.MANDATORY_BLOCKING, - reviewers - }), - createWorkflowStep({ - title: "Design Review", - type: ApwWorkflowStepTypes.MANDATORY_NON_BLOCKING, - reviewers - }), - createWorkflowStep({ - title: "Copy Review", - type: ApwWorkflowStepTypes.NON_MANDATORY, - reviewers - }) - ], - scope: { - type: "default", - data: null - }, - ...params - }), - scopes: [ - { - type: WorkflowScopeTypes.DEFAULT - }, - { - type: WorkflowScopeTypes.DEFAULT - }, - { - type: WorkflowScopeTypes.CUSTOM - }, - { - type: WorkflowScopeTypes.CUSTOM - }, - { - type: WorkflowScopeTypes.CUSTOM - } - ], - getPageBuilderScope: (pageId: string, pageCategory?: string) => [ - { - type: WorkflowScopeTypes.CUSTOM, - data: { - entries: [], - models: [], - pages: [], - categories: ["dynamic", pageCategory] - } - }, - { - type: WorkflowScopeTypes.DEFAULT - }, - { - type: WorkflowScopeTypes.CUSTOM, - data: { - entries: [], - models: [], - categories: [], - pages: ["page#1", "page#2", "page#3", pageId] - } - }, - { - type: WorkflowScopeTypes.CUSTOM, - data: { - entries: [], - models: [], - pages: [], - categories: ["random", pageCategory] - } - }, - { - type: WorkflowScopeTypes.CUSTOM, - data: { - entries: [], - models: [], - categories: [], - pages: ["page#1", "page#2", "page#3", pageId] - } - } - ], - mainWorkflow: { - app: "pageBuilder", - title: "Main review workflow", - steps: [ - createWorkflowStep({ - title: "Legal Review", - type: ApwWorkflowStepTypes.MANDATORY_BLOCKING, - reviewers: [{ id: "12345678#0001" }] - }), - createWorkflowStep({ - title: "Design Review", - type: ApwWorkflowStepTypes.MANDATORY_BLOCKING, - reviewers: [{ id: "12345678#0001" }] - }) - ], - scope: { - type: WorkflowScopeTypes.CUSTOM, - data: { - entries: [], - models: [], - pages: [], - categories: ["static"] - } - } - } -}; diff --git a/packages/api-apw/__tests__/graphql/pagePublishingWorkflow.test.ts b/packages/api-apw/__tests__/graphql/pagePublishingWorkflow.test.ts deleted file mode 100644 index 55c8787bf35..00000000000 --- a/packages/api-apw/__tests__/graphql/pagePublishingWorkflow.test.ts +++ /dev/null @@ -1,582 +0,0 @@ -import { createSetupForPageContentReview } from "../utils/helpers"; -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; - -describe("Page publishing workflow", () => { - const gqlHandler = useGraphQlHandler({ - path: "/graphql" - }); - const { - createContentReviewMutation, - getContentReviewQuery, - updatePage, - createPage, - getPageQuery, - provideSignOffMutation, - retractSignOffMutation, - publishContentMutation, - unpublishContentMutation - } = gqlHandler; - - /** - * Let's do the setup. - */ - const setup = async () => createSetupForPageContentReview(gqlHandler); - - test(`Should able to "publish" page for content review process`, async () => { - const { page, workflow } = await setup(); - - /** - * Initial a review. - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - - expect(createContentReviewResponse).toMatchObject({ - data: { - apw: { - createContentReview: { - data: { - id: expect.any(String) - }, - error: null - } - } - } - }); - - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - /* - * Check content status, it should be "under review". - */ - expect(createdContentReview.reviewStatus).toEqual("underReview"); - expect(createdContentReview.title).toEqual(page.title); - - /* - * We should be able to make updates to the page. - */ - const [updatePageResponse] = await updatePage({ - id: page.id, - data: { - title: "About us" - } - }); - const updatedPage = updatePageResponse.data.pageBuilder.updatePage.data; - /** - * Page should have "apw" properties after update. - */ - expect(updatedPage.settings.apw).toEqual({ - workflowId: workflow.id, - contentReviewId: createdContentReview.id - }); - /** - * Fetch the content review and check if the updates were successful. - */ - let [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - const contentReview = getContentReviewResponse.data.apw.getContentReview.data; - expect(contentReview.reviewStatus).toEqual("underReview"); - expect(contentReview.title).toEqual(updatedPage.title); - - /** - * Should not let us publish a page. - */ - let [publishContentResponse] = await publishContentMutation({ id: contentReview.id }); - expect(publishContentResponse).toEqual({ - data: { - apw: { - publishContent: { - data: null, - error: { - code: "NOT_READY_TO_BE_PUBLISHED", - message: expect.any(String), - data: expect.any(Object) - } - } - } - } - }); - - /** - * Should be able to create a new revision, even though the content is "underReview". - */ - const [createPageFromResponse] = await createPage({ - from: page.id, - category: page.category.slug - }); - expect(createPageFromResponse).toEqual({ - data: { - pageBuilder: { - createPage: { - data: expect.any(Object), - error: null - } - } - } - }); - - const pageRevision2 = createPageFromResponse.data.pageBuilder.createPage.data; - /** - * Should still have the workflow assigned. - * But, should not have "contentReviewId". - */ - expect(pageRevision2.settings.apw).toEqual({ - workflowId: page.settings.apw.workflowId, - contentReviewId: null - }); - - /** - * Let's provide sign-off to every step of the publishing workflow. - */ - const [step1, step2, step3] = contentReview.steps; - - let [provideSignOffResponse] = await provideSignOffMutation({ - id: contentReview.id, - step: step1.id - }); - - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - [provideSignOffResponse] = await provideSignOffMutation({ - id: contentReview.id, - step: step2.id - }); - - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - [provideSignOffResponse] = await provideSignOffMutation({ - id: contentReview.id, - step: step3.id - }); - - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - /** - * After providing sign-off to every step of the workflow, - * Now the content should be in "readyToBePublished" stage. - */ - [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - const updatedContentReview = getContentReviewResponse.data.apw.getContentReview.data; - expect(updatedContentReview.reviewStatus).toEqual("readyToBePublished"); - expect(updatedContentReview.title).toEqual(updatedPage.title); - - /** - * Let's retract the provided sign-off for a "required step" of the publishing workflow. - */ - const [retractSignOffResponse] = await retractSignOffMutation({ - id: contentReview.id, - step: step2.id - }); - expect(retractSignOffResponse).toEqual({ - data: { - apw: { - retractSignOff: { - data: true, - error: null - } - } - } - }); - - /** - * After retracting sign-off to a step of the workflow, - * Now the content should be back in "underReview" stage. - */ - [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - expect(getContentReviewResponse.data.apw.getContentReview.data.reviewStatus).toEqual( - "underReview" - ); - - /** - * Let's again provide the sign-off for step 2. - */ - [provideSignOffResponse] = await provideSignOffMutation({ - id: contentReview.id, - step: step2.id - }); - - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - /** - * After providing sign-off to every step of the workflow, - * Should be able to publish the page. - */ - [publishContentResponse] = await publishContentMutation({ id: contentReview.id }); - expect(publishContentResponse).toEqual({ - data: { - apw: { - publishContent: { - data: true, - error: null - } - } - } - }); - - /** - * Let's confirm that the content is "published". - */ - const [getPageResponse] = await getPageQuery({ id: page.id }); - expect(getPageResponse).toEqual({ - data: { - pageBuilder: { - getPage: { - data: expect.any(Object), - error: null - } - } - } - }); - - expect(getPageResponse.data.pageBuilder.getPage.data.status).toEqual("published"); - expect(getPageResponse.data.pageBuilder.getPage.data.version).toEqual(1); - - /** - * Fetch the content review and check if the status has been updated successful. - */ - [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - - expect(getContentReviewResponse.data.apw.getContentReview.data.reviewStatus).toEqual( - "published" - ); - }); - - test(`Should able to "unpublish" page for content review process`, async () => { - const { page } = await setup(); - - /** - * Initial a review. - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - /* - * Check content status, it should be "under review". - */ - expect(createdContentReview.reviewStatus).toEqual("underReview"); - expect(createdContentReview.title).toEqual(page.title); - - /* - * We should be able to make updates to the page. - */ - const [updatePageResponse] = await updatePage({ - id: page.id, - data: { - title: "About us" - } - }); - const updatedPage = updatePageResponse.data.pageBuilder.updatePage.data; - /** - * Fetch the content review and check if the updates were successful. - */ - let [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - const contentReview = getContentReviewResponse.data.apw.getContentReview.data; - expect(contentReview.reviewStatus).toEqual("underReview"); - expect(contentReview.title).toEqual(updatedPage.title); - - /** - * Should not let us publish a page. - */ - let [publishContentResponse] = await publishContentMutation({ id: contentReview.id }); - expect(publishContentResponse).toEqual({ - data: { - apw: { - publishContent: { - data: null, - error: { - code: "NOT_READY_TO_BE_PUBLISHED", - message: expect.any(String), - data: expect.any(Object) - } - } - } - } - }); - - /** - * Should be able to create a new revision, even though the content is "underReview". - */ - const [createPageFromResponse] = await createPage({ - from: page.id, - category: page.category.slug - }); - expect(createPageFromResponse).toEqual({ - data: { - pageBuilder: { - createPage: { - data: expect.any(Object), - error: null - } - } - } - }); - - const pageRevision2 = createPageFromResponse.data.pageBuilder.createPage.data; - /** - * Should still have the workflow assigned. - * But, should not have "contentReviewId". - */ - expect(pageRevision2.settings.apw).toEqual({ - workflowId: page.settings.apw.workflowId, - contentReviewId: null - }); - - /** - * Let's provide sign-off to every step of the publishing workflow. - */ - const [step1, step2, step3] = contentReview.steps; - - let [provideSignOffResponse] = await provideSignOffMutation({ - id: contentReview.id, - step: step1.id - }); - - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - [provideSignOffResponse] = await provideSignOffMutation({ - id: contentReview.id, - step: step2.id - }); - - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - [provideSignOffResponse] = await provideSignOffMutation({ - id: contentReview.id, - step: step3.id - }); - - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - /** - * After providing sign-off to every step of the workflow, - * Now the content should be in "readyToBePublished" stage. - */ - [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - const updatedContentReview = getContentReviewResponse.data.apw.getContentReview.data; - expect(updatedContentReview.reviewStatus).toEqual("readyToBePublished"); - expect(updatedContentReview.title).toEqual(updatedPage.title); - - /** - * Let's retract the provided sign-off for a "required step" of the publishing workflow. - */ - const [retractSignOffResponse] = await retractSignOffMutation({ - id: contentReview.id, - step: step2.id - }); - expect(retractSignOffResponse).toEqual({ - data: { - apw: { - retractSignOff: { - data: true, - error: null - } - } - } - }); - - /** - * After retracting sign-off to a step of the workflow, - * Now the content should be back in "underReview" stage. - */ - [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - expect(getContentReviewResponse.data.apw.getContentReview.data.reviewStatus).toEqual( - "underReview" - ); - - /** - * Let's again provide the sign-off for step 2. - */ - [provideSignOffResponse] = await provideSignOffMutation({ - id: contentReview.id, - step: step2.id - }); - - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - /** - * After providing sign-off to every step of the workflow, - * Should be able to publish the page. - */ - [publishContentResponse] = await publishContentMutation({ id: contentReview.id }); - expect(publishContentResponse).toEqual({ - data: { - apw: { - publishContent: { - data: true, - error: null - } - } - } - }); - - /** - * Let's confirm that the content is "published". - */ - let [getPageResponse] = await getPageQuery({ id: page.id }); - expect(getPageResponse).toEqual({ - data: { - pageBuilder: { - getPage: { - data: expect.any(Object), - error: null - } - } - } - }); - - expect(getPageResponse.data.pageBuilder.getPage.data.status).toEqual("published"); - expect(getPageResponse.data.pageBuilder.getPage.data.version).toEqual(1); - - /** - * Fetch the content review and check if the status has been updated successful. - */ - [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - - expect(getContentReviewResponse.data.apw.getContentReview.data.reviewStatus).toEqual( - "published" - ); - - /** - * Let's "unpublish" the content. - */ - const [unPublishContentResponse] = await unpublishContentMutation({ id: contentReview.id }); - expect(unPublishContentResponse).toEqual({ - data: { - apw: { - unpublishContent: { - data: true, - error: null - } - } - } - }); - - /** - * Let's confirm that the content is "unpublished". - */ - [getPageResponse] = await getPageQuery({ id: page.id }); - expect(getPageResponse).toEqual({ - data: { - pageBuilder: { - getPage: { - data: expect.any(Object), - error: null - } - } - } - }); - expect(getPageResponse.data.pageBuilder.getPage.data.status).toEqual("unpublished"); - expect(getPageResponse.data.pageBuilder.getPage.data.version).toEqual(1); - - /** - * Fetch the content review and check if the status has been updated successful. - */ - [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - - expect(getContentReviewResponse.data.apw.getContentReview.data.reviewStatus).toEqual( - "readyToBePublished" - ); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/pendingChangeRequestsCount.test.ts b/packages/api-apw/__tests__/graphql/pendingChangeRequestsCount.test.ts deleted file mode 100644 index cd2f70f0a3f..00000000000 --- a/packages/api-apw/__tests__/graphql/pendingChangeRequestsCount.test.ts +++ /dev/null @@ -1,570 +0,0 @@ -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; -import { mocks as changeRequestMock } from "./mocks/changeRequest"; -import { createSetupForPageContentReview } from "../utils/helpers"; -import { ApwContentReview, PageWithWorkflow } from "~/types"; - -describe(`Pending change requests count test`, () => { - const gqlHandler = useGraphQlHandler({ - path: "/graphql" - }); - const { - createChangeRequestMutation, - createContentReviewMutation, - getContentReviewQuery, - listContentReviewsQuery, - updateChangeRequestMutation, - listChangeRequestsQuery, - deleteChangeRequestMutation, - until - } = gqlHandler; - - const createContentReview = async (page: PageWithWorkflow) => { - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - return createContentReviewResponse.data.apw.createContentReview.data; - }; - - const expectedContent = { - id: expect.any(String), - type: expect.any(String), - version: expect.any(Number), - settings: null, - publishedBy: null, - publishedOn: null, - scheduledBy: null, - scheduledOn: null - }; - - test(`should able to update "pendingChangeRequests" count in a content review`, async () => { - const { page } = await createSetupForPageContentReview(gqlHandler); - const contentReview = await createContentReview(page); - const [step1, step2] = contentReview.steps; - - await until( - () => listContentReviewsQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listContentReviews.data; - return list.length === 1; - }, - { - name: `Wait for "ContentReview" entry to be available in list query` - } - ); - - /* - * Create a new change request entry for step 1. - */ - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ - step: `${contentReview.id}#${step1.id}` - }) - }); - const changeRequested = createChangeRequestResponse.data.apw.createChangeRequest.data; - - await until( - () => listChangeRequestsQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listChangeRequests.data; - return list.length === 1; - }, - { - name: `Wait for "ChangeRequest" entry to be available in list query` - } - ); - - await until( - () => listContentReviewsQuery({}).then(([data]) => data), - (response: any) => { - const [entry] = response.data.apw.listContentReviews.data; - return ( - entry.steps.find((step: any) => step.id === step1.id)?.pendingChangeRequests === - 1 - ); - }, - { - name: "Wait for updated entry to be available in list query" - } - ); - - /** - * Should have 1 pending change requests for step 1 and 0 pending change requests for step 2. - */ - let [getContentReviewResponse] = await getContentReviewQuery({ id: contentReview.id }); - expect(getContentReviewResponse).toEqual({ - data: { - apw: { - getContentReview: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - reviewStatus: "underReview", - title: expect.any(String), - content: expect.objectContaining(expectedContent), - steps: [ - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 1, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - } - ] - }, - error: null - } - } - } - }); - - /** - * Add couple of change request to a step 2 in the content review. - */ - const changeRequests = []; - for (let i = 0; i < 2; i++) { - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ - step: `${contentReview.id}#${step2.id}`, - title: "Please make change in heading-" + i - }) - }); - - changeRequests.push(createChangeRequestResponse.data.apw.createChangeRequest.data); - - await until( - () => listContentReviewsQuery({}).then(([data]) => data), - (response: any) => { - const [entry] = response.data.apw.listContentReviews.data as ApwContentReview[]; - return ( - entry.steps.find(step => step.id === step1.id)?.pendingChangeRequests === - 1 && - entry.steps.find(step => step.id === step2.id)?.pendingChangeRequests === - i + 1 - ); - }, - { - name: "Wait for updated entry to be available in list query" - } - ); - } - - /** - * Should have 1 pending change requests for step 1 and 2 pending change requests for step 2. - */ - [getContentReviewResponse] = await getContentReviewQuery({ id: contentReview.id }); - expect(getContentReviewResponse).toEqual({ - data: { - apw: { - getContentReview: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - reviewStatus: "underReview", - title: expect.any(String), - content: expect.objectContaining(expectedContent), - steps: [ - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 1, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 2, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - } - ] - }, - error: null - } - } - } - }); - - /** - * Mark change request 1 as resolved. - */ - await updateChangeRequestMutation({ - id: changeRequested.id, - data: { - resolved: true - } - }); - - /** - * Should have 0 pending change requests for step 1 and 2 pending change requests for step 2. - */ - [getContentReviewResponse] = await getContentReviewQuery({ id: contentReview.id }); - expect(getContentReviewResponse).toEqual({ - data: { - apw: { - getContentReview: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - reviewStatus: "underReview", - title: expect.any(String), - content: expect.objectContaining(expectedContent), - steps: [ - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 2, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - } - ] - }, - error: null - } - } - } - }); - - /** - * Mark already resolved change request as resolved. - */ - await updateChangeRequestMutation({ - id: changeRequested.id, - data: { - resolved: true - } - }); - - /** - * Should have 0 pending change requests for step 1 and 2 pending change requests for step 2. - */ - [getContentReviewResponse] = await getContentReviewQuery({ id: contentReview.id }); - expect(getContentReviewResponse).toEqual({ - data: { - apw: { - getContentReview: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - reviewStatus: "underReview", - title: expect.any(String), - content: expect.objectContaining(expectedContent), - steps: [ - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 2, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - } - ] - }, - error: null - } - } - } - }); - - /** - * Unmark already resolved change request. - */ - await updateChangeRequestMutation({ - id: changeRequested.id, - data: { - resolved: false - } - }); - - /** - * Should have 1 pending change requests for step 1 and 2 pending change requests for step 2. - */ - [getContentReviewResponse] = await getContentReviewQuery({ id: contentReview.id }); - expect(getContentReviewResponse).toEqual({ - data: { - apw: { - getContentReview: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - reviewStatus: "underReview", - title: expect.any(String), - content: expect.objectContaining(expectedContent), - steps: [ - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 1, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 2, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - } - ] - }, - error: null - } - } - } - }); - const [changeRequest1, changeRequest2] = changeRequests; - /** - * Mark both change requests for step 2 as resolved. - */ - await updateChangeRequestMutation({ - id: changeRequest1.id, - data: { - resolved: true - } - }); - - await updateChangeRequestMutation({ - id: changeRequest2.id, - data: { - resolved: true - } - }); - - /** - * Should have 1 pending change requests for step 1 and 2 pending change requests for step 2. - */ - [getContentReviewResponse] = await getContentReviewQuery({ id: contentReview.id }); - expect(getContentReviewResponse).toEqual({ - data: { - apw: { - getContentReview: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - reviewStatus: "underReview", - title: expect.any(String), - content: expect.objectContaining(expectedContent), - steps: [ - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 1, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - } - ] - }, - error: null - } - } - } - }); - - /** - * Let's delete all these change requests. - */ - let [deleteChangeRequestResponse] = await deleteChangeRequestMutation({ - id: changeRequest1.id - }); - expect(deleteChangeRequestResponse).toEqual({ - data: { - apw: { - deleteChangeRequest: { - data: true, - error: null - } - } - } - }); - - [deleteChangeRequestResponse] = await deleteChangeRequestMutation({ - id: changeRequest2.id - }); - expect(deleteChangeRequestResponse).toEqual({ - data: { - apw: { - deleteChangeRequest: { - data: true, - error: null - } - } - } - }); - - [deleteChangeRequestResponse] = await deleteChangeRequestMutation({ - id: changeRequested.id - }); - expect(deleteChangeRequestResponse).toEqual({ - data: { - apw: { - deleteChangeRequest: { - data: true, - error: null - } - } - } - }); - - /** - * Deleting marked "change requests" should not effect "pendingChangeRequests" count. - * - * Should have 0 pending change requests for step 1 and 0 pending change requests for step 2. - */ - [getContentReviewResponse] = await getContentReviewQuery({ id: contentReview.id }); - expect(getContentReviewResponse).toEqual({ - data: { - apw: { - getContentReview: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - reviewStatus: "underReview", - title: expect.any(String), - content: expect.objectContaining(expectedContent), - steps: [ - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - } - ] - }, - error: null - } - } - } - }); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/provideSignOff.test.ts b/packages/api-apw/__tests__/graphql/provideSignOff.test.ts deleted file mode 100644 index 63c96b34e5e..00000000000 --- a/packages/api-apw/__tests__/graphql/provideSignOff.test.ts +++ /dev/null @@ -1,458 +0,0 @@ -import { ApwContentReviewStepStatus } from "~/types"; -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; -import { createSetupForPageContentReview } from "../utils/helpers"; -import { mocks as changeRequestMock } from "./mocks/changeRequest"; - -describe("Provide sign off for a step in content review process", function () { - const gqlHandler = useGraphQlHandler({ - path: "/graphql" - }); - const { - getContentReviewQuery, - createContentReviewMutation, - provideSignOffMutation, - createChangeRequestMutation, - until - } = gqlHandler; - - const setup = async () => { - return createSetupForPageContentReview(gqlHandler); - }; - - const expectedContent = { - id: expect.any(String), - type: expect.any(String), - version: expect.any(Number), - settings: null, - publishedBy: null, - publishedOn: null, - scheduledBy: null, - scheduledOn: null - }; - - test(`should able to provide sign-off`, async () => { - const { page } = await setup(); - /* - Create a content review entry. - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - const [step1, , step3] = createdContentReview.steps; - let previousSavedOn = createdContentReview.savedOn; - - await until( - () => getContentReviewQuery({ id: createdContentReview.id }).then(([data]) => data), - (response: any) => response.data.apw.getContentReview.data !== null, - { - name: "Wait for entry to be available in get query" - } - ); - - /** - * Should return error while providing sign-off for "inactive" step. - */ - let [provideSignOffResponse] = await provideSignOffMutation({ - id: createdContentReview.id, - step: step3.id - }); - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: null, - error: { - code: "STEP_NOT_ACTIVE", - message: expect.any(String), - data: expect.any(Object) - } - } - } - } - }); - - /** - * Should able to providing sign-off for "active" step. - */ - [provideSignOffResponse] = await provideSignOffMutation({ - id: createdContentReview.id, - step: step1.id - }); - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - await until( - () => getContentReviewQuery({ id: createdContentReview.id }).then(([data]) => data), - (response: any) => { - const entry = response.data.apw.getContentReview.data; - - const hasChanged = entry && entry.savedOn !== previousSavedOn; - if (hasChanged) { - previousSavedOn = entry.savedOn; - return true; - } - return false; - }, - { - name: "Wait for updated entry to be available in get query" - } - ); - - /** - * Now that we've provided sign-off for step1, step2 should have status "active" because step1 is done - * and step3 should also have status "active" because step2 is not of type "mandatory_blocking". - */ - const [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - expect(getContentReviewResponse).toEqual({ - data: { - apw: { - getContentReview: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - reviewStatus: "underReview", - title: expect.any(String), - content: expect.objectContaining(expectedContent), - steps: [ - { - status: ApwContentReviewStepStatus.DONE, - id: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: expect.stringMatching(/^20/), - signOffProvidedBy: { - id: "12345678", - displayName: "John Doe" - } - }, - { - status: ApwContentReviewStepStatus.ACTIVE, - id: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - status: ApwContentReviewStepStatus.ACTIVE, - id: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - } - ] - }, - error: null - } - } - } - }); - }); - - test(`should throw error when trying to provide sign off by a non-reviewer`, async () => { - const gqlHandlerForIdentityA = useGraphQlHandler({ - path: "/graphql", - identity: { - id: "123456789", - type: "admin", - displayName: "Ryan" - } - }); - - const { page } = await setup(); - await gqlHandlerForIdentityA.securityIdentity.login(); - - /* - Create a content review entry. - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - const [step1] = createdContentReview.steps; - - await until( - () => - gqlHandlerForIdentityA - .getContentReviewQuery({ id: createdContentReview.id }) - .then(([data]) => data), - (response: any) => response.data.apw.getContentReview.data !== null, - { - name: "Wait for entry to be available in get query" - } - ); - - /** - * Should return error while providing sign-off for a step by a non-reviewer. - */ - const [provideSignOffResponse] = await gqlHandlerForIdentityA.provideSignOffMutation({ - id: createdContentReview.id, - step: step1.id - }); - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: null, - error: { - code: "NOT_AUTHORISED", - message: expect.any(String), - data: expect.any(Object) - } - } - } - } - }); - }); - - test(`should throw error when trying to provide sign off without completing previous steps`, async () => { - const { page } = await setup(); - - /* - Create a content review entry. - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - const [step1, step2, step3] = createdContentReview.steps; - - await until( - () => getContentReviewQuery({ id: createdContentReview.id }).then(([data]) => data), - (response: any) => response.data.apw.getContentReview.data !== null, - { - name: "Wait for entry to be available in get query" - } - ); - let previousSavedOn = createdContentReview.savedOn; - - /** - * Should return error while providing sign off without completing "mandatory_blocking" step. - */ - let [provideSignOffResponse] = await provideSignOffMutation({ - id: createdContentReview.id, - step: step2.id - }); - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: null, - error: { - code: "MISSING_STEP", - message: expect.any(String), - data: expect.any(Object) - } - } - } - } - }); - /** - * Let's providing sign off for "mandatory_blocking" step. - */ - [provideSignOffResponse] = await provideSignOffMutation({ - id: createdContentReview.id, - step: step1.id - }); - - await until( - () => getContentReviewQuery({ id: createdContentReview.id }).then(([data]) => data), - (response: any) => { - const entry = response.data.apw.getContentReview.data; - const hasChanged = entry && entry.savedOn !== previousSavedOn; - if (hasChanged) { - previousSavedOn = entry.savedOn; - return true; - } - return false; - }, - { - name: "Wait for updated entry to be available in get query" - } - ); - - /** - * Should able to providing sign off even if previous step is not done; - * given it is of "mandatory_non_blocking" type. - */ - - [provideSignOffResponse] = await provideSignOffMutation({ - id: createdContentReview.id, - step: step3.id - }); - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - /** - * Should able to providing sign off after completing "mandatory_blocking" step. - */ - [provideSignOffResponse] = await provideSignOffMutation({ - id: createdContentReview.id, - step: step2.id - }); - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - }); - - test(`should throw error when trying to create new "Change Request" once sign off has been provided`, async () => { - const { page } = await setup(); - - /* - Create a content review entry. - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - const [step1, step2, step3] = createdContentReview.steps; - - await until( - () => getContentReviewQuery({ id: createdContentReview.id }).then(([data]) => data), - (response: any) => response.data.apw.getContentReview.data !== null, - { - name: "Wait for entry to be available in get query" - } - ); - let previousSavedOn = createdContentReview.savedOn; - - /** - * Let's providing sign off for "mandatory_blocking" step. - */ - let [provideSignOffResponse] = await provideSignOffMutation({ - id: createdContentReview.id, - step: step1.id - }); - - await until( - () => getContentReviewQuery({ id: createdContentReview.id }).then(([data]) => data), - (response: any) => { - const entry = response.data.apw.getContentReview.data; - const hasChanged = entry && entry.savedOn !== previousSavedOn; - if (hasChanged) { - previousSavedOn = entry.savedOn; - return true; - } - return false; - }, - { - name: "Wait for updated entry to be available in get query" - } - ); - - /** - * Should able to providing sign off even if previous step is not done; - * given it is of "mandatory_non_blocking" type. - */ - - [provideSignOffResponse] = await provideSignOffMutation({ - id: createdContentReview.id, - step: step3.id - }); - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - /** - * Should able to providing sign off after completing "mandatory_blocking" step. - */ - [provideSignOffResponse] = await provideSignOffMutation({ - id: createdContentReview.id, - step: step2.id - }); - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - /** - * Should return error when creating a new change request after sign-off has been provided. - */ - - const changeRequestStep = `${createdContentReview.id}#${createdContentReview.steps[0].id}`; - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ step: changeRequestStep }) - }); - expect(createChangeRequestResponse).toEqual({ - data: { - apw: { - createChangeRequest: { - data: null, - error: { - code: "SIGN_OFF_PROVIDED", - message: expect.any(String), - data: expect.any(Object) - } - } - } - } - }); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/retractSignOff.test.ts b/packages/api-apw/__tests__/graphql/retractSignOff.test.ts deleted file mode 100644 index 946c7b80c80..00000000000 --- a/packages/api-apw/__tests__/graphql/retractSignOff.test.ts +++ /dev/null @@ -1,323 +0,0 @@ -import { ApwContentReviewStepStatus } from "~/types"; -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; -import { createSetupForPageContentReview } from "../utils/helpers"; - -describe("Retract sign off for a step in content review process", function () { - const gqlHandler = useGraphQlHandler({ - path: "/graphql" - }); - const { - getContentReviewQuery, - createContentReviewMutation, - provideSignOffMutation, - retractSignOffMutation, - until - } = gqlHandler; - - const setup = async () => { - return createSetupForPageContentReview(gqlHandler); - }; - - const expectedContent = { - id: expect.any(String), - type: expect.any(String), - version: expect.any(Number), - settings: null, - publishedBy: null, - publishedOn: null, - scheduledBy: null, - scheduledOn: null - }; - - test(`should able to retract sign-off`, async () => { - const { page } = await setup(); - /* - Create a content review entry. - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - const [step1] = createdContentReview.steps; - - let previousSavedOn = createdContentReview.savedOn; - - await until( - () => getContentReviewQuery({ id: createdContentReview.id }).then(([data]) => data), - (response: any) => response.data.apw.getContentReview.data !== null, - { - name: "Wait for entry to be available in get query" - } - ); - - /** - * Should return error when retracting sign-off of a step for which sign-off wasn't provided. - */ - let [retractSignOffResponse] = await retractSignOffMutation({ - id: createdContentReview.id, - step: step1.id - }); - expect(retractSignOffResponse).toEqual({ - data: { - apw: { - retractSignOff: { - data: null, - error: { - code: "NO_SIGN_OFF_PROVIDED", - message: expect.any(String), - data: expect.any(Object) - } - } - } - } - }); - - /** - * Should able to providing sign-off for "active" step. - */ - const [provideSignOffResponse] = await provideSignOffMutation({ - id: createdContentReview.id, - step: step1.id - }); - expect(provideSignOffResponse).toEqual({ - data: { - apw: { - provideSignOff: { - data: true, - error: null - } - } - } - }); - - await until( - () => getContentReviewQuery({ id: createdContentReview.id }).then(([data]) => data), - (response: any) => { - const entry = response.data.apw.getContentReview.data; - - const hasChanged = entry && entry.savedOn !== previousSavedOn; - if (hasChanged) { - previousSavedOn = entry.savedOn; - return true; - } - return false; - }, - { - name: "Wait for updated entry to be available in get query" - } - ); - - /** - * Now that we've provided sign-off for step1, step2 should have status "active" because step1 is done - * and step3 should also have status "active" because step2 is not of type "mandatory_blocking". - */ - const [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - expect(getContentReviewResponse).toEqual({ - data: { - apw: { - getContentReview: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - reviewStatus: "underReview", - title: expect.any(String), - content: expect.objectContaining(expectedContent), - steps: [ - { - status: ApwContentReviewStepStatus.DONE, - id: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: expect.stringMatching(/^20/), - signOffProvidedBy: { - id: "12345678", - displayName: "John Doe" - } - }, - { - status: ApwContentReviewStepStatus.ACTIVE, - id: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - status: ApwContentReviewStepStatus.ACTIVE, - id: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - } - ] - }, - error: null - } - } - } - }); - - /** - * Let's retract the previously provided sign-off. - */ - [retractSignOffResponse] = await retractSignOffMutation({ - id: createdContentReview.id, - step: step1.id - }); - expect(retractSignOffResponse).toEqual({ - data: { - apw: { - retractSignOff: { - data: true, - error: null - } - } - } - }); - - await until( - () => getContentReviewQuery({ id: createdContentReview.id }).then(([data]) => data), - (response: any) => { - const entry = response.data.apw.getContentReview.data; - - const hasChanged = entry && entry.savedOn !== previousSavedOn; - if (hasChanged) { - previousSavedOn = entry.savedOn; - return true; - } - return false; - }, - { - name: "Wait for updated entry to be available in get query" - } - ); - - /** - * Now that we've retracted sign-off for step1, step2 should have status "inactive". - */ - const [getContentReviewResponseAgain] = await getContentReviewQuery({ - id: createdContentReview.id - }); - expect(getContentReviewResponseAgain).toEqual({ - data: { - apw: { - getContentReview: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - reviewStatus: "underReview", - title: expect.any(String), - content: expect.objectContaining(expectedContent), - steps: [ - { - status: ApwContentReviewStepStatus.ACTIVE, - id: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - status: ApwContentReviewStepStatus.INACTIVE, - id: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - }, - { - status: ApwContentReviewStepStatus.INACTIVE, - id: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - } - ] - }, - error: null - } - } - } - }); - }); - - test(`should throw error when trying to retract sign off by a non-reviewer`, async () => { - const gqlHandlerForIdentityA = useGraphQlHandler({ - path: "/graphql", - identity: { - id: "123456789", - type: "admin", - displayName: "Ryan" - } - }); - - const { page } = await setup(); - await gqlHandlerForIdentityA.securityIdentity.login(); - - /* - Create a content review entry. - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - const [step1] = createdContentReview.steps; - - await until( - () => getContentReviewQuery({ id: createdContentReview.id }).then(([data]) => data), - (response: any) => response.data.apw.getContentReview.data !== null, - { - name: "Wait for entry to be available in get query" - } - ); - - await provideSignOffMutation({ - id: createdContentReview.id, - step: step1.id - }); - - /** - * Should return error while retracting sign-off for a step by a non-reviewer. - */ - const [retractSignOffResponse] = await gqlHandlerForIdentityA.retractSignOffMutation({ - id: createdContentReview.id, - step: step1.id - }); - expect(retractSignOffResponse).toEqual({ - data: { - apw: { - retractSignOff: { - data: null, - error: { - code: "NOT_AUTHORISED", - message: expect.any(String), - data: expect.any(Object) - } - } - } - } - }); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/reviewer.crud.test.ts b/packages/api-apw/__tests__/graphql/reviewer.crud.test.ts deleted file mode 100644 index de1883c1ab5..00000000000 --- a/packages/api-apw/__tests__/graphql/reviewer.crud.test.ts +++ /dev/null @@ -1,488 +0,0 @@ -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; -import { defaultIdentity } from "../utils/defaultIdentity"; - -const identityRoot = { - id: "root", - displayName: "root", - type: "admin", - email: "root@webiny.com" -}; -const updatedDisplayName = "Robert Downey"; - -describe("Reviewer crud test", () => { - const { securityIdentity, reviewer, until } = useGraphQlHandler({ - path: "/graphql", - plugins: [defaultIdentity()] - }); - - const { securityIdentity: securityIdentityRoot } = useGraphQlHandler({ - path: "/graphql", - plugins: [defaultIdentity()], - identity: identityRoot - }); - - const { securityIdentity: securityIdentityRootUpdated } = useGraphQlHandler({ - path: "/graphql", - plugins: [defaultIdentity()], - identity: { - ...identityRoot, - displayName: updatedDisplayName - } - }); - - it("should be able to hook on to after login", async () => { - const [response] = await securityIdentity.login(); - expect(response).toMatchObject({ - data: { - security: { - login: { - data: { - id: "12345678" - }, - error: null - } - } - } - }); - - await until( - () => reviewer.listReviewersQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listReviewers.data; - return list.length === 1; - }, - { - name: "Wait for listReviewers query" - } - ); - - /** - * Should created a reviewer entry after login. - */ - const [listReviewersResponse] = await reviewer.listReviewersQuery({}); - expect(listReviewersResponse).toEqual({ - data: { - apw: { - listReviewers: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - identityId: "12345678", - displayName: "John Doe", - type: "admin", - email: "testing@webiny.com" - } - ], - error: null, - meta: { - hasMoreItems: false, - cursor: null, - totalCount: 1 - } - } - } - } - }); - /* - * Login with another identity. - */ - await securityIdentityRoot.login(); - - await until( - () => reviewer.listReviewersQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listReviewers.data; - return list.length === 2; - }, - { - name: "Wait for listReviewers query" - } - ); - - /** - * Should now have 2 reviewers. - */ - const [listReviewersAgainResponse] = await reviewer.listReviewersQuery({}); - expect(listReviewersAgainResponse).toEqual({ - data: { - apw: { - listReviewers: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: identityRoot.id, - displayName: identityRoot.displayName, - type: identityRoot.type - }, - identityId: identityRoot.id, - displayName: identityRoot.displayName, - type: "admin", - email: identityRoot.email - }, - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - identityId: "12345678", - displayName: "John Doe", - type: "admin", - email: "testing@webiny.com" - } - ], - error: null, - meta: { - hasMoreItems: false, - cursor: null, - totalCount: 2 - } - } - } - } - }); - }); - - it("should not create more than one entry due to multiple login", async () => { - const [response] = await securityIdentity.login(); - expect(response).toMatchObject({ - data: { - security: { - login: { - data: { - id: "12345678" - }, - error: null - } - } - } - }); - - await until( - () => reviewer.listReviewersQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listReviewers.data; - return list.length === 1; - }, - { - name: "Wait for listReviewers query" - } - ); - - /** - * Should created a reviewer entry after login. - */ - const [listReviewersResponse] = await reviewer.listReviewersQuery({}); - expect(listReviewersResponse).toEqual({ - data: { - apw: { - listReviewers: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - identityId: "12345678", - displayName: "John Doe", - type: "admin", - email: "testing@webiny.com" - } - ], - error: null, - meta: { - hasMoreItems: false, - cursor: null, - totalCount: 1 - } - } - } - } - }); - /* - * Login again with same identity. - */ - await securityIdentity.login(); - - await until( - () => reviewer.listReviewersQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listReviewers.data; - return list.length === 1; - }, - { - name: "Wait for listReviewers query" - } - ); - - /* - * Should not have 2 reviewers. - */ - const [listReviewersAgainResponse] = await reviewer.listReviewersQuery({}); - expect(listReviewersAgainResponse).toEqual({ - data: { - apw: { - listReviewers: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - identityId: "12345678", - displayName: "John Doe", - type: "admin", - email: "testing@webiny.com" - } - ], - error: null, - meta: { - hasMoreItems: false, - cursor: null, - totalCount: 1 - } - } - } - } - }); - }); - - it(`should update "displayName" after login if identity has been updated`, async () => { - const [response] = await securityIdentityRoot.login(); - expect(response).toMatchObject({ - data: { - security: { - login: { - data: { - id: "root" - }, - error: null - } - } - } - }); - - await until( - () => reviewer.listReviewersQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listReviewers.data; - return list.length === 1; - }, - { - name: "Wait for listReviewers query" - } - ); - - /** - * Should created a reviewer entry after login. - */ - const [listReviewersResponse] = await reviewer.listReviewersQuery({}); - expect(listReviewersResponse).toEqual({ - data: { - apw: { - listReviewers: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "root", - displayName: "root", - type: "admin" - }, - identityId: "root", - displayName: "root", - type: "admin", - email: identityRoot.email - } - ], - error: null, - meta: { - hasMoreItems: false, - cursor: null, - totalCount: 1 - } - } - } - } - }); - /* - * Login again with same identity. - */ - await securityIdentityRootUpdated.login(); - - await until( - () => reviewer.listReviewersQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listReviewers.data; - return list.length === 1; - }, - { - name: "Wait for listReviewers query" - } - ); - - /* - * Should not have 2 reviewers. - */ - const [listReviewersAgainResponse] = await reviewer.listReviewersQuery({}); - expect(listReviewersAgainResponse).toEqual({ - data: { - apw: { - listReviewers: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "root", - displayName: "root", - type: "admin" - }, - identityId: "root", - displayName: updatedDisplayName, - type: "admin", - email: identityRoot.email - } - ], - error: null, - meta: { - hasMoreItems: false, - cursor: null, - totalCount: 1 - } - } - } - } - }); - }); - - it("should update reviewer when login info changes", async () => { - const { securityIdentity: baseSecurityIdentity, reviewer } = useGraphQlHandler({ - path: "/graphql", - identity: { - id: "mockUpdateIdentityId", - type: "admin", - displayName: "Base Identity" - } - }); - await securityIdentity.login(); - await baseSecurityIdentity.login(); - - await until( - () => reviewer.listReviewersQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listReviewers.data; - return list.length === 2; - }, - { - name: "Wait for listReviewers query" - } - ); - - const [response] = await reviewer.listReviewersQuery({}); - - expect(response).toMatchObject({ - data: { - apw: { - listReviewers: { - data: [ - { - identityId: "mockUpdateIdentityId" - }, - { - identityId: "12345678" - } - ], - error: null, - meta: { - totalCount: 2, - hasMoreItems: false, - cursor: null - } - } - } - } - }); - - const email = "mock@webiny.local"; - - const { securityIdentity: updatedSecurityIdentity, reviewer: updatedReviewer } = - useGraphQlHandler({ - path: "/graphql", - identity: { - id: "mockUpdateIdentityId", - type: "admin", - displayName: "Base Identity", - email - }, - permissions: [] - }); - - await updatedSecurityIdentity.login(); - - await until( - () => updatedReviewer.listReviewersQuery({}), - data => { - const response = data[0] as unknown as Record; - const list = response.data.apw.listReviewers.data; - if (list.length !== 2) { - return false; - } - return list.some((reviewer: any) => reviewer.email === email); - }, - { - name: "Wait for listReviewers query after updated login" - } - ); - - const [responseAfterUpdatedLogin] = await reviewer.listReviewersQuery({}); - - expect(responseAfterUpdatedLogin).toMatchObject({ - data: { - apw: { - listReviewers: { - data: [ - { - identityId: "mockUpdateIdentityId", - email - }, - { - identityId: "12345678" - } - ], - error: null, - meta: { - totalCount: 2, - hasMoreItems: false, - cursor: null - } - } - } - } - }); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/scheduleAction.test.ts b/packages/api-apw/__tests__/graphql/scheduleAction.test.ts deleted file mode 100644 index 79d351f6d6f..00000000000 --- a/packages/api-apw/__tests__/graphql/scheduleAction.test.ts +++ /dev/null @@ -1,263 +0,0 @@ -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; -import { createSetupForPageContentReview } from "../utils/helpers"; - -describe(`Schedule action in a content review process`, function () { - const gqlHandler = useGraphQlHandler({ - path: "/graphql" - }); - const { - getContentReviewQuery, - createContentReviewMutation, - provideSignOffMutation, - publishContentMutation, - deleteScheduledActionMutation, - until - } = gqlHandler; - - const setup = async () => { - return createSetupForPageContentReview(gqlHandler); - }; - - const preparePageForPublish = async () => { - const { page } = await setup(); - /* - Create a content review entry. - */ - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - const createdContentReview = createContentReviewResponse.data.apw.createContentReview.data; - - const [step1, step2, step3] = createdContentReview.steps; - - await until( - () => getContentReviewQuery({ id: createdContentReview.id }).then(([data]) => data), - (response: any) => response.data.apw.getContentReview.data !== null, - { - name: "Wait for entry to be available in get query" - } - ); - - /** - * Let's provide sign-off to every step of the publishing workflow. - */ - await provideSignOffMutation({ - id: createdContentReview.id, - step: step1.id - }); - - await provideSignOffMutation({ - id: createdContentReview.id, - step: step2.id - }); - - await provideSignOffMutation({ - id: createdContentReview.id, - step: step3.id - }); - - /** - * After providing sign-off to every step of the workflow, - * Now the content should be in "readyToBePublished" stage. - */ - const [getContentReviewResponse] = await getContentReviewQuery({ - id: createdContentReview.id - }); - const updatedContentReview = getContentReviewResponse.data.apw.getContentReview.data; - expect(updatedContentReview.reviewStatus).toEqual("readyToBePublished"); - - return createdContentReview; - }; - - test(`should return error when scheduling publish page for invalid datetime.`, async () => { - const contentReview = await preparePageForPublish(); - /** - * Should return error when scheduling publish page for invalid datetime. - */ - const [schedulePublishPageResponse] = await publishContentMutation({ - id: contentReview.id, - datetime: "" - }); - - expect(schedulePublishPageResponse).toEqual({ - data: { - apw: { - publishContent: { - data: null, - error: { - message: expect.any(String), - code: "INVALID_DATETIME_FORMAT", - data: expect.any(Object) - } - } - } - } - }); - }); - - test(`should return error when scheduling publish page for past datetime.`, async () => { - const contentReview = await preparePageForPublish(); - /** - * Should return error when scheduling publish page for past datetime. - */ - const [schedulePublishPageResponse] = await publishContentMutation({ - id: contentReview.id, - datetime: new Date("2022-01-01T00:00:00").toISOString() - }); - - expect(schedulePublishPageResponse).toEqual({ - data: { - apw: { - publishContent: { - data: null, - error: { - message: expect.any(String), - code: "PAST_DATETIME", - data: expect.any(Object) - } - } - } - } - }); - }); - - test(`should be able to schedule publish page action.`, async () => { - const contentReview = await preparePageForPublish(); - const datetime = new Date(Date.now() + 1000 * 60 * 30).toISOString(); - /** - * Should be able to schedule publish page action. - */ - const [schedulePublishPageResponse] = await publishContentMutation({ - id: contentReview.id, - datetime - }); - - expect(schedulePublishPageResponse).toEqual({ - data: { - apw: { - publishContent: { - data: true, - error: null - } - } - } - }); - - /** - * After scheduling publish page, now the content should have "contentScheduledOn". - */ - const [getContentReviewResponse] = await getContentReviewQuery({ - id: contentReview.id - }); - - expect(getContentReviewResponse.data.apw.getContentReview.data.content.scheduledOn).toEqual( - datetime - ); - expect(getContentReviewResponse.data.apw.getContentReview.data.content.scheduledBy).toEqual( - { - id: expect.any(String), - type: expect.any(String), - displayName: expect.any(String) - } - ); - }); - - test(`should be able to delete schedule publish page action.`, async () => { - const contentReview = await preparePageForPublish(); - const datetime = new Date(Date.now() + 1000 * 60 * 30).toISOString(); - - /** - * Should return error when trying to delete a scheduled action before creating one. - */ - let [deleteScheduledActionResponse] = await deleteScheduledActionMutation({ - id: contentReview.id - }); - expect(deleteScheduledActionResponse).toEqual({ - data: { - apw: { - deleteScheduledAction: { - data: null, - error: { - code: "NO_ACTION_SCHEDULED", - message: expect.any(String), - data: expect.any(Object) - } - } - } - } - }); - - /** - * Should be able to schedule publish page action. - */ - const [schedulePublishPageResponse] = await publishContentMutation({ - id: contentReview.id, - datetime - }); - - expect(schedulePublishPageResponse).toEqual({ - data: { - apw: { - publishContent: { - data: true, - error: null - } - } - } - }); - - /** - * After scheduling publish page, now the content should have "contentScheduledOn". - */ - let [getContentReviewResponse] = await getContentReviewQuery({ - id: contentReview.id - }); - - expect(getContentReviewResponse.data.apw.getContentReview.data.content.scheduledOn).toEqual( - datetime - ); - expect(getContentReviewResponse.data.apw.getContentReview.data.content.scheduledBy).toEqual( - { - id: expect.any(String), - type: expect.any(String), - displayName: expect.any(String) - } - ); - - /** - * Should able to delete a scheduled action after creating one. - */ - [deleteScheduledActionResponse] = await deleteScheduledActionMutation({ - id: contentReview.id - }); - expect(deleteScheduledActionResponse).toEqual({ - data: { - apw: { - deleteScheduledAction: { - data: true, - error: null - } - } - } - }); - - /** - * After deleting the scheduled publish page action, now the content should not have "contentScheduledOn". - */ - [getContentReviewResponse] = await getContentReviewQuery({ - id: contentReview.id - }); - - expect(getContentReviewResponse.data.apw.getContentReview.data.content.scheduledOn).toEqual( - null - ); - expect(getContentReviewResponse.data.apw.getContentReview.data.content.scheduledBy).toEqual( - null - ); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/totalCommentsCount.test.ts b/packages/api-apw/__tests__/graphql/totalCommentsCount.test.ts deleted file mode 100644 index b2370f7d9ca..00000000000 --- a/packages/api-apw/__tests__/graphql/totalCommentsCount.test.ts +++ /dev/null @@ -1,472 +0,0 @@ -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; -import { mocks as changeRequestMock, richTextMock } from "./mocks/changeRequest"; -import { createSetupForPageContentReview } from "../utils/helpers"; - -describe(`Total comments count test`, () => { - const gqlHandler = useGraphQlHandler({ - path: "/graphql" - }); - const { - createChangeRequestMutation, - createContentReviewMutation, - listContentReviewsQuery, - listChangeRequestsQuery, - createCommentMutation, - listCommentsQuery, - deleteCommentMutation, - deleteChangeRequestMutation, - until - } = gqlHandler; - - const createContentReview = async (page: any) => { - const [createContentReviewResponse] = await createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - return createContentReviewResponse.data.apw.createContentReview.data; - }; - const expectedSteps = expect.arrayContaining([ - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 1, - signOffProvidedOn: null, - signOffProvidedBy: null - } - ]); - - const expectedContent = { - id: expect.any(String), - type: expect.any(String), - version: expect.any(Number), - settings: null, - publishedBy: null, - publishedOn: null, - scheduledBy: null, - scheduledOn: null - }; - - test(`should able to update "totalComments" count in a content review`, async () => { - const { page } = await createSetupForPageContentReview(gqlHandler); - const contentReview = await createContentReview(page); - const [step1] = contentReview.steps; - - await until( - () => listContentReviewsQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listContentReviews.data; - return list.length === 1; - }, - { - name: `Wait for "ContentReview" entry to be available in list query` - } - ); - - /* - * Create a new change request entry for step 1. - */ - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ - step: `${contentReview.id}#${step1.id}` - }) - }); - const changeRequested = createChangeRequestResponse.data.apw.createChangeRequest.data; - - await until( - () => listChangeRequestsQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listChangeRequests.data; - return list.length === 1; - }, - { - name: `Wait for "ChangeRequest" entry to be available in list query` - } - ); - - await until( - () => listContentReviewsQuery({}).then(([data]) => data), - (response: any) => { - const [entry] = response.data.apw.listContentReviews.data; - return ( - entry.steps.find((step: any) => step.id === step1.id).pendingChangeRequests === - 1 - ); - }, - { - name: "Wait for updated entry to be available in list query" - } - ); - - /* - * Add two comments on to the change request. - */ - const createdComments = []; - for (let i = 0; i < 2; i++) { - const [createCommentResponse] = await createCommentMutation({ - data: { - body: richTextMock, - changeRequest: changeRequested.id - } - }); - - const comment = createCommentResponse.data.apw.createComment.data; - createdComments.push(comment); - } - - await until( - () => - listCommentsQuery({ changeRequest: { id: changeRequested.id } }).then( - ([data]) => data - ), - (response: any) => { - const list = response.data.apw.listComments.data; - return list.length === 2; - }, - { - name: `Wait for "Comments" entry to be available in list query` - } - ); - - await until( - () => listContentReviewsQuery({}).then(([data]) => data), - (response: any) => { - const [entry] = response.data.apw.listContentReviews.data; - return entry.totalComments === 2; - }, - { - name: `Wait for updated "totalComments" count to be available in list query` - } - ); - const [comment1, comment2] = createdComments; - /** - * Should have 2 as totalComments count. - */ - let [listContentReviewsResponse] = await listContentReviewsQuery({}); - expect(listContentReviewsResponse).toEqual({ - data: { - apw: { - listContentReviews: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - reviewStatus: "underReview", - title: expect.any(String), - content: expect.objectContaining(expectedContent), - steps: expectedSteps, - totalComments: 2, - activeStep: { - title: expect.any(String) - }, - latestCommentId: comment2.id, - reviewers: expect.arrayContaining([expect.any(String)]) - } - ], - meta: { - hasMoreItems: false, - cursor: null, - totalCount: 1 - }, - error: null - } - } - } - }); - - /** - * Let's delete the second comment. - */ - - const [deleteCommentResponse] = await deleteCommentMutation({ id: comment2.id }); - expect(deleteCommentResponse).toEqual({ - data: { - apw: { - deleteComment: { - data: true, - error: null - } - } - } - }); - - await until( - () => - listCommentsQuery({ changeRequest: { id: changeRequested.id } }).then( - ([data]) => data - ), - (response: any) => { - const list = response.data.apw.listComments.data; - return list.length === 1; - }, - { - name: `Wait for delete comment operation reflect in list query` - } - ); - - /** - * Should have 1 as totalComments count. - */ - [listContentReviewsResponse] = await listContentReviewsQuery({}); - expect(listContentReviewsResponse).toEqual({ - data: { - apw: { - listContentReviews: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - reviewStatus: "underReview", - title: expect.any(String), - content: expect.objectContaining(expectedContent), - steps: expectedSteps, - totalComments: 1, - activeStep: { - title: expect.any(String) - }, - latestCommentId: comment1.id, - reviewers: expect.arrayContaining([expect.any(String)]) - } - ], - meta: { - hasMoreItems: false, - cursor: null, - totalCount: 1 - }, - error: null - } - } - } - }); - }); - - test(`should able to update "totalComments" count in a content review after "change request" delete`, async () => { - const { page } = await createSetupForPageContentReview(gqlHandler); - const contentReview = await createContentReview(page); - const [step1] = contentReview.steps; - - await until( - () => listContentReviewsQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listContentReviews.data; - return list.length === 1; - }, - { - name: `Wait for "ContentReview" entry to be available in list query` - } - ); - - /* - * Create a new change request entry for step 1. - */ - const [createChangeRequestResponse] = await createChangeRequestMutation({ - data: changeRequestMock.createChangeRequestInput({ - step: `${contentReview.id}#${step1.id}` - }) - }); - const changeRequested = createChangeRequestResponse.data.apw.createChangeRequest.data; - - await until( - () => listChangeRequestsQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listChangeRequests.data; - return list.length === 1; - }, - { - name: `Wait for "ChangeRequest" entry to be available in list query` - } - ); - - await until( - () => listContentReviewsQuery({}).then(([data]) => data), - (response: any) => { - const [entry] = response.data.apw.listContentReviews.data; - return ( - entry.steps.find((step: any) => step.id === step1.id).pendingChangeRequests === - 1 - ); - }, - { - name: "Wait for updated entry to be available in list query" - } - ); - - /* - * Add two comments on to the change request. - */ - const createdComments = []; - for (let i = 0; i < 2; i++) { - const [createCommentResponse] = await createCommentMutation({ - data: { - body: richTextMock, - changeRequest: changeRequested.id - } - }); - - const comment = createCommentResponse.data.apw.createComment.data; - createdComments.push(comment); - } - - await until( - () => - listCommentsQuery({ changeRequest: { id: changeRequested.id } }).then( - ([data]) => data - ), - (response: any) => { - const list = response.data.apw.listComments.data; - return list.length === 2; - }, - { - name: `Wait for "Comments" entry to be available in list query` - } - ); - - await until( - () => listContentReviewsQuery({}).then(([data]) => data), - (response: any) => { - const [entry] = response.data.apw.listContentReviews.data; - return entry.totalComments === 2; - }, - { - name: `Wait for updated "totalComments" count to be available in list query` - } - ); - const [, comment2] = createdComments; - /** - * Should have 2 as totalComments count. - */ - let [listContentReviewsResponse] = await listContentReviewsQuery({}); - expect(listContentReviewsResponse).toEqual({ - data: { - apw: { - listContentReviews: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - reviewStatus: "underReview", - title: expect.any(String), - content: expect.objectContaining(expectedContent), - steps: expectedSteps, - totalComments: 2, - activeStep: { - title: expect.any(String) - }, - latestCommentId: comment2.id, - reviewers: expect.arrayContaining([expect.any(String)]) - } - ], - meta: { - hasMoreItems: false, - cursor: null, - totalCount: 1 - }, - error: null - } - } - } - }); - - /** - * Let's delete the change request itself which in-turn should delete all the associated comments. - */ - - const [deleteChangeRequestResponse] = await deleteChangeRequestMutation({ - id: changeRequested.id - }); - expect(deleteChangeRequestResponse).toEqual({ - data: { - apw: { - deleteChangeRequest: { - data: true, - error: null - } - } - } - }); - - await until( - () => - listCommentsQuery({ changeRequest: { id: changeRequested.id } }).then( - ([data]) => data - ), - (response: any) => { - const list = response.data.apw.listComments.data; - return list.length === 0; - }, - { - name: `Wait for delete comment operation reflect in list query` - } - ); - - /** - * Should have 0 as totalComments count. - */ - [listContentReviewsResponse] = await listContentReviewsQuery({}); - expect(listContentReviewsResponse).toEqual({ - data: { - apw: { - listContentReviews: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: expect.any(String), - displayName: expect.any(String), - type: "admin" - }, - reviewStatus: "underReview", - title: expect.any(String), - content: expect.objectContaining(expectedContent), - steps: expect.arrayContaining([ - { - id: expect.any(String), - status: expect.any(String), - pendingChangeRequests: 0, - signOffProvidedOn: null, - signOffProvidedBy: null - } - ]), - totalComments: 0, - activeStep: { - title: expect.any(String) - }, - latestCommentId: null, - reviewers: expect.arrayContaining([expect.any(String)]) - } - ], - meta: { - hasMoreItems: false, - cursor: null, - totalCount: 1 - }, - error: null - } - } - } - }); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/workflow.crud.test.ts b/packages/api-apw/__tests__/graphql/workflow.crud.test.ts deleted file mode 100644 index 0961a7e38ee..00000000000 --- a/packages/api-apw/__tests__/graphql/workflow.crud.test.ts +++ /dev/null @@ -1,551 +0,0 @@ -import { ApwWorkflowApplications, ApwWorkflowStepTypes } from "~/types"; -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; -import mocks from "./mocks/workflows"; - -describe("Workflow crud test", () => { - const { - getWorkflowQuery, - listWorkflowsQuery, - createWorkflowMutation, - updateWorkflowMutation, - deleteWorkflowMutation, - securityIdentity, - reviewer: reviewerGQL, - until - } = useGraphQlHandler({ - path: "/graphql" - }); - - const login = async () => { - await securityIdentity.login(); - }; - - const setupReviewer = async () => { - await login(); - - await until( - () => reviewerGQL.listReviewersQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listReviewers.data; - return list.length >= 1; - }, - { - name: "Wait for listReviewers" - } - ); - - const [listReviewersResponse] = await reviewerGQL.listReviewersQuery({}); - const [reviewer] = listReviewersResponse.data.apw.listReviewers.data; - return reviewer; - }; - - const expectedReviewers = expect.arrayContaining([expect.any(String)]); - - test("should able to create, update, get, list and delete a workflow", async () => { - const reviewer = await setupReviewer(); - /* - * Create a new workflow entry. - */ - const workflowData = mocks.createWorkflow( - { - app: ApwWorkflowApplications.PB - }, - [reviewer] - ); - const [createWorkflowResponse] = await createWorkflowMutation({ - data: workflowData - }); - - const workflow = createWorkflowResponse.data.apw.createWorkflow.data; - - expect(createWorkflowResponse).toEqual({ - data: { - apw: { - createWorkflow: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - app: expect.any(String), - title: expect.any(String), - steps: [ - { - title: expect.any(String), - id: expect.any(String), - type: expect.any(String), - reviewers: expectedReviewers - } - ], - scope: { - type: expect.any(String), - data: null - } - }, - error: null - } - } - } - }); - - await until( - () => getWorkflowQuery({ id: workflow.id }).then(([data]) => data), - (response: any) => response.data.apw.getWorkflow.data !== null, - { - name: "Wait for getWorkflow query" - } - ); - - /** - * Now that we have a workflow entry, we should be able to get it. - */ - const [getWorkflowByIdResponse] = await getWorkflowQuery({ id: workflow.id }); - expect(getWorkflowByIdResponse).toEqual({ - data: { - apw: { - getWorkflow: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - app: expect.any(String), - title: expect.any(String), - steps: [ - { - title: expect.any(String), - id: expect.any(String), - type: expect.any(String), - reviewers: expectedReviewers - } - ], - scope: { - type: expect.any(String), - data: null - } - }, - error: null - } - } - } - }); - /* - * Should return error in case of no entry found. - */ - const [getWorkflowResponse] = await getWorkflowQuery({ id: "123" }); - expect(getWorkflowResponse).toEqual({ - data: { - apw: { - getWorkflow: { - data: null, - error: { - code: "NOT_FOUND", - data: null, - message: expect.any(String) - } - } - } - } - }); - - /** - * Let's update the entry. - */ - const designReviewStep = mocks.createWorkflowStep({ - title: "Design review", - type: ApwWorkflowStepTypes.MANDATORY_BLOCKING, - reviewers: [ - { - id: reviewer.id - } - ] - }); - const [updateWorkflowResponse] = await updateWorkflowMutation({ - id: workflow.id, - data: { - steps: [...workflow.steps, designReviewStep] - } - }); - expect(updateWorkflowResponse).toEqual({ - data: { - apw: { - updateWorkflow: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - app: expect.any(String), - title: expect.any(String), - steps: [ - { - title: expect.any(String), - id: expect.any(String), - type: expect.any(String), - reviewers: expectedReviewers - }, - { - title: expect.any(String), - id: expect.any(String), - type: expect.any(String), - reviewers: expectedReviewers - } - ], - scope: { - type: expect.any(String), - data: null - } - }, - error: null - } - } - } - }); - - await until( - () => listWorkflowsQuery({}).then(([data]) => data), - (response: any) => { - const [updatedEntry] = response.data.apw.listWorkflows.data; - return updatedEntry && workflow.savedOn !== updatedEntry.savedOn; - }, - { - name: "Wait for listWorkflows query after update" - } - ); - - /** - * Let's list all workflow entries should return only one. - */ - const [listWorkflowsResponse] = await listWorkflowsQuery({}); - expect(listWorkflowsResponse).toEqual({ - data: { - apw: { - listWorkflows: { - data: [ - { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - app: workflow.app, - title: workflow.title, - steps: [...workflow.steps, designReviewStep], - scope: workflow.scope - } - ], - error: null, - meta: { - hasMoreItems: false, - totalCount: 1, - cursor: null - } - } - } - } - }); - - /** - * Delete the only workflow entry we have. - */ - const [deleteWorkflowResponse] = await deleteWorkflowMutation({ id: workflow.id }); - expect(deleteWorkflowResponse).toEqual({ - data: { - apw: { - deleteWorkflow: { - data: true, - error: null - } - } - } - }); - - await until( - () => listWorkflowsQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listWorkflows.data; - return list.length === 0; - }, - { - name: "Wait for listWorkflows query after delete" - } - ); - - /** - * Now that we've deleted the only entry we had, we should get empty list as response from "listWorkflows". - */ - const [listWorkflowsAgainResponse] = await listWorkflowsQuery({}); - expect(listWorkflowsAgainResponse).toEqual({ - data: { - apw: { - listWorkflows: { - data: [], - error: null, - meta: { - hasMoreItems: false, - totalCount: 0, - cursor: null - } - } - } - } - }); - }); - - test("should be able to list workflows", async () => { - await login(); - const reviewer = await setupReviewer(); - const workflows = []; - /* - * Create five workflows. - */ - for (let i = 0; i < 5; i++) { - const [createWorkflowResponse] = await createWorkflowMutation({ - data: mocks.createWorkflow( - { app: i % 2 === 0 ? ApwWorkflowApplications.PB : ApwWorkflowApplications.CMS }, - [reviewer] - ) - }); - - workflows.push(createWorkflowResponse.data.apw.createWorkflow.data); - } - - await until( - () => listWorkflowsQuery({}).then(([data]) => data), - (response: any) => { - const list = response.data.apw.listWorkflows.data; - return list.length === 5; - }, - { - name: "Wait for listWorkflows query" - } - ); - - /* - * Should list all five workflows. - */ - const [listWorkflowsResponse] = await listWorkflowsQuery({}); - expect(listWorkflowsResponse).toEqual({ - data: { - apw: { - listWorkflows: { - data: [...workflows.reverse()], - meta: { - hasMoreItems: false, - cursor: null, - totalCount: 5 - }, - error: null - } - } - } - }); - - /* - * Should only return workflows for "pageBuilder" app. - */ - const [listPBWorkflowsResponse] = await listWorkflowsQuery({ - where: { - app: ApwWorkflowApplications.PB - } - }); - expect(listPBWorkflowsResponse).toEqual({ - data: { - apw: { - listWorkflows: { - data: [workflows[0], workflows[2], workflows[4]], - meta: { - hasMoreItems: false, - cursor: null, - totalCount: 3 - }, - error: null - } - } - } - }); - }); - - /** - * With this test we make sure that the user without apw workflow permissions cannot access create, update and delete methods. - * List and get are always available. - */ - it("should not be possible to access create, update and delete workflow methods", async () => { - const noAccessHandler = useGraphQlHandler({ - path: "/graphql", - permissions: [] - }); - const reviewer = await setupReviewer(); - const workflowData = mocks.createWorkflow( - { - app: ApwWorkflowApplications.PB - }, - [reviewer] - ); - const [createWorkflowResponse] = await noAccessHandler.createWorkflowMutation({ - data: workflowData - }); - - expect(createWorkflowResponse).toEqual({ - data: { - apw: { - createWorkflow: { - data: null, - error: { - message: "Not authorized to access publishing workflows.", - code: "SECURITY_NOT_AUTHORIZED", - data: null - } - } - } - } - }); - - const [updateWorkflowResponse] = await noAccessHandler.updateWorkflowMutation({ - id: "abcde#0001", - data: {} - }); - - expect(updateWorkflowResponse).toEqual({ - data: { - apw: { - updateWorkflow: { - data: null, - error: { - message: "Not authorized to access publishing workflows.", - code: "SECURITY_NOT_AUTHORIZED", - data: null - } - } - } - } - }); - - const [deleteWorkflowResponse] = await noAccessHandler.deleteWorkflowMutation({ - id: "abcde#0001" - }); - - expect(deleteWorkflowResponse).toEqual({ - data: { - apw: { - deleteWorkflow: { - data: null, - error: { - message: "Not authorized to access publishing workflows.", - code: "SECURITY_NOT_AUTHORIZED", - data: null - } - } - } - } - }); - - const [getWorkflowResponse] = await noAccessHandler.getWorkflowQuery({ - id: "abcde#0001" - }); - - expect(getWorkflowResponse).toEqual({ - data: { - apw: { - getWorkflow: { - data: null, - error: { - message: `Entry by ID \"abcde#0001\" not found.`, - code: "NOT_FOUND", - data: null - } - } - } - } - }); - - const [listWorkflowsResponse] = await noAccessHandler.listWorkflowsQuery(); - - expect(listWorkflowsResponse).toEqual({ - data: { - apw: { - listWorkflows: { - data: [], - error: null, - meta: { - hasMoreItems: false, - totalCount: 0, - cursor: null - } - } - } - } - }); - }); - /** - * With this test we need to make sure that even the person with no apw permissions can access the list and get workflow methods. - */ - it("should be possible to access get and list methods", async () => { - const noAccessHandler = useGraphQlHandler({ - path: "/graphql", - permissions: [] - }); - const reviewer = await setupReviewer(); - const workflowData = mocks.createWorkflow( - { - app: ApwWorkflowApplications.PB - }, - [reviewer] - ); - const [createWorkflowResponse] = await createWorkflowMutation({ - data: workflowData - }); - - const workflow = createWorkflowResponse.data.apw.createWorkflow.data; - - const [getWorkflowResponse] = await noAccessHandler.getWorkflowQuery({ - id: workflow.id - }); - - expect(getWorkflowResponse).toEqual({ - data: { - apw: { - getWorkflow: { - data: { - ...workflow - }, - error: null - } - } - } - }); - - const [listWorkflowsResponse] = await listWorkflowsQuery(); - - expect(listWorkflowsResponse).toEqual({ - data: { - apw: { - listWorkflows: { - data: [workflow], - error: null, - meta: { - hasMoreItems: false, - totalCount: 1, - cursor: null - } - } - } - } - }); - }); -}); diff --git a/packages/api-apw/__tests__/graphql/workflowHooks.crud.test.ts b/packages/api-apw/__tests__/graphql/workflowHooks.crud.test.ts deleted file mode 100644 index 28ee38a04c8..00000000000 --- a/packages/api-apw/__tests__/graphql/workflowHooks.crud.test.ts +++ /dev/null @@ -1,681 +0,0 @@ -import { setupCategory } from "../utils/helpers"; -import mocks from "./mocks/workflows"; -import { ApwWorkflowApplications, WorkflowScopeTypes } from "~/types"; -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; - -describe("Workflow assignment to a PB Page", () => { - const { - createWorkflowMutation, - updateWorkflowMutation, - listWorkflowsQuery, - getWorkflowQuery, - createCategory, - getCategory, - createPage, - getPageQuery, - publishPage, - until, - reviewer: reviewerGQL, - securityIdentity - } = useGraphQlHandler({ - path: "/graphql" - }); - - const login = async () => { - return await securityIdentity.login(); - }; - - const setupReviewer = async () => { - await login(); - - await until( - () => reviewerGQL.listReviewersQuery({}).then(([data]) => data), - (response: any) => { - return response.data.apw.listReviewers.data.length === 1; - }, - { - name: "Wait for listReviewers" - } - ); - - const [listReviewersResponse] = await reviewerGQL.listReviewersQuery({}); - const [reviewer] = listReviewersResponse.data.apw.listReviewers.data; - return reviewer; - }; - - const setup = async () => { - const reviewer = await setupReviewer(); - const category = await setupCategory({ getCategory, createCategory }); - - return { - reviewer, - category - }; - }; - - test("Page should have a workflow assigned right after create", async () => { - const reviewer = await setupReviewer(); - const category = await setupCategory({ getCategory, createCategory }); - const workflows = []; - /* - Create 5 workflow entries - */ - for (let i = 0; i < 5; i++) { - const createWorkflowInput = mocks.createWorkflow( - { - title: `Main review workflow - ${i + 1}`, - app: i % 2 === 0 ? ApwWorkflowApplications.PB : ApwWorkflowApplications.CMS, - scope: mocks.scopes[i] - }, - [reviewer] - ); - - const [createWorkflowResponse] = await createWorkflowMutation({ - data: createWorkflowInput - }); - const workflow = createWorkflowResponse.data.apw.createWorkflow.data; - workflows.push(workflow); - } - - await until( - () => listWorkflowsQuery({}).then(([data]) => data), - (response: any) => { - return response.data.apw.listWorkflows.data.length === 5; - } - ); - const [firstWorkflow] = workflows; - /** - * Create a page and see what workflow has been assigned to it - */ - const [createPageResponse] = await createPage({ category: category.slug }); - const createdPageData = createPageResponse.data.pageBuilder.createPage.data; - - expect(createdPageData.category.slug).toEqual(category.slug); - - expect(createdPageData.settings.apw.workflowId).toEqual(firstWorkflow.id); - - /** - * New revision should also has the workflow assigned. - */ - const [createPageFromResponse] = await createPage({ - from: createdPageData.id, - category: category.slug - }); - const newRevisionData = createPageFromResponse.data.pageBuilder.createPage.data; - expect(newRevisionData.settings.apw.workflowId).toEqual(firstWorkflow.id); - }); - - test("Page should have the latest created workflow assigned in case of multiple matching workflows", async () => { - const reviewer = await setupReviewer(); - const category = await setupCategory({ getCategory, createCategory }); - const workflows = []; - const workflowScopes = mocks.getPageBuilderScope("", "static"); - /* - Create 5 workflow entries - */ - for (let i = 0; i < 5; i++) { - const [createWorkflowResponse] = await createWorkflowMutation({ - data: mocks.createWorkflow( - { - title: `Main review workflow - ${i + 1}`, - app: ApwWorkflowApplications.PB, - scope: workflowScopes[i] - }, - [reviewer] - ) - }); - - const workflow = createWorkflowResponse.data.apw.createWorkflow.data; - workflows.push(workflow); - } - - await until( - () => listWorkflowsQuery({}).then(([data]) => data), - (response: any) => response.data.apw.listWorkflows.data.length === 5 - ); - /** - * Create a page and see what workflow has been assigned to it - */ - const [createPageResponse] = await createPage({ category: category.slug }); - const createdPageData = createPageResponse.data.pageBuilder.createPage.data; - expect(createdPageData.category.slug).toEqual(category.slug); - - expect(createdPageData.settings.apw.workflowId).toEqual(workflows[3].id); - }); - - test("Page should not have a workflow assigned in case of no workflow exist", async () => { - const reviewer = await setupReviewer(); - const category = await setupCategory({ getCategory, createCategory }); - - // Create a workflow entry - const [createWorkflowResponse] = await createWorkflowMutation({ - data: { - ...mocks.createWorkflow( - { - app: ApwWorkflowApplications.CMS - }, - [reviewer] - ) - } - }); - const workflow = createWorkflowResponse.data.apw.createWorkflow.data; - - await until( - () => listWorkflowsQuery({}).then(([data]) => data), - (response: any) => response.data.apw.listWorkflows.data.length === 1 - ); - - // List workflows - const [listWorkflowsResponse] = await listWorkflowsQuery({}); - expect(listWorkflowsResponse).toEqual({ - data: { - apw: { - listWorkflows: { - data: [workflow], - error: null, - meta: { - totalCount: 1, - hasMoreItems: false, - cursor: null - } - } - } - } - }); - // Create a page and check if there is a workflow assigned - const [createPageResponse] = await createPage({ category: category.slug }); - const createdPageData = createPageResponse.data.pageBuilder.createPage.data; - expect(createdPageData.category.slug).toEqual(category.slug); - - expect(createdPageData.settings.apw).toEqual(null); - }); - - test("Page should have the workflow assigned even when the workflow is created after page", async () => { - const reviewer = await setupReviewer(); - const category = await setupCategory({ getCategory, createCategory }); - - /** - * Create a page even before a workflow is created. - */ - const [createPageResponse] = await createPage({ category: category.slug }); - const page = createPageResponse.data.pageBuilder.createPage.data; - expect(page.category.slug).toEqual(category.slug); - expect(page.settings.apw).toEqual(null); - - /* - Create a workflow. - */ - const [createWorkflowResponse] = await createWorkflowMutation({ - data: mocks.createWorkflow( - { - title: `Main review workflow`, - app: ApwWorkflowApplications.PB, - scope: { - type: WorkflowScopeTypes.CUSTOM, - data: { - entries: [], - models: [], - categories: [], - pages: [page.pid] - } - } - }, - [reviewer] - ) - }); - - const workflow = createWorkflowResponse.data.apw.createWorkflow.data; - - await until( - () => listWorkflowsQuery({}).then(([data]) => data), - (response: any) => response.data.apw.listWorkflows.data.length === 1 - ); - - const [listWorkflowsResponse] = await listWorkflowsQuery(); - - expect(listWorkflowsResponse).toEqual({ - data: { - apw: { - listWorkflows: { - data: [ - { - ...workflow - } - ], - meta: { - totalCount: 1, - cursor: null, - hasMoreItems: false - }, - error: null - } - } - } - }); - /** - * Now page should have this workflow assigned to it. - */ - const [getPageResponse] = await getPageQuery({ id: page.id }); - - expect(getPageResponse).toMatchObject({ - data: { - pageBuilder: { - getPage: { - data: { - id: page.id, - settings: { - apw: { - contentReviewId: null, - workflowId: workflow.id - } - } - } - } - } - } - }); - - /** - * Let's try creating one more workflow with same scope. - */ - - /* - Create a workflow. - */ - const [createAnotherWorkflowResponse] = await createWorkflowMutation({ - data: mocks.createWorkflow( - { - title: `Main review workflow - 2`, - app: ApwWorkflowApplications.PB, - scope: { - type: WorkflowScopeTypes.CUSTOM, - data: { - pages: [page.pid, page.pid + "999999"] - } - } - }, - [reviewer] - ) - }); - const anotherWorkflowWithSameScope = - createAnotherWorkflowResponse.data.apw.createWorkflow.data; - - /** - * Now page should have new newly created workflow assigned to it. - */ - const [getPageResponseAgain] = await getPageQuery({ id: page.id }); - expect(getPageResponseAgain.data.pageBuilder.getPage.data.settings.apw.workflowId).toBe( - anotherWorkflowWithSameScope.id - ); - }); - - test("Pages should have the workflow assigned even after the workflow has been updated", async () => { - const { reviewer, category } = await setup(); - - /** - * Create two new pages while we don't have any workflow in the system. - */ - const pages = []; - for (let i = 0; i < 2; i++) { - const [createPageResponse] = await createPage({ category: category.slug }); - const page = createPageResponse.data.pageBuilder.createPage.data; - expect(page.category.slug).toEqual(category.slug); - expect(page.settings.apw).toEqual(null); - /* - * Save it for later - */ - pages.push(page); - } - const [firstPage, secondPage] = pages; - /* - Create a workflow and add first page in its scope. - */ - const [createWorkflowResponse] = await createWorkflowMutation({ - data: mocks.createWorkflow( - { - title: `Main review workflow`, - app: ApwWorkflowApplications.PB, - scope: { - type: WorkflowScopeTypes.CUSTOM, - data: { - pages: [firstPage.pid] - } - } - }, - [reviewer] - ) - }); - expect(createWorkflowResponse).toEqual({ - data: { - apw: { - createWorkflow: { - data: expect.any(Object), - error: null - } - } - } - }); - - await until( - () => listWorkflowsQuery({}).then(([data]) => data), - (response: any) => response.data.apw.listWorkflows.data.length === 1 - ); - - const workflow = createWorkflowResponse.data.apw.createWorkflow.data; - - /** - * Now first page should have this workflow assigned to it. - */ - const [getPageResponse] = await getPageQuery({ id: firstPage.id }); - expect(getPageResponse.data.pageBuilder.getPage.data.settings.apw).toEqual({ - workflowId: workflow.id, - contentReviewId: null - }); - - /** - * Let's update the workflow scope. - */ - const [updateWorkflowResponse] = await updateWorkflowMutation({ - id: workflow.id, - data: { - title: workflow.title, - steps: workflow.steps, - scope: { - type: WorkflowScopeTypes.CUSTOM, - data: { - pages: [secondPage.pid] - } - } - } - }); - - await until( - () => getWorkflowQuery({ id: workflow.id }).then(([data]) => data), - (response: any) => response.data.apw.getWorkflow.data.savedOn !== workflow.savedOn, - { - name: "Wait for getWorkflow query" - } - ); - - const updatedWorkflow = updateWorkflowResponse.data.apw.updateWorkflow.data; - expect(updatedWorkflow).toEqual({ - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - app: expect.any(String), - title: expect.any(String), - steps: [ - { - title: expect.any(String), - id: expect.any(String), - type: expect.any(String), - reviewers: [expect.any(String)] - } - ], - scope: { - type: expect.any(String), - data: { - pages: [secondPage.pid] - } - } - }); - /** - * Now second page should have this workflow assigned to it. - */ - const [getSecondPageResponse] = await getPageQuery({ id: secondPage.id }); - expect(getSecondPageResponse.data.pageBuilder.getPage.data.settings.apw).toEqual({ - workflowId: workflow.id, - contentReviewId: null - }); - }); - - test(`Assign workflow to a "published" page`, async () => { - const { reviewer, category } = await setup(); - - /** - * Create two new pages while we don't have any workflow in the system. - */ - const pages = []; - for (let i = 0; i < 2; i++) { - const [createPageResponse] = await createPage({ category: category.slug }); - const page = createPageResponse.data.pageBuilder.createPage.data; - expect(page.category.slug).toEqual(category.slug); - expect(page.settings.apw).toEqual(null); - /* - * Save it for later - */ - pages.push(page); - } - const [firstPage, secondPage] = pages; - /** - * Let's publish the second page. - */ - const [publishPageResponse] = await publishPage({ id: secondPage.id }); - expect(publishPageResponse).toEqual({ - data: { - pageBuilder: { - publishPage: { - data: expect.any(Object), - error: null - } - } - } - }); - - /* - Create a workflow and add both pages in its scope. - */ - const [createWorkflowResponse] = await createWorkflowMutation({ - data: mocks.createWorkflow( - { - title: `Main review workflow`, - app: ApwWorkflowApplications.PB, - scope: { - type: WorkflowScopeTypes.CUSTOM, - data: { - pages: [firstPage.pid, secondPage.pid] - } - } - }, - [reviewer] - ) - }); - expect(createWorkflowResponse).toEqual({ - data: { - apw: { - createWorkflow: { - data: expect.any(Object), - error: null - } - } - } - }); - - await until( - () => listWorkflowsQuery({}).then(([data]) => data), - (response: any) => response.data.apw.listWorkflows.data.length === 1 - ); - - const workflow = createWorkflowResponse.data.apw.createWorkflow.data; - - /** - * Now first page should have this workflow assigned to it. - */ - const [getPageResponse] = await getPageQuery({ id: firstPage.id }); - expect(getPageResponse.data.pageBuilder.getPage.data.settings.apw).toEqual({ - workflowId: workflow.id, - contentReviewId: null - }); - - /** - * But, second page should not have this workflow assigned to it. - */ - const [getSecondPageResponse] = await getPageQuery({ id: secondPage.id }); - expect(getSecondPageResponse.data.pageBuilder.getPage.data.settings.apw).toBe(null); - - /** - * Now, let's create a new revision of the second page i.e. published page. - */ - const [createPageFromResponse] = await createPage({ - from: secondPage.id, - category: category.slug - }); - expect(createPageFromResponse).toEqual({ - data: { - pageBuilder: { - createPage: { - data: expect.any(Object), - error: null - } - } - } - }); - const secondPageNewRevision = createPageFromResponse.data.pageBuilder.createPage.data; - /** - * Now, it should have a workflow assigned. - */ - expect(secondPageNewRevision.settings.apw).toEqual({ - workflowId: workflow.id, - contentReviewId: null - }); - }); - - test(`Should remove "workflowId" from a page after workflow update`, async () => { - const { reviewer, category } = await setup(); - - /** - * Create two new pages while we don't have any workflow in the system. - */ - const pages = []; - for (let i = 0; i < 2; i++) { - const [createPageResponse] = await createPage({ category: category.slug }); - const page = createPageResponse.data.pageBuilder.createPage.data; - expect(page.category.slug).toEqual(category.slug); - expect(page.settings.apw).toEqual(null); - /* - * Save it for later - */ - pages.push(page); - } - const [firstPage, secondPage] = pages; - - /* - * Create a workflow and add both pages in its scope. - */ - const [createWorkflowResponse] = await createWorkflowMutation({ - data: mocks.createWorkflow( - { - title: `Main review workflow`, - app: ApwWorkflowApplications.PB, - scope: { - type: WorkflowScopeTypes.CUSTOM, - data: { - pages: [firstPage.pid, secondPage.pid] - } - } - }, - [reviewer] - ) - }); - expect(createWorkflowResponse).toEqual({ - data: { - apw: { - createWorkflow: { - data: expect.any(Object), - error: null - } - } - } - }); - - await until( - () => listWorkflowsQuery({}).then(([data]) => data), - (response: any) => response.data.apw.listWorkflows.data.length === 1 - ); - - const workflow = createWorkflowResponse.data.apw.createWorkflow.data; - - /** - * Both pages should have this workflow assigned to them. - */ - for (let i = 0; i < pages.length; i++) { - const [getPageResponse] = await getPageQuery({ id: pages[i].id }); - expect(getPageResponse.data.pageBuilder.getPage.data.settings.apw).toEqual({ - workflowId: workflow.id, - contentReviewId: null - }); - } - - /** - * Now, let's update the workflow such that second page is no longer in its scope. - */ - const [updateWorkflowResponse] = await updateWorkflowMutation({ - id: workflow.id, - data: { - title: workflow.title, - steps: workflow.steps, - scope: { - type: WorkflowScopeTypes.CUSTOM, - data: { - pages: [firstPage.pid] - } - } - } - }); - expect(updateWorkflowResponse).toEqual({ - data: { - apw: { - updateWorkflow: { - data: { - id: expect.any(String), - createdOn: expect.stringMatching(/^20/), - savedOn: expect.stringMatching(/^20/), - createdBy: { - id: "12345678", - displayName: "John Doe", - type: "admin" - }, - app: expect.any(String), - title: expect.any(String), - steps: [ - { - title: expect.any(String), - id: expect.any(String), - type: expect.any(String), - reviewers: [expect.any(String)] - } - ], - scope: { - type: expect.any(String), - data: { - pages: [firstPage.pid] - } - } - }, - error: null - } - } - } - }); - - /** - * Now only firstPage should have the workflowId attached. - */ - const [getPageResponse] = await getPageQuery({ id: firstPage.id }); - expect(getPageResponse.data.pageBuilder.getPage.data.settings.apw).toEqual({ - workflowId: workflow.id, - contentReviewId: null - }); - - const [getPage2Response] = await getPageQuery({ id: secondPage.id }); - expect(getPage2Response.data.pageBuilder.getPage.data.settings.apw).toEqual({ - workflowId: null, - contentReviewId: null - }); - }); -}); diff --git a/packages/api-apw/__tests__/scheduleAction/crud.cms_entry.test.ts b/packages/api-apw/__tests__/scheduleAction/crud.cms_entry.test.ts deleted file mode 100644 index 6d36fb9fd0a..00000000000 --- a/packages/api-apw/__tests__/scheduleAction/crud.cms_entry.test.ts +++ /dev/null @@ -1,458 +0,0 @@ -import useHandler from "./useHandler"; -import { ApwContentTypes } from "~/types"; -import { - ApwScheduleAction, - ApwScheduleActionCrud, - ApwScheduleActionTypes -} from "~/scheduler/types"; -import { LambdaContext } from "@webiny/handler-aws/types"; - -const ONE_MINUTE = 1000 * 60; -const TIME_SEPARATOR = ":"; - -const getIsoStringTillMinutes = (datetime: string): string => { - // "2022-03-08T05:41:13.230Z" - return datetime.slice(0, datetime.lastIndexOf(TIME_SEPARATOR)); -}; - -const MODEL_ID = "testModelId"; - -const EXPECTED_APW_SCHEDULED_ACTION_DATA = expect.objectContaining({ - datetime: expect.toBeDateString(), - type: ApwContentTypes.CMS_ENTRY, - action: ApwScheduleActionTypes.PUBLISH, - entryId: expect.any(String), - modelId: MODEL_ID -}); - -describe("Schedule action CRUD Test - CMS Entry type", () => { - const { handler } = useHandler(); - - test("Should able to create, update, list, get and delete schedule action items", async () => { - const context = await handler( - { - headers: { - ["x-tenant"]: "root" - } - }, - {} as LambdaContext - ); - const scheduleActionCrud: ApwScheduleActionCrud = context.scheduleAction; - /** - * Let's create one schedule action item. - */ - const scheduledAction = await scheduleActionCrud.create({ - datetime: new Date().toISOString(), - action: ApwScheduleActionTypes.PUBLISH, - type: ApwContentTypes.CMS_ENTRY, - entryId: "62303be79cfe6e0009d8d9cf#0001", - modelId: MODEL_ID - }); - expect(scheduledAction).toEqual({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - modifiedOn: null, - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - modifiedBy: null, - savedBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }); - - /** - * Should able to get schedule action item by id. - */ - const getItemResult = await scheduleActionCrud.get(scheduledAction.id); - expect(getItemResult).toEqual({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - savedBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }); - - /** - * Should able to list schedule action items. - */ - const [listItemResult, meta] = await scheduleActionCrud.list({ where: {} }); - expect(listItemResult).toEqual([ - { - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - savedBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - } - ]); - expect(meta).toEqual({ - hasMoreItems: false, - totalCount: 1, - cursor: expect.any(String) - }); - - /** - * Doing partial update should return an error. - */ - let updateItemResultWithError; - try { - // @ts-expect-error - updateItemResultWithError = await scheduleActionCrud.update(scheduledAction.id, { - action: ApwScheduleActionTypes.UNPUBLISH - }); - } catch (e) { - expect(e.message).toBe("Validation failed."); - expect(updateItemResultWithError).toBe(undefined); - } - - /** - * Should able to update a schedule action item. - */ - const updateItemResult = await scheduleActionCrud.update(scheduledAction.id, { - datetime: new Date().toISOString(), - action: ApwScheduleActionTypes.UNPUBLISH, - type: ApwContentTypes.CMS_ENTRY, - entryId: "62303be79cfe6e0009d8d9cf#0001", - modelId: MODEL_ID - }); - expect(updateItemResult).toEqual({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - savedBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }); - - /** - * Should able to delete a schedule action item by id. - */ - const deleteItemResult = await scheduleActionCrud.delete(scheduledAction.id); - expect(deleteItemResult).toBe(true); - - /** - * Should not be able to get schedule action item by id. - */ - const notFoundResult = await scheduleActionCrud.get(scheduledAction.id); - expect(notFoundResult).toBe(null); - - /** - * Should return empty list in case of no schedule action items. - */ - const [listItemEmptyResult, listItemEmptyMeta] = await scheduleActionCrud.list({ - where: {} - }); - expect(listItemEmptyResult).toEqual([]); - expect(listItemEmptyMeta).toEqual({ - hasMoreItems: false, - totalCount: 0, - cursor: null - }); - }); - - test("Should able to sort schedule action items by datetime", async () => { - const context = await handler( - { - headers: { - ["x-tenant"]: "root" - } - }, - {} as LambdaContext - ); - const scheduleActionCrud: ApwScheduleActionCrud = context.scheduleAction; - /** - * Let's create five schedule action item. - */ - const scheduledActions = []; - for (let i = 0; i < 5; i++) { - const now = new Date().getTime() + 1000; - const scheduledAction = await scheduleActionCrud.create({ - datetime: new Date(now).toISOString(), - action: ApwScheduleActionTypes.PUBLISH, - type: ApwContentTypes.CMS_ENTRY, - entryId: "62303be79cfe6e0009d8d9cf#0001", - modelId: MODEL_ID - }); - scheduledActions.push(scheduledAction); - } - - /** - * Should able to list schedule action items. - */ - const [listItemResult, meta] = await scheduleActionCrud.list({ where: {} }); - expect(listItemResult).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }) - ]) - ); - expect(meta).toEqual({ - hasMoreItems: false, - totalCount: 5, - cursor: expect.any(String) - }); - /** - * Sorted by datetime(ISO string) in ascending order. - */ - for (let i = 0; i < listItemResult.length - 1; i++) { - const currentItem = listItemResult[i]; - const nextItem = listItemResult[i + 1]; - expect(currentItem.data.datetime < nextItem.data.datetime).toBe(true); - } - - /** - * Should able to list schedule action items in descending order of datetime. - */ - const [listItemDescendingResult, listItemDescendingMeta] = await scheduleActionCrud.list({ - where: {}, - sort: ["datetime_DESC"] - }); - expect(listItemDescendingResult).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }) - ]) - ); - expect(listItemDescendingMeta).toEqual({ - hasMoreItems: false, - totalCount: 5, - cursor: expect.any(String) - }); - - /** - * Sorted by datetime(ISO string) in ascending order. - */ - for (let i = 0; i < listItemDescendingResult.length - 1; i++) { - const currentItem = listItemDescendingResult[i]; - const nextItem = listItemDescendingResult[i + 1]; - expect(currentItem.data.datetime > nextItem.data.datetime).toBe(true); - } - }); - - test("Should able to get all schedule action items with same datetime", async () => { - const context = await handler( - { - headers: { - ["x-tenant"]: "root" - } - }, - {} as LambdaContext - ); - const scheduleActionCrud: ApwScheduleActionCrud = context.scheduleAction; - /** - * Let's create five schedule action item. - */ - const scheduledActions: ApwScheduleAction[] = []; - for (let i = 0; i < 5; i++) { - let now = new Date().getTime(); - if (i % 2 === 0) { - now += ONE_MINUTE; - } - const scheduledAction = await scheduleActionCrud.create({ - datetime: new Date(now).toISOString(), - action: ApwScheduleActionTypes.PUBLISH, - type: ApwContentTypes.CMS_ENTRY, - entryId: "62303be79cfe6e0009d8d9cf#0001", - modelId: MODEL_ID - }); - scheduledActions.push(scheduledAction); - } - - const [firstAction, secondAction] = scheduledActions; - const firstDateTime = getIsoStringTillMinutes(firstAction.data.datetime); - const secondDateTime = getIsoStringTillMinutes(secondAction.data.datetime); - - /** - * Should able to list schedule action items by datetime. - */ - const [listItemFirstDateResult] = await scheduleActionCrud.list({ - where: { datetime_startsWith: firstDateTime } - }); - expect(listItemFirstDateResult).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }) - ]) - ); - expect(listItemFirstDateResult.length).toBe(3); - - /** - * Should able to list schedule action items datetime. - */ - const [listItemSecondDateResult] = await scheduleActionCrud.list({ - where: { datetime_startsWith: secondDateTime } - }); - expect(listItemSecondDateResult).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }) - ]) - ); - expect(listItemSecondDateResult.length).toBe(2); - }); - - test("Should able to get and update current schedule action item", async () => { - const context = await handler( - { - headers: { - ["x-tenant"]: "root" - } - }, - {} as LambdaContext - ); - const scheduleActionCrud: ApwScheduleActionCrud = context.scheduleAction; - /** - * Let's create two schedule action item. - */ - const TOTAL = 2; - const scheduledActions: ApwScheduleAction[] = []; - for (let i = 0; i < TOTAL; i++) { - let now = new Date().getTime(); - if (i % 2 === 0) { - now += ONE_MINUTE; - } - const scheduledAction = await scheduleActionCrud.create({ - datetime: new Date(now).toISOString(), - action: ApwScheduleActionTypes.PUBLISH, - type: ApwContentTypes.CMS_ENTRY, - entryId: "62303be79cfe6e0009d8d9cf#0001", - modelId: MODEL_ID - }); - scheduledActions.push(scheduledAction); - } - - /** - * Should able to list schedule action items by datetime. - */ - const [listItemResult] = await scheduleActionCrud.list({ - where: {} - }); - expect(listItemResult).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }) - ]) - ); - expect(listItemResult.length).toBe(TOTAL); - - /** - * Should return null as currentTask - */ - const currentTaskNull = await scheduleActionCrud.getCurrentTask(); - expect(currentTaskNull).toBe(null); - - const [firstAction, secondAction] = scheduledActions; - - /** - * Let's set the currentTask for the very first time. - */ - await scheduleActionCrud.updateCurrentTask(firstAction); - - /** - * Now we should have it. - */ - const currentTaskFirstAction = await scheduleActionCrud.getCurrentTask(); - if (currentTaskFirstAction) { - expect(currentTaskFirstAction.id).toBe(firstAction.id); - } - - /** - * Let's set the currentTask for the very first time. - */ - await scheduleActionCrud.updateCurrentTask(secondAction); - - /** - * Now we should have it. - */ - const currentTaskSecondAction = await scheduleActionCrud.getCurrentTask(); - if (currentTaskSecondAction) { - expect(currentTaskSecondAction.id).toBe(secondAction.id); - } - - /** - * Let's delete the current task. - */ - const deleteCurrentTask = await scheduleActionCrud.deleteCurrentTask(); - expect(deleteCurrentTask).toBe(true); - - /** - * Now we should not have it. - */ - const currentTaskNoTasks = await scheduleActionCrud.getCurrentTask(); - expect(currentTaskNoTasks).toBe(null); - }); - - test("Validation should fail when modelId is not sent", async () => { - const context = await handler( - { - headers: { - ["x-tenant"]: "root" - } - }, - {} as LambdaContext - ); - const scheduleActionCrud: ApwScheduleActionCrud = context.scheduleAction; - - let ex: Error | null = null; - - try { - await scheduleActionCrud.create({ - datetime: new Date().toISOString(), - action: ApwScheduleActionTypes.PUBLISH, - type: ApwContentTypes.CMS_ENTRY, - entryId: "62303be79cfe6e0009d8d9cf#0001" - }); - } catch (er) { - ex = er; - } - /** - * Let's create one schedule action item. - */ - expect(ex).toBeInstanceOf(Error); - expect(ex?.message).toEqual("Validation failed."); - }); -}); diff --git a/packages/api-apw/__tests__/scheduleAction/crud.page.test.ts b/packages/api-apw/__tests__/scheduleAction/crud.page.test.ts deleted file mode 100644 index c6ab50c3f84..00000000000 --- a/packages/api-apw/__tests__/scheduleAction/crud.page.test.ts +++ /dev/null @@ -1,420 +0,0 @@ -import useHandler from "./useHandler"; -import { ApwContentTypes } from "~/types"; -import { - ApwScheduleAction, - ApwScheduleActionCrud, - ApwScheduleActionTypes -} from "~/scheduler/types"; -import { LambdaContext } from "@webiny/handler-aws/types"; - -const ONE_MINUTE = 1000 * 60; -const TIME_SEPARATOR = ":"; - -const getIsoStringTillMinutes = (datetime: string): string => { - // "2022-03-08T05:41:13.230Z" - return datetime.slice(0, datetime.lastIndexOf(TIME_SEPARATOR)); -}; - -const EXPECTED_APW_SCHEDULED_ACTION_DATA = expect.objectContaining({ - datetime: expect.toBeDateString(), - type: "page", - action: "publish", - entryId: expect.any(String) -}); - -describe("Schedule action CRUD Test - Page type", () => { - const { handler } = useHandler(); - - test("Should able to create, update, list, get and delete schedule action items", async () => { - const context = await handler( - { - headers: { - ["x-tenant"]: "root" - } - }, - {} as LambdaContext - ); - const scheduleActionCrud: ApwScheduleActionCrud = context.scheduleAction; - /** - * Let's create one schedule action item. - */ - const scheduledAction = await scheduleActionCrud.create({ - datetime: new Date().toISOString(), - action: ApwScheduleActionTypes.PUBLISH, - type: ApwContentTypes.PAGE, - entryId: "62303be79cfe6e0009d8d9cf#0001" - }); - expect(scheduledAction).toEqual({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - modifiedOn: null, - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - modifiedBy: null, - savedBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }); - - /** - * Should able to get schedule action item by id. - */ - const getItemResult = await scheduleActionCrud.get(scheduledAction.id); - expect(getItemResult).toEqual({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - savedBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }); - - /** - * Should able to list schedule action items. - */ - const [listItemResult, meta] = await scheduleActionCrud.list({ where: {} }); - expect(listItemResult).toEqual([ - { - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - savedBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - } - ]); - expect(meta).toEqual({ - hasMoreItems: false, - totalCount: 1, - cursor: expect.any(String) - }); - - /** - * Doing partial update should return an error. - */ - let updateItemResultWithError; - try { - // @ts-expect-error - updateItemResultWithError = await scheduleActionCrud.update(scheduledAction.id, { - action: ApwScheduleActionTypes.UNPUBLISH - }); - } catch (e) { - expect(e.message).toBe("Validation failed."); - expect(updateItemResultWithError).toBe(undefined); - } - - /** - * Should able to update a schedule action item. - */ - const updateItemResult = await scheduleActionCrud.update(scheduledAction.id, { - datetime: new Date().toISOString(), - action: ApwScheduleActionTypes.UNPUBLISH, - type: ApwContentTypes.PAGE, - entryId: "62303be79cfe6e0009d8d9cf#0001" - }); - expect(updateItemResult).toEqual({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - savedBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }); - - /** - * Should able to delete a schedule action item by id. - */ - const deleteItemResult = await scheduleActionCrud.delete(scheduledAction.id); - expect(deleteItemResult).toBe(true); - - /** - * Should not be able to get schedule action item by id. - */ - const notFoundResult = await scheduleActionCrud.get(scheduledAction.id); - expect(notFoundResult).toBe(null); - - /** - * Should return empty list in case of no schedule action items. - */ - const [listItemEmptyResult, listItemEmptyMeta] = await scheduleActionCrud.list({ - where: {} - }); - expect(listItemEmptyResult).toEqual([]); - expect(listItemEmptyMeta).toEqual({ - hasMoreItems: false, - totalCount: 0, - cursor: null - }); - }); - - test("Should able to sort schedule action items by datetime", async () => { - const context = await handler( - { - headers: { - ["x-tenant"]: "root" - } - }, - {} as LambdaContext - ); - const scheduleActionCrud: ApwScheduleActionCrud = context.scheduleAction; - /** - * Let's create five schedule action item. - */ - const scheduledActions = []; - for (let i = 0; i < 5; i++) { - const now = new Date().getTime() + 1000; - const scheduledAction = await scheduleActionCrud.create({ - datetime: new Date(now).toISOString(), - action: ApwScheduleActionTypes.PUBLISH, - type: ApwContentTypes.PAGE, - entryId: "62303be79cfe6e0009d8d9cf#0001" - }); - scheduledActions.push(scheduledAction); - } - - /** - * Should able to list schedule action items. - */ - const [listItemResult, meta] = await scheduleActionCrud.list({ where: {} }); - expect(listItemResult).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }) - ]) - ); - expect(meta).toEqual({ - hasMoreItems: false, - totalCount: 5, - cursor: expect.any(String) - }); - /** - * Sorted by datetime(ISO string) in ascending order. - */ - for (let i = 0; i < listItemResult.length - 1; i++) { - const currentItem = listItemResult[i]; - const nextItem = listItemResult[i + 1]; - expect(currentItem.data.datetime < nextItem.data.datetime).toBe(true); - } - - /** - * Should able to list schedule action items in descending order of datetime. - */ - const [listItemDescendingResult, listItemDescendingMeta] = await scheduleActionCrud.list({ - where: {}, - sort: ["datetime_DESC"] - }); - expect(listItemDescendingResult).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }) - ]) - ); - expect(listItemDescendingMeta).toEqual({ - hasMoreItems: false, - totalCount: 5, - cursor: expect.any(String) - }); - - /** - * Sorted by datetime(ISO string) in ascending order. - */ - for (let i = 0; i < listItemDescendingResult.length - 1; i++) { - const currentItem = listItemDescendingResult[i]; - const nextItem = listItemDescendingResult[i + 1]; - expect(currentItem.data.datetime > nextItem.data.datetime).toBe(true); - } - }); - - test("Should able to get all schedule action items with same datetime", async () => { - const context = await handler( - { - headers: { - ["x-tenant"]: "root" - } - }, - {} as LambdaContext - ); - const scheduleActionCrud: ApwScheduleActionCrud = context.scheduleAction; - /** - * Let's create five schedule action item. - */ - const scheduledActions: ApwScheduleAction[] = []; - for (let i = 0; i < 5; i++) { - let now = new Date().getTime(); - if (i % 2 === 0) { - now += ONE_MINUTE; - } - const scheduledAction = await scheduleActionCrud.create({ - datetime: new Date(now).toISOString(), - action: ApwScheduleActionTypes.PUBLISH, - type: ApwContentTypes.PAGE, - entryId: "62303be79cfe6e0009d8d9cf#0001" - }); - scheduledActions.push(scheduledAction); - } - - const [firstAction, secondAction] = scheduledActions; - const firstDateTime = getIsoStringTillMinutes(firstAction.data.datetime); - const secondDateTime = getIsoStringTillMinutes(secondAction.data.datetime); - - /** - * Should able to list schedule action items by datetime. - */ - const [listItemFirstDateResult] = await scheduleActionCrud.list({ - where: { datetime_startsWith: firstDateTime } - }); - expect(listItemFirstDateResult).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }) - ]) - ); - expect(listItemFirstDateResult.length).toBe(3); - - /** - * Should able to list schedule action items datetime. - */ - const [listItemSecondDateResult] = await scheduleActionCrud.list({ - where: { datetime_startsWith: secondDateTime } - }); - expect(listItemSecondDateResult).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }) - ]) - ); - expect(listItemSecondDateResult.length).toBe(2); - }); - - it("should be able to get and update current schedule action item", async () => { - const context = await handler( - { - headers: { - ["x-tenant"]: "root" - } - }, - {} as LambdaContext - ); - const scheduleActionCrud: ApwScheduleActionCrud = context.scheduleAction; - /** - * Let's create two schedule action item. - */ - const TOTAL = 2; - const scheduledActions: ApwScheduleAction[] = []; - for (let i = 0; i < TOTAL; i++) { - let now = new Date().getTime(); - if (i % 2 === 0) { - now += ONE_MINUTE; - } - const scheduledAction = await scheduleActionCrud.create({ - datetime: new Date(now).toISOString(), - action: ApwScheduleActionTypes.PUBLISH, - type: ApwContentTypes.PAGE, - entryId: "62303be79cfe6e0009d8d9cf#0001" - }); - scheduledActions.push(scheduledAction); - } - - /** - * Should able to list schedule action items by datetime. - */ - const [listItemResult] = await scheduleActionCrud.list({ - where: {} - }); - expect(listItemResult).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(String), - createdOn: expect.toBeDateString(), - savedOn: expect.toBeDateString(), - createdBy: expect.any(Object), - tenant: expect.any(String), - locale: expect.any(String), - data: EXPECTED_APW_SCHEDULED_ACTION_DATA - }) - ]) - ); - expect(listItemResult.length).toBe(TOTAL); - - /** - * Should return null as currentTask - */ - const currentTaskNull = await scheduleActionCrud.getCurrentTask(); - expect(currentTaskNull).toBe(null); - - const [firstAction, secondAction] = scheduledActions; - - /** - * Let's set the currentTask for the very first time. - */ - await scheduleActionCrud.updateCurrentTask(firstAction); - - /** - * Now we should have it. - */ - const currentTaskFirstAction = await scheduleActionCrud.getCurrentTask(); - if (currentTaskFirstAction) { - expect(currentTaskFirstAction.id).toBe(firstAction.id); - } - - /** - * Let's set the currentTask for the very first time. - */ - await scheduleActionCrud.updateCurrentTask(secondAction); - - /** - * Now we should have it. - */ - const currentTaskSecondAction = await scheduleActionCrud.getCurrentTask(); - if (currentTaskSecondAction) { - expect(currentTaskSecondAction.id).toBe(secondAction.id); - } - - /** - * Let's delete the current task. - */ - const deleteCurrentTask = await scheduleActionCrud.deleteCurrentTask(); - expect(deleteCurrentTask).toBe(true); - - /** - * Now we should not have it. - */ - const currentTaskNoTasks = await scheduleActionCrud.getCurrentTask(); - expect(currentTaskNoTasks).toBe(null); - }); -}); diff --git a/packages/api-apw/__tests__/scheduleAction/tenancySecurity.ts b/packages/api-apw/__tests__/scheduleAction/tenancySecurity.ts deleted file mode 100644 index b0cca0b5d90..00000000000 --- a/packages/api-apw/__tests__/scheduleAction/tenancySecurity.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { createTenancyContext, createTenancyGraphQL } from "@webiny/api-tenancy"; -import { createSecurityContext, createSecurityGraphQL } from "@webiny/api-security"; -import { - SecurityContext, - SecurityIdentity, - SecurityPermission, - SecurityStorageOperations -} from "@webiny/api-security/types"; -import { ContextPlugin } from "@webiny/api"; -import { BeforeHandlerPlugin } from "@webiny/handler"; -import { TenancyContext, TenancyStorageOperations } from "@webiny/api-tenancy/types"; -import { getStorageOps } from "@webiny/project-utils/testing/environment"; - -interface Config { - permissions?: SecurityPermission[]; - identity?: SecurityIdentity; -} - -export const defaultIdentity = { - id: "12345678", - type: "admin", - displayName: "John Doe", - email: "testing@webiny.com" -}; - -export const createTenancyAndSecurity = ({ permissions, identity }: Config = {}) => { - const tenancyStorage = getStorageOps("tenancy"); - const securityStorage = getStorageOps("security"); - - return [ - createTenancyContext({ storageOperations: tenancyStorage.storageOperations }), - createTenancyGraphQL(), - createSecurityContext({ - storageOperations: securityStorage.storageOperations - }), - createSecurityGraphQL(), - new ContextPlugin(context => { - context.tenancy.setCurrentTenant({ - id: "root", - name: "Root", - parent: null, - status: "unknown", - description: "", - tags: [], - settings: { - domains: [] - }, - createdOn: new Date().toISOString(), - savedOn: new Date().toISOString() - }); - - context.security.addAuthenticator(async () => { - return identity || defaultIdentity; - }); - - context.security.addAuthorizer(async () => { - return permissions || [{ name: "*" }]; - }); - }), - new BeforeHandlerPlugin(context => { - return context.security.authenticate(""); - }) - ]; -}; diff --git a/packages/api-apw/__tests__/scheduleAction/useHandler.ts b/packages/api-apw/__tests__/scheduleAction/useHandler.ts deleted file mode 100644 index 00d71391ebe..00000000000 --- a/packages/api-apw/__tests__/scheduleAction/useHandler.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { createEventHandler, createHandler } from "@webiny/handler-aws/raw"; -import graphqlHandler from "@webiny/handler-graphql"; -import { createScheduler } from "~/scheduler"; -import { ContextPlugin } from "@webiny/api"; -import { PageBuilderContextObject, PbContext } from "@webiny/api-page-builder/graphql/types"; -import { createTenancyAndSecurity } from "./tenancySecurity"; -import { SecurityIdentity, SecurityPermission } from "@webiny/api-security/types"; -import { createPermissions } from "../utils/helpers"; -import { ApwContext } from "~/types"; -import { getStorageOps } from "@webiny/project-utils/testing/environment"; -import { ApwScheduleActionStorageOperations } from "~/scheduler/types"; - -interface Params { - plugins?: any; -} - -export default (params: Params = {}) => { - const { plugins: extraPlugins = [] } = params; - - const apwScheduleStorage = getStorageOps("apwSchedule"); - - const handler = createHandler({ - plugins: [ - ...apwScheduleStorage.plugins, - ...createTenancyAndSecurity(), - graphqlHandler(), - { - type: "context", - apply: (context: any) => { - if (context.i18n) { - return; - } - - context.i18n = { - getContentLocale: () => { - return { - code: "en-US" - }; - }, - hasI18NContentPermission: () => { - return true; - }, - checkI18NContentPermission: () => { - return; - } - }; - } - }, - new ContextPlugin(context => { - context.pageBuilder = {} as unknown as PageBuilderContextObject; - }), - new ContextPlugin(async context => { - context.scheduleAction = createScheduler({ - storageOperations: apwScheduleStorage.storageOperations, - getTenant: () => { - return { - id: "root", - name: "Root", - parent: null, - status: "unknown", - description: "", - settings: { - domains: [] - }, - tags: [], - createdOn: new Date().toISOString(), - savedOn: new Date().toISOString() - }; - }, - getLocale: () => { - return { code: "en-US", default: true }; - }, - getPermission: async (name: string) => { - if (!name) { - return null; - } - return [{ name: "*" }] as unknown as SecurityPermission; - }, - getIdentity: (): SecurityIdentity => { - return { - id: "12345678", - type: "admin", - displayName: "John Doe", - permissions: createPermissions().concat({ name: "pb.*" }) - }; - } - }); - }), - createEventHandler(async ({ context }) => { - return context; - }), - /** - * We need an EventPlugin defined because it returns the context which we actually use in tests. - */ - extraPlugins || [] - ] - }); - - return { - handler - }; -}; diff --git a/packages/api-apw/__tests__/types.ts b/packages/api-apw/__tests__/types.ts deleted file mode 100644 index 6360608f1c8..00000000000 --- a/packages/api-apw/__tests__/types.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Context as BaseContext } from "@webiny/api/types"; -import { TenancyContext } from "@webiny/api-tenancy/types"; -import { SecurityContext } from "@webiny/api-security/types"; - -export interface TestContext extends BaseContext, SecurityContext, TenancyContext {} diff --git a/packages/api-apw/__tests__/utils/cms.helpers.ts b/packages/api-apw/__tests__/utils/cms.helpers.ts deleted file mode 100644 index cee097ec49c..00000000000 --- a/packages/api-apw/__tests__/utils/cms.helpers.ts +++ /dev/null @@ -1,258 +0,0 @@ -import { setupDefaultWorkflow } from "./helpers"; -import { ApwWorkflowApplications } from "~/types"; -import { CmsGroup, CmsModel } from "@webiny/api-headless-cms/types"; -import { useGraphQlHandler } from "~tests/utils/useGraphQlHandler"; - -const createGroupData = () => { - return { - name: "Group", - slug: "group", - icon: "ico/ico", - description: "description" - }; -}; - -const createModelData = ( - group: CmsGroup -): Pick< - CmsModel, - "name" | "modelId" | "fields" | "layout" | "titleFieldId" | "singularApiName" | "pluralApiName" -> & { - group: string; -} => { - return { - name: "Product", - group: group.id, - modelId: "product", - singularApiName: "Product", - pluralApiName: "Products", - fields: [ - { - id: "name", - storageId: "text@name", - fieldId: "name", - label: "Name", - type: "text", - settings: {}, - validation: [ - { - name: "required", - message: "`name` field is required." - } - ] - }, - { - id: "sku", - storageId: "number@sku", - fieldId: "sku", - label: "SKU", - type: "number", - settings: {}, - validation: [ - { - name: "required", - message: "`sku` field is required." - } - ] - }, - { - id: "description", - storageId: "long-text@description", - fieldId: "description", - label: "Description", - type: "long-text", - settings: {}, - validation: [ - { - name: "required", - message: "`description` field is required." - }, - { - name: "minLength", - settings: { - value: 10 - }, - message: "`description` field min length is 10." - }, - { - name: "maxLength", - settings: { - value: 200 - }, - message: "`description` field max length is 200." - } - ] - }, - { - id: "body", - storageId: "rich-text@body", - fieldId: "body", - label: "Body", - type: "rich-text", - settings: {}, - validation: [ - { - name: "required", - message: "`body` field is required." - } - ] - } - ], - layout: [["name"], ["sku"], ["description"], ["body"]], - titleFieldId: "name" - }; -}; - -const createEntryData = () => { - return { - name: "Webiny product", - sku: 1234567890, - description: ` - This is a description of a Webiny product. - We are doing this to test the Advanced Publishing Workflow on the CMS Entries. - `, - body: [ - { - type: "h1", - content: "Title in the content" - }, - { - type: "p", - content: "Lorem ipsum text which tells us something." - } - ] - }; -}; - -const setupContentModelGroup = async (handler: any) => { - const [response] = await handler.createContentModelGroupMutation({ - data: { - ...createGroupData() - } - }); - expect(response).toMatchObject({ - data: { - createContentModelGroup: { - data: { - ...createGroupData() - }, - error: null - } - } - }); - return response.data.createContentModelGroup.data; -}; - -const setupContentModel = async (handler: any, group: CmsGroup) => { - const [response] = await handler.createContentModelMutation({ - data: { - ...createModelData(group) - } - }); - - expect(response).toMatchObject({ - data: { - createContentModel: { - data: { - ...createModelData(group), - group: { - id: group.id, - name: group.name - } - }, - error: null - } - } - }); - - return response.data.createContentModel.data; -}; - -const setupContentEntry = async (handler: any, model: CmsModel) => { - const data = createEntryData(); - const [response] = await handler.createContentEntryMutation(model, { - data: { - ...data - } - }); - - expect(response).toEqual({ - data: { - createProduct: { - data: { - ...data, - id: expect.any(String), - entryId: expect.any(String), - meta: { - data: { - apw: { - workflowId: expect.any(String), - contentReviewId: null - } - }, - status: "draft", - version: 1 - } - }, - error: null - } - } - }); - return response.data.createProduct.data; -}; - -const setupEntry = async (handler: any) => { - const group = await setupContentModelGroup(handler); - - const model = await setupContentModel(handler, group); - - const entry = await setupContentEntry(handler, model); - - return { - group, - model, - entry: { - id: entry.id, - entryId: entry.entryId, - name: entry.name, - sku: entry.sku, - description: entry.description, - body: entry.body, - meta: entry.meta - } - }; -}; - -interface CreateSetupForEntryContentReviewParams { - cmsHandler: ReturnType; - coreHandler: ReturnType; -} -export const createSetupForEntryContentReview = async ( - params: CreateSetupForEntryContentReviewParams -) => { - const { coreHandler, cmsHandler } = params; - const workflow = await setupDefaultWorkflow(coreHandler, { - app: ApwWorkflowApplications.CMS - }); - - await coreHandler.until( - () => coreHandler.listWorkflowsQuery({}).then(([data]: any) => data), - (response: any) => { - const list = response.data.apw.listWorkflows.data; - return list.length === 1; - }, - { - name: "Wait for workflow entry to be available in list query before creating page." - } - ); - - const { entry, model, group } = await setupEntry(cmsHandler); - - return { - entry, - model, - group, - workflow, - createPage: setupEntry - }; -}; diff --git a/packages/api-apw/__tests__/utils/context.ts b/packages/api-apw/__tests__/utils/context.ts deleted file mode 100644 index 60382d2172f..00000000000 --- a/packages/api-apw/__tests__/utils/context.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { ContextPlugin } from "@webiny/api"; -import { ApwContext } from "~/types"; -import { ApiKey, SecurityIdentity } from "@webiny/api-security/types"; -import { WcpContextObject } from "@webiny/api-wcp/types"; -import { WCP_FEATURE_LABEL } from "@webiny/wcp"; - -const createCanUseFeature = (wcp?: WcpContextObject) => { - const defaultCanUseFeature = wcp?.canUseFeature; - return (featureId: keyof typeof WCP_FEATURE_LABEL) => { - if (featureId === "advancedPublishingWorkflow") { - return true; - } else if (defaultCanUseFeature) { - return defaultCanUseFeature.apply(wcp, [featureId]); - } - return false; - }; -}; - -export const contextCommon = (): ContextPlugin[] => { - return [ - /** - * Setup dummy wcp canUseFeature - */ - new ContextPlugin(async context => { - const canUseFeature = createCanUseFeature(context.wcp); - context.wcp = { - ...(context.wcp || {}), - canUseFeature - }; - }) - ]; -}; - -interface ContextTenantParams { - identity?: SecurityIdentity; -} -export const contextSecurity = ({ identity }: ContextTenantParams): ContextPlugin[] => { - const tenant = { - id: "root", - name: "Root", - parent: null - }; - - return [ - new ContextPlugin(async context => { - context.security.getApiKeyByToken = async (token: string): Promise => { - if (!token || token !== "aToken") { - return null; - } - const apiKey = "a1234567890"; - return { - id: apiKey, - name: apiKey, - tenant: tenant.id, - permissions: identity?.["permissions"] || [], - token, - createdBy: { - id: "test", - displayName: "test", - type: "admin" - }, - description: "test", - createdOn: new Date().toISOString(), - webinyVersion: context.WEBINY_VERSION - }; - }; - }) - ]; -}; diff --git a/packages/api-apw/__tests__/utils/createGraphQlHandler.ts b/packages/api-apw/__tests__/utils/createGraphQlHandler.ts deleted file mode 100644 index 8701ffca6a3..00000000000 --- a/packages/api-apw/__tests__/utils/createGraphQlHandler.ts +++ /dev/null @@ -1,415 +0,0 @@ -import { getIntrospectionQuery } from "graphql"; -import { createWcpContext, createWcpGraphQL } from "@webiny/api-wcp"; -import createGraphQLHandler from "@webiny/handler-graphql"; -import { createI18NContext, createI18NGraphQL } from "@webiny/api-i18n"; -import { createHandler } from "@webiny/handler-aws"; -import { mockLocalesPlugins } from "@webiny/api-i18n/graphql/testing"; -import { SecurityIdentity } from "@webiny/api-security/types"; -import apiKeyAuthentication from "@webiny/api-security/plugins/apiKeyAuthentication"; -import apiKeyAuthorization from "@webiny/api-security/plugins/apiKeyAuthorization"; -import { createPermissions, PermissionsArg, sleep, until } from "./helpers"; -import { - CREATE_WORKFLOW_MUTATION, - DELETE_WORKFLOW_MUTATION, - GET_WORKFLOW_QUERY, - LIST_WORKFLOWS_QUERY, - UPDATE_WORKFLOW_MUTATION -} from "./graphql/workflow"; -import { Plugin, PluginCollection } from "@webiny/plugins/types"; -import { createApwGraphQL, createApwPageBuilderContext } from "~/index"; -import { - CmsParametersPlugin, - createHeadlessCmsContext, - createHeadlessCmsGraphQL -} from "@webiny/api-headless-cms"; -import { createTenancyAndSecurity } from "./tenancySecurity"; -import { - createPageBuilderContext, - createPageBuilderGraphQL -} from "@webiny/api-page-builder/graphql"; -import { CREATE_CATEGORY, GET_CATEGORY } from "./graphql/categories"; -import { CREATE_PAGE, DELETE_PAGE, GET_PAGE, PUBLISH_PAGE, UPDATE_PAGE } from "./graphql/pages"; -import { - CREATE_CONTENT_REVIEW_MUTATION, - DELETE_CONTENT_REVIEW_MUTATION, - DELETE_SCHEDULED_ACTION_MUTATION, - GET_CONTENT_REVIEW_QUERY, - IS_REVIEW_REQUIRED_QUERY, - LIST_CONTENT_REVIEWS_QUERY, - PROVIDE_SIGN_OFF_MUTATION, - PUBLISH_CONTENT_MUTATION, - RETRACT_SIGN_OFF_MUTATION, - UNPUBLISH_CONTENT_MUTATION -} from "./graphql/contentReview"; -import { LOGIN } from "./graphql/login"; -import { GET_REVIEWER_QUERY, LIST_REVIEWERS_QUERY } from "./graphql/reviewer"; -import { - CREATE_COMMENT_MUTATION, - DELETE_COMMENT_MUTATION, - GET_COMMENT_QUERY, - LIST_COMMENTS_QUERY, - UPDATE_COMMENT_MUTATION -} from "./graphql/comment"; -import { - CREATE_CHANGE_REQUEST_MUTATION, - DELETE_CHANGE_REQUEST_MUTATION, - GET_CHANGE_REQUEST_QUERY, - LIST_CHANGES_REQUESTED_QUERY, - UPDATE_CHANGE_REQUEST_MUTATION -} from "./graphql/changeRequest"; -import { contextCommon, contextSecurity } from "./context"; -import { createDummyTransport, createTransport } from "@webiny/api-mailer"; -import { CREATE_CONTENT_MODEL_GROUP_MUTATION } from "~tests/utils/graphql/cms.group"; -import { CREATE_CONTENT_MODEL_MUTATION } from "~tests/utils/graphql/cms.model"; -import { CmsModel, HeadlessCmsStorageOperations } from "@webiny/api-headless-cms/types"; -import { - contentEntryCreateFromMutationFactory, - contentEntryCreateMutationFactory, - contentEntryGetQueryFactory, - contentEntryUpdateMutationFactory -} from "~tests/utils/graphql/cms.entry"; -import { getStorageOps } from "@webiny/project-utils/testing/environment"; -import { PageBuilderStorageOperations } from "@webiny/api-page-builder/types"; -import { ApwScheduleActionStorageOperations } from "~/scheduler/types"; -import { APIGatewayEvent, LambdaContext } from "@webiny/handler-aws/types"; - -export interface GQLHandlerCallableParams { - setupTenancyAndSecurityGraphQL?: boolean; - permissions?: PermissionsArg[]; - identity?: SecurityIdentity; - plugins?: Plugin | Plugin[] | Plugin[][] | PluginCollection; - storageOperationPlugins?: Plugin | Plugin[] | Plugin[][] | PluginCollection; - path: `/cms/manage/${string}` | `/cms/preview/${string}` | `/cms/read/${string}` | "/graphql"; -} - -export interface InvokeParams { - httpMethod?: "POST" | "GET" | "OPTIONS"; - body: { - query: string; - variables?: Record; - }; - headers?: Record; -} - -const validateIsCmsPath = (params: GQLHandlerCallableParams): void => { - if (params.path.match("^/cms/") !== null) { - return; - } - throw new Error(`Path is not a CMS path: ${params.path}`); -}; - -const validateIsCoreGraphQlPath = (params: GQLHandlerCallableParams): void => { - if (params.path.match("^/graphql$") !== null) { - return; - } - throw new Error(`Path is not a Core GraphQL path: ${params.path}`); -}; - -export const createGraphQlHandler = (params: GQLHandlerCallableParams) => { - const { permissions, identity, plugins = [] } = params; - - const apwScheduleStorage = getStorageOps("apwSchedule"); - const cmsStorage = getStorageOps("cms"); - const pageBuilderStorage = getStorageOps("pageBuilder"); - const i18nStorage = getStorageOps("i18n"); - - const handler = createHandler({ - plugins: [ - ...apwScheduleStorage.plugins, - ...cmsStorage.plugins, - createTransport(async () => { - const plugin = await createDummyTransport(); - plugin.name = "dummy-default.test"; - return plugin; - }), - createGraphQLHandler(), - createWcpContext(), - createWcpGraphQL(), - contextCommon(), - ...createTenancyAndSecurity({ - permissions: [...createPermissions(permissions), { name: "pb.*" }], - identity - }), - contextSecurity({ identity }), - apiKeyAuthentication({ identityType: "api-key" }), - apiKeyAuthorization({ identityType: "api-key" }), - createI18NContext(), - createI18NGraphQL(), - /** - * for the page builder we must define the current locale and type - * we can do that via the CmsParametersPlugin - */ - new CmsParametersPlugin(async context => { - const locale = context.i18n.getContentLocale()?.code || "en-US"; - return { - /** - * This will be fixed with type augmenting. - * Currently, request.params.type is unknown. - */ - // @ts-expect-error - type: context.request?.params?.type || "read", - locale - }; - }), - ...i18nStorage.storageOperations, - mockLocalesPlugins(), - createPageBuilderGraphQL(), - createPageBuilderContext({ - storageOperations: pageBuilderStorage.storageOperations - }), - createHeadlessCmsContext({ - storageOperations: cmsStorage.storageOperations - }), - createHeadlessCmsGraphQL(), - createApwPageBuilderContext({ - storageOperations: apwScheduleStorage.storageOperations - }), - createApwGraphQL(), - plugins - ], - debug: false - }); - - const invoke = async ({ httpMethod = "POST", body, headers = {}, ...rest }: InvokeParams) => { - const response = await handler( - { - path: params.path, - httpMethod, - headers: { - ["x-tenant"]: "root", - ["Content-Type"]: "application/json", - ...headers - }, - body: JSON.stringify(body), - ...rest - } as unknown as APIGatewayEvent, - {} as LambdaContext - ); - if (httpMethod === "OPTIONS" && !response.body) { - return [null, response]; - } - // The first element is the response body, and the second is the raw response. - return [JSON.parse(response.body), response]; - }; - - const securityIdentity = { - async login() { - return invoke({ body: { query: LOGIN } }); - } - }; - - const reviewer = { - async getReviewerQuery(variables: Record) { - return invoke({ body: { query: GET_REVIEWER_QUERY, variables } }); - }, - async listReviewersQuery(variables: Record) { - return invoke({ - body: { query: LIST_REVIEWERS_QUERY, variables } - }); - } - }; - - return { - params, - until, - sleep, - handler, - invoke, - securityIdentity, - reviewer, - async introspect() { - return invoke({ body: { query: getIntrospectionQuery() } }); - }, - // Workflow - async getWorkflowQuery(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: GET_WORKFLOW_QUERY, variables } }); - }, - async listWorkflowsQuery(variables: Record = {}) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: LIST_WORKFLOWS_QUERY, variables } }); - }, - async createWorkflowMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: CREATE_WORKFLOW_MUTATION, variables } }); - }, - async updateWorkflowMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: UPDATE_WORKFLOW_MUTATION, variables } }); - }, - async deleteWorkflowMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: DELETE_WORKFLOW_MUTATION, variables } }); - }, - // Comment - async getCommentQuery(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: GET_COMMENT_QUERY, variables } }); - }, - async listCommentsQuery(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: LIST_COMMENTS_QUERY, variables } }); - }, - async createCommentMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: CREATE_COMMENT_MUTATION, variables } }); - }, - async updateCommentMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: UPDATE_COMMENT_MUTATION, variables } }); - }, - async deleteCommentMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: DELETE_COMMENT_MUTATION, variables } }); - }, - // Change Requested - async getChangeRequestQuery(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: GET_CHANGE_REQUEST_QUERY, variables } }); - }, - async listChangeRequestsQuery(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: LIST_CHANGES_REQUESTED_QUERY, variables } }); - }, - async createChangeRequestMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: CREATE_CHANGE_REQUEST_MUTATION, variables } }); - }, - async updateChangeRequestMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: UPDATE_CHANGE_REQUEST_MUTATION, variables } }); - }, - async deleteChangeRequestMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: DELETE_CHANGE_REQUEST_MUTATION, variables } }); - }, - // Categories - async getCategory(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: GET_CATEGORY, variables } }); - }, - async createCategory(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: CREATE_CATEGORY, variables } }); - }, - // Pages - async createPage(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: CREATE_PAGE, variables } }); - }, - async updatePage(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: UPDATE_PAGE, variables } }); - }, - async publishPage(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: PUBLISH_PAGE, variables } }); - }, - async getPageQuery(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: GET_PAGE, variables } }); - }, - async deletePageMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: DELETE_PAGE, variables } }); - }, - // Content Review - async isReviewRequiredQuery(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: IS_REVIEW_REQUIRED_QUERY, variables } }); - }, - async getContentReviewQuery(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: GET_CONTENT_REVIEW_QUERY, variables } }); - }, - async listContentReviewsQuery(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: LIST_CONTENT_REVIEWS_QUERY, variables } }); - }, - async createContentReviewMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: CREATE_CONTENT_REVIEW_MUTATION, variables } }); - }, - async deleteContentReviewMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: DELETE_CONTENT_REVIEW_MUTATION, variables } }); - }, - async provideSignOffMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: PROVIDE_SIGN_OFF_MUTATION, variables } }); - }, - async retractSignOffMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: RETRACT_SIGN_OFF_MUTATION, variables } }); - }, - async publishContentMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: PUBLISH_CONTENT_MUTATION, variables } }); - }, - async unpublishContentMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: UNPUBLISH_CONTENT_MUTATION, variables } }); - }, - async deleteScheduledActionMutation(variables: Record) { - validateIsCoreGraphQlPath(params); - return invoke({ body: { query: DELETE_SCHEDULED_ACTION_MUTATION, variables } }); - }, - /** - * Headless CMS - */ - async createContentModelGroupMutation(variables: Record) { - validateIsCmsPath(params); - return invoke({ - body: { - query: CREATE_CONTENT_MODEL_GROUP_MUTATION, - variables - } - }); - }, - async createContentModelMutation(variables: Record) { - validateIsCmsPath(params); - return invoke({ - body: { - query: CREATE_CONTENT_MODEL_MUTATION, - variables - } - }); - }, - async createContentEntryMutation(model: CmsModel, variables: Record) { - validateIsCmsPath(params); - return invoke({ - body: { - query: contentEntryCreateMutationFactory(model), - variables - } - }); - }, - async updateContentEntryMutation(model: CmsModel, variables: Record) { - validateIsCmsPath(params); - return invoke({ - body: { - query: contentEntryUpdateMutationFactory(model), - variables - } - }); - }, - async createContentEntryFromMutation(model: CmsModel, variables: Record) { - validateIsCmsPath(params); - return invoke({ - body: { - query: contentEntryCreateFromMutationFactory(model), - variables - } - }); - }, - async getContentEntryQuery(model: CmsModel, variables: Record) { - validateIsCmsPath(params); - return invoke({ - body: { - query: contentEntryGetQueryFactory(model), - variables - } - }); - } - }; -}; diff --git a/packages/api-apw/__tests__/utils/defaultIdentity.ts b/packages/api-apw/__tests__/utils/defaultIdentity.ts deleted file mode 100644 index f5774542abb..00000000000 --- a/packages/api-apw/__tests__/utils/defaultIdentity.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { GraphQLSchemaPlugin } from "@webiny/handler-graphql/plugins"; -import { SecurityContext } from "@webiny/api-security/types"; -import { GenericRecord } from "@webiny/api/types"; - -export const defaultIdentity = () => { - return new GraphQLSchemaPlugin({ - typeDefs: /* GraphQL */ ` - type Admin implements SecurityIdentity { - id: ID! - type: String! - displayName: String! - permissions: [JSON!]! - tenant: Tenant - currentTenant: Tenant - defaultTenant: Tenant - } - `, - resolvers: { - Admin: { - __isTypeOf(obj: GenericRecord) { - return obj.type === "admin"; - } - } - } - }); -}; diff --git a/packages/api-apw/__tests__/utils/graphql/categories.ts b/packages/api-apw/__tests__/utils/graphql/categories.ts deleted file mode 100644 index c418faa8fd0..00000000000 --- a/packages/api-apw/__tests__/utils/graphql/categories.ts +++ /dev/null @@ -1,44 +0,0 @@ -export const DATA_FIELD = /* GraphQL */ ` - { - slug - url - name - layout - createdOn - createdBy { - id - displayName - type - } - } -`; - -export const ERROR_FIELD = /* GraphQL */ ` - { - code - data - message - } -`; - -export const GET_CATEGORY = /* GraphQL */ ` - query GetCategory($slug: String!) { - pageBuilder { - getCategory(slug: $slug) { - data ${DATA_FIELD} - error ${ERROR_FIELD} - } - } - } -`; - -export const CREATE_CATEGORY = /* GraphQL */ ` - mutation CreateCategory($data: PbCategoryInput!) { - pageBuilder { - createCategory(data: $data) { - data ${DATA_FIELD} - error ${ERROR_FIELD} - } - } - } -`; diff --git a/packages/api-apw/__tests__/utils/graphql/changeRequest.ts b/packages/api-apw/__tests__/utils/graphql/changeRequest.ts deleted file mode 100644 index 61f73a68754..00000000000 --- a/packages/api-apw/__tests__/utils/graphql/changeRequest.ts +++ /dev/null @@ -1,94 +0,0 @@ -const ERROR_FIELDS = `{ - message - code - data -}`; - -const getDataFields = (fields = "") => `{ - id - createdOn - savedOn - createdBy { - id - displayName - type - } - step - body - title - media - resolved - ${fields} -}`; - -export const GET_CHANGE_REQUEST_QUERY = /* GraphQL */ ` - query GetChangeRequest($id: ID!) { - apw { - getChangeRequest(id: $id) { - data ${getDataFields()} - error ${ERROR_FIELDS} - } - } - } -`; - -export const LIST_CHANGES_REQUESTED_QUERY = /* GraphQL */ ` - query ListChangeRequests( - $where: ApwListChangeRequestWhereInput, - $limit: Int, - $after: String, - $sort: [ApwListChangeRequestSort!], - $search: ApwListChangeRequestSearchInput - ) { - apw { - listChangeRequests( - where: $where, - limit: $limit, - after: $after, - sort: $sort, - search: $search - ) { - data ${getDataFields()} - error ${ERROR_FIELDS} - meta { - hasMoreItems - totalCount - cursor - } - } - } - } -`; - -export const CREATE_CHANGE_REQUEST_MUTATION = /* GraphQL */ ` - mutation CreateChangeRequestMutation($data: ApwCreateChangeRequestInput!) { - apw { - createChangeRequest(data: $data) { - data ${getDataFields()} - error ${ERROR_FIELDS} - } - } - } -`; - -export const UPDATE_CHANGE_REQUEST_MUTATION = /* GraphQL */ ` - mutation UpdateChangeRequestMutation($id: ID!, $data: ApwUpdateChangeRequestInput!) { - apw { - updateChangeRequest(id: $id, data: $data) { - data ${getDataFields()} - error ${ERROR_FIELDS} - } - } - } -`; - -export const DELETE_CHANGE_REQUEST_MUTATION = /* GraphQL */ ` - mutation DeleteChangeRequestMutation($id: ID!) { - apw { - deleteChangeRequest(id: $id) { - data - error ${ERROR_FIELDS} - } - } - } -`; diff --git a/packages/api-apw/__tests__/utils/graphql/cms.entry.ts b/packages/api-apw/__tests__/utils/graphql/cms.entry.ts deleted file mode 100644 index 4970865b98a..00000000000 --- a/packages/api-apw/__tests__/utils/graphql/cms.entry.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { CmsModel } from "@webiny/api-headless-cms/types"; -import camelCase from "lodash/camelCase"; -import upperFirst from "lodash/upperFirst"; - -const createModelTypeName = (model: CmsModel): string => { - return upperFirst(camelCase(model.modelId)); -}; - -const createErrorFields = (): string => { - return /* GraphQL */ ` - error { - message - data - code - } - `; -}; - -const createContentEntryFields = (model: CmsModel): string => { - return ["id", "entryId", "meta { data version status }"] - .concat(model.fields.map(field => field.fieldId)) - .join("\n"); -}; - -export const contentEntryCreateMutationFactory = (model: CmsModel) => { - const modelTypeName = createModelTypeName(model); - - return /* GraphQL */ ` - mutation CreateContentEntry${modelTypeName}Mutation($data: ${modelTypeName}Input!) { - create${modelTypeName}(data: $data) { - data { - ${createContentEntryFields(model)} - } - ${createErrorFields()} - } - } - `; -}; - -export const contentEntryUpdateMutationFactory = (model: CmsModel) => { - const modelTypeName = createModelTypeName(model); - - return /* GraphQL */ ` - mutation UpdateContentEntry${modelTypeName}Mutation($revision: ID!, $data: ${modelTypeName}Input!) { - update${modelTypeName}(revision: $revision, data: $data) { - data { - ${createContentEntryFields(model)} - } - ${createErrorFields()} - } - } - `; -}; - -export const contentEntryCreateFromMutationFactory = (model: CmsModel) => { - const modelTypeName = createModelTypeName(model); - - return /* GraphQL */ ` - mutation CreateFromContentEntry${modelTypeName}Mutation($revision: ID!, $data: ${modelTypeName}Input) { - create${modelTypeName}From(revision: $revision, data: $data) { - data { - ${createContentEntryFields(model)} - } - ${createErrorFields()} - } - } - `; -}; - -export const contentEntryGetQueryFactory = (model: CmsModel) => { - const modelTypeName = createModelTypeName(model); - - return /* GraphQL */ ` - query GetContentEntry${modelTypeName}Query($revision: ID!) { - get${modelTypeName}(revision: $revision) { - data { - ${createContentEntryFields(model)} - } - ${createErrorFields()} - } - } - `; -}; diff --git a/packages/api-apw/__tests__/utils/graphql/cms.group.ts b/packages/api-apw/__tests__/utils/graphql/cms.group.ts deleted file mode 100644 index 4323ead4fc0..00000000000 --- a/packages/api-apw/__tests__/utils/graphql/cms.group.ts +++ /dev/null @@ -1,32 +0,0 @@ -const DATA_FIELD = /* GraphQL*/ ` - { - id - name - slug - description - icon - createdOn - savedOn - createdBy { - id - displayName - type - } - } -`; -const ERROR_FIELD = /* GraphQL */ ` - { - code - data - message - } -`; - -export const CREATE_CONTENT_MODEL_GROUP_MUTATION = /* GraphQL */ ` - mutation CreateContentModelGroupMutation($data: CmsContentModelGroupInput!) { - createContentModelGroup(data: $data) { - data ${DATA_FIELD} - error ${ERROR_FIELD} - } - } -`; diff --git a/packages/api-apw/__tests__/utils/graphql/cms.model.ts b/packages/api-apw/__tests__/utils/graphql/cms.model.ts deleted file mode 100644 index 5c9f4ba954d..00000000000 --- a/packages/api-apw/__tests__/utils/graphql/cms.model.ts +++ /dev/null @@ -1,70 +0,0 @@ -const DATA_FIELD = /* GraphQL*/ ` - { - modelId - name - description - singularApiName - pluralApiName - group { - id - name - } - layout - titleFieldId - fields { - id - label - helpText - placeholderText - storageId - fieldId - type - multipleValues - predefinedValues { - enabled - values { - label - value - } - } - renderer { - name - } - validation { - name - message - settings - } - listValidation { - name - message - settings - } - settings - } - plugin - createdOn - savedOn - createdBy { - id - displayName - type - } - } -`; -const ERROR_FIELD = /* GraphQL */ ` - { - code - data - message - } -`; - -export const CREATE_CONTENT_MODEL_MUTATION = /* GraphQL */ ` - mutation CreateContentModelMutation($data: CmsContentModelCreateInput!) { - createContentModel(data: $data) { - data ${DATA_FIELD} - error ${ERROR_FIELD} - } - } -`; diff --git a/packages/api-apw/__tests__/utils/graphql/comment.ts b/packages/api-apw/__tests__/utils/graphql/comment.ts deleted file mode 100644 index 02ff4ba185d..00000000000 --- a/packages/api-apw/__tests__/utils/graphql/comment.ts +++ /dev/null @@ -1,90 +0,0 @@ -const ERROR_FIELDS = `{ - message - code - data -}`; - -const getDataFields = (fields = "") => `{ - id - createdOn - savedOn - createdBy { - id - displayName - type - } - body - changeRequest - media - ${fields} -}`; - -export const GET_COMMENT_QUERY = /* GraphQL */ ` - query GetComment($id: ID!) { - apw { - getComment(id: $id) { - data ${getDataFields()} - error ${ERROR_FIELDS} - } - } - } -`; - -export const LIST_COMMENTS_QUERY = /* GraphQL */ ` - query ListComments( - $where: ApwListCommentsWhereInput, - $limit: Int, - $after: String, - $sort: [ApwListCommentsSort!] - ) { - apw { - listComments( - where: $where, - limit: $limit, - after: $after, - sort: $sort - ) { - data ${getDataFields()} - error ${ERROR_FIELDS} - meta { - hasMoreItems - totalCount - cursor - } - } - } - } -`; - -export const CREATE_COMMENT_MUTATION = /* GraphQL */ ` - mutation CreateCommentMutation($data: ApwCreateCommentInput!) { - apw { - createComment(data: $data) { - data ${getDataFields()} - error ${ERROR_FIELDS} - } - } - } -`; - -export const UPDATE_COMMENT_MUTATION = /* GraphQL */ ` - mutation UpdateCommentMutation($id: ID!, $data: ApwUpdateCommentInput!) { - apw { - updateComment(id: $id, data: $data) { - data ${getDataFields()} - error ${ERROR_FIELDS} - } - } - } -`; - -export const DELETE_COMMENT_MUTATION = /* GraphQL */ ` - mutation DeleteCommentMutation($id: ID!) { - apw { - deleteComment(id: $id) { - data - error ${ERROR_FIELDS} - } - } - } -`; diff --git a/packages/api-apw/__tests__/utils/graphql/contentReview.ts b/packages/api-apw/__tests__/utils/graphql/contentReview.ts deleted file mode 100644 index e72ddcca139..00000000000 --- a/packages/api-apw/__tests__/utils/graphql/contentReview.ts +++ /dev/null @@ -1,182 +0,0 @@ -const ERROR_FIELDS = `{ - message - code - data -}`; - -const getDataFields = (fields = "") => `{ - id - createdOn - savedOn - createdBy { - id - displayName - type - } - title - reviewStatus - steps { - status - id - pendingChangeRequests - signOffProvidedOn - signOffProvidedBy { - id - displayName - } - } - content { - type - id - version - settings { - modelId - } - publishedOn - publishedBy { - id - displayName - type - } - scheduledOn - scheduledBy { - id - displayName - type - } - } - ${fields} -}`; - -export const IS_REVIEW_REQUIRED_QUERY = /* GraphQL */ ` - query IsReviewRequired($data: ApwContentReviewContentInput!) { - apw { - isReviewRequired(data: $data) { - data { - isReviewRequired - contentReviewId - } - error ${ERROR_FIELDS} - } - } - } -`; - -export const GET_CONTENT_REVIEW_QUERY = /* GraphQL */ ` - query GetContentReview($id: ID!) { - apw { - getContentReview(id: $id) { - data ${getDataFields()} - error ${ERROR_FIELDS} - } - } - } -`; - -export const LIST_CONTENT_REVIEWS_QUERY = /* GraphQL */ ` - query ListContentReviews( - $where: ApwListContentReviewsWhereInput, - $limit: Int, - $after: String, - $sort: [ApwListContentReviewsSort!] - ) { - apw { - listContentReviews( - where: $where, - limit: $limit, - after: $after, - sort: $sort - ) { - data ${getDataFields(` - activeStep { title } - totalComments - latestCommentId - reviewers - `)} - error ${ERROR_FIELDS} - meta { - hasMoreItems - totalCount - cursor - } - } - } - } -`; - -export const CREATE_CONTENT_REVIEW_MUTATION = /* GraphQL */ ` - mutation CreateContentReviewMutation($data: ApwCreateContentReviewInput!) { - apw { - createContentReview(data: $data) { - data ${getDataFields()} - error ${ERROR_FIELDS} - } - } - } -`; - -export const DELETE_CONTENT_REVIEW_MUTATION = /* GraphQL */ ` - mutation DeleteContentReviewMutation($id: ID!) { - apw { - deleteContentReview(id: $id) { - data - error ${ERROR_FIELDS} - } - } - } -`; - -export const PROVIDE_SIGN_OFF_MUTATION = /* GraphQL */ ` - mutation ProvideSignOffMutation($id: ID!, $step: String!) { - apw { - provideSignOff(id: $id, step: $step) { - data - error ${ERROR_FIELDS} - } - } - } -`; - -export const RETRACT_SIGN_OFF_MUTATION = /* GraphQL */ ` - mutation RetractSignOffMutation($id: ID!, $step: String!) { - apw { - retractSignOff(id: $id, step: $step) { - data - error ${ERROR_FIELDS} - } - } - } -`; - -export const PUBLISH_CONTENT_MUTATION = /* GraphQL */ ` - mutation PublishContentMutation($id: ID!, $datetime: String) { - apw { - publishContent(id: $id, datetime: $datetime) { - data - error ${ERROR_FIELDS} - } - } - } -`; - -export const UNPUBLISH_CONTENT_MUTATION = /* GraphQL */ ` - mutation UnPublishContentMutation($id: ID!, $datetime: String) { - apw { - unpublishContent(id: $id, datetime: $datetime) { - data - error ${ERROR_FIELDS} - } - } - } -`; - -export const DELETE_SCHEDULED_ACTION_MUTATION = /* GraphQL */ ` - mutation DeleteScheduledActionMutation($id: ID!) { - apw { - deleteScheduledAction(id: $id) { - data - error ${ERROR_FIELDS} - } - } - } -`; diff --git a/packages/api-apw/__tests__/utils/graphql/login.ts b/packages/api-apw/__tests__/utils/graphql/login.ts deleted file mode 100644 index 07c7f508665..00000000000 --- a/packages/api-apw/__tests__/utils/graphql/login.ts +++ /dev/null @@ -1,23 +0,0 @@ -const ERROR_FIELD = /* GraphQL */ ` - { - code - data - message - } -`; - -export const LOGIN = /* GraphQL */ ` - mutation Login { - security { - login { - data { - id - displayName - type - permissions - } - error ${ERROR_FIELD} - } - } - } -`; diff --git a/packages/api-apw/__tests__/utils/graphql/pages.ts b/packages/api-apw/__tests__/utils/graphql/pages.ts deleted file mode 100644 index 04890cddb4d..00000000000 --- a/packages/api-apw/__tests__/utils/graphql/pages.ts +++ /dev/null @@ -1,223 +0,0 @@ -export const DATA_FIELD = /* GraphQL */ ` - { - id - pid - editor - category { - slug - } - version - title - path - url - content - savedOn - status - locked - publishedOn - locked - revisions { - id - status - locked - version - } - settings { - apw { - workflowId - contentReviewId - } - general { - snippet - tags - layout - image { - id - src - } - } - social { - meta { - property - content - } - title - description - image { - id - src - } - } - seo { - title - description - meta { - name - content - } - } - } - createdFrom - createdOn - createdBy { - id - displayName - type - } - } -`; - -const LIST_DATA_FIELD = /* GraphQL */ ` - { - id - pid - editor - category { - slug - } - status - title - snippet - tags - images { - general { - id - src - } - } - path - url - status - locked - publishedOn - savedOn - createdFrom - createdOn - createdBy { - id - displayName - type - } - settings - } -`; - -export const ERROR_FIELD = /* GraphQL */ ` - { - code - data - message - } -`; - -export const CREATE_PAGE = /* GraphQL */ ` - mutation CreatePage($from: ID, $category: String) { - pageBuilder { - createPage(from: $from, category: $category) { - data ${DATA_FIELD} - error ${ERROR_FIELD} - } - } - } -`; - -export const UPDATE_PAGE = /* GraphQL */ ` - mutation UpdatePage($id: ID!, $data: PbUpdatePageInput!) { - pageBuilder { - updatePage(id: $id, data: $data) { - data ${DATA_FIELD} - error ${ERROR_FIELD} - } - } - } -`; - -export const PUBLISH_PAGE = /* GraphQL */ ` - mutation PublishPage($id: ID!) { - pageBuilder { - publishPage(id: $id) { - data ${DATA_FIELD} - error ${ERROR_FIELD} - } - } - } -`; - -export const UNPUBLISH_PAGE = /* GraphQL */ ` - mutation UnpublishPage($id: ID!) { - pageBuilder { - unpublishPage(id: $id) { - data ${DATA_FIELD} - error ${ERROR_FIELD} - } - } - } -`; - -export const LIST_PAGES = /* GraphQL */ ` - query ListPages($where: PbListPagesWhereInput, $limit: Int, $after: String, $sort: [PbListPagesSort!], $search: PbListPagesSearchInput) { - pageBuilder { - listPages(where: $where, limit: $limit, after: $after, sort: $sort, search: $search) { - data ${LIST_DATA_FIELD} - meta { - cursor - hasMoreItems - totalCount - } - error ${ERROR_FIELD} - } - } - } -`; - -export const LIST_PUBLISHED_PAGES = /* GraphQL */ ` - query ListPublishedPages($where: PbListPublishedPagesWhereInput, $limit: Int, $after: String, $sort: [PbListPagesSort!], $exclude: [String]) { - pageBuilder { - listPublishedPages(where: $where, limit: $limit, after: $after, sort: $sort, exclude: $exclude) { - data ${LIST_DATA_FIELD} - error ${ERROR_FIELD} - meta { - cursor - hasMoreItems - totalCount - } - } - } - } -`; - -export const GET_PAGE = /* GraphQL */ ` - query GetPage($id: ID!) { - pageBuilder { - getPage(id: $id) { - data ${DATA_FIELD} - error ${ERROR_FIELD} - } - } - } -`; - -export const GET_PUBLISHED_PAGE = /* GraphQL */ ` - query GetPublishedPage($id: ID, $path: String, $preview: Boolean, $returnErrorPage: Boolean, $returnNotFoundPage: Boolean) { - pageBuilder { - getPublishedPage(id: $id, path: $path, preview: $preview, returnErrorPage: $returnErrorPage, returnNotFoundPage: $returnNotFoundPage) { - data ${DATA_FIELD} - error ${ERROR_FIELD} - } - } - } -`; - -export const DELETE_PAGE = /* GraphQL */ ` - mutation DeletePage($id: ID!) { - pageBuilder { - deletePage(id: $id) { - data { - page ${DATA_FIELD} - latestPage ${DATA_FIELD} - } - error ${ERROR_FIELD} - } - } - } -`; diff --git a/packages/api-apw/__tests__/utils/graphql/reviewer.ts b/packages/api-apw/__tests__/utils/graphql/reviewer.ts deleted file mode 100644 index f30cc9ce302..00000000000 --- a/packages/api-apw/__tests__/utils/graphql/reviewer.ts +++ /dev/null @@ -1,60 +0,0 @@ -const ERROR_FIELDS = `{ - message - code - data -}`; - -const getDataFields = (fields = "") => `{ - id - createdOn - savedOn - createdBy { - id - displayName - type - } - identityId - displayName - type - email - ${fields} -}`; - -export const GET_REVIEWER_QUERY = /* GraphQL */ ` - query GetReviewer($id: ID!) { - apw { - getReviewer(id: $id) { - data ${getDataFields()} - error ${ERROR_FIELDS} - } - } - } -`; - -export const LIST_REVIEWERS_QUERY = /* GraphQL */ ` - query ListReviewers( - $where: ApwListReviewersWhereInput, - $limit: Int, - $after: String, - $sort: [ApwListReviewersSort!], - $search: ApwListReviewersSearchInput - ) { - apw { - listReviewers( - where: $where, - limit: $limit, - after: $after, - sort: $sort, - search: $search - ) { - data ${getDataFields()} - error ${ERROR_FIELDS} - meta { - hasMoreItems - totalCount - cursor - } - } - } - } -`; diff --git a/packages/api-apw/__tests__/utils/graphql/workflow.ts b/packages/api-apw/__tests__/utils/graphql/workflow.ts deleted file mode 100644 index 55b5e7299fe..00000000000 --- a/packages/api-apw/__tests__/utils/graphql/workflow.ts +++ /dev/null @@ -1,101 +0,0 @@ -const ERROR_FIELDS = `{ - message - code - data -}`; - -const getDataFields = (fields = "") => `{ - id - createdOn - savedOn - createdBy { - id - displayName - type - } - app - title - scope { - type - data - } - steps { - title - id - type - reviewers - } - ${fields} -}`; - -export const GET_WORKFLOW_QUERY = /* GraphQL */ ` - query GetWorkflow($id: ID!) { - apw { - getWorkflow(id: $id) { - data ${getDataFields()} - error ${ERROR_FIELDS} - } - } - } -`; - -export const LIST_WORKFLOWS_QUERY = /* GraphQL */ ` - query ListWorkflows( - $where: ApwListWorkflowsWhereInput, - $limit: Int, - $after: String, - $sort: [ApwListWorkflowsSort!], - $search: ApwListWorkflowsSearchInput - ) { - apw { - listWorkflows( - where: $where, - limit: $limit, - after: $after, - sort: $sort, - search: $search - ) { - data ${getDataFields()} - error ${ERROR_FIELDS} - meta { - hasMoreItems - totalCount - cursor - } - } - } - } -`; - -export const CREATE_WORKFLOW_MUTATION = /* GraphQL */ ` - mutation CreateWorkflowMutation($data: ApwCreateWorkflowInput!) { - apw { - createWorkflow(data: $data) { - data ${getDataFields()} - error ${ERROR_FIELDS} - } - } - } -`; - -export const UPDATE_WORKFLOW_MUTATION = /* GraphQL */ ` - mutation UpdateWorkflowMutation($id: ID!, $data: ApwUpdateWorkflowInput!) { - apw { - updateWorkflow(id: $id, data: $data) { - data ${getDataFields()} - error ${ERROR_FIELDS} - } - } - } -`; - -export const DELETE_WORKFLOW_MUTATION = /* GraphQL */ ` - mutation DeleteWorkflowMutation($id: ID!) { - apw { - deleteWorkflow(id: $id) { - data - error ${ERROR_FIELDS} - } - } - } -`; diff --git a/packages/api-apw/__tests__/utils/helpers.ts b/packages/api-apw/__tests__/utils/helpers.ts deleted file mode 100644 index 2eb447d6dc1..00000000000 --- a/packages/api-apw/__tests__/utils/helpers.ts +++ /dev/null @@ -1,178 +0,0 @@ -import { SecurityIdentity } from "@webiny/api-security/types"; -import workflowMocks, { CreateWorkflowParams } from "../graphql/mocks/workflows"; -import { Category } from "@webiny/api-page-builder/types"; -import { ApwWorkflow, ApwWorkflowApplications } from "~/types"; - -export { until } from "@webiny/project-utils/testing/helpers/until"; -export { sleep } from "@webiny/project-utils/testing/helpers/sleep"; - -export interface PermissionsArg { - name: string; - locales?: string[]; - rwd?: string; - pw?: string | null; - own?: boolean; -} - -export const identity = { - id: "12345678", - displayName: "John Doe", - type: "admin", - email: "testing@webiny.com" -}; - -const getSecurityIdentity = () => { - return identity; -}; - -export const createPermissions = (permissions?: PermissionsArg[]): PermissionsArg[] => { - if (permissions) { - return permissions; - } - return [ - { - name: "cms.settings" - }, - { - name: "cms.contentModel", - rwd: "rwd" - }, - { - name: "cms.contentModelGroup", - rwd: "rwd" - }, - { - name: "cms.contentEntry", - rwd: "rwd", - pw: "rcpu" - }, - { - name: "cms.endpoint.read" - }, - { - name: "cms.endpoint.manage" - }, - { - name: "cms.endpoint.preview" - }, - { - name: "content.i18n", - locales: ["en-US"] - }, - { - name: "apw.publishingWorkflows" - } - ]; -}; - -export const createIdentity = (identity?: SecurityIdentity) => { - if (!identity) { - return getSecurityIdentity(); - } - return identity; -}; - -interface SetupCategoryParams { - getCategory: ({ slug }: { slug: string }) => Promise; - createCategory: ({ data }: { data: Partial }) => Promise; -} - -export const setupCategory = async ({ getCategory, createCategory }: SetupCategoryParams) => { - const [getCategoryResponse] = await getCategory({ slug: "static" }); - const category = getCategoryResponse.data.pageBuilder.getCategory.data; - if (category) { - return category; - } - const [createCategoryResponse] = await createCategory({ - data: { - name: "Static", - url: "/static/", - slug: "static", - layout: "static" - } - }); - return createCategoryResponse.data.pageBuilder.createCategory.data; -}; - -const setupReviewer = async (gqlHandler: any) => { - await gqlHandler.securityIdentity.login(); - - await gqlHandler.until( - () => gqlHandler.reviewer.listReviewersQuery({}).then(([data]: any[]) => data), - (response: any) => { - return response.data.apw.listReviewers.data.length > 0; - }, - { - name: "Wait for listReviewer query" - } - ); - - const [listReviewersResponse] = await gqlHandler.reviewer.listReviewersQuery({}); - const [reviewer] = listReviewersResponse.data.apw.listReviewers.data; - return reviewer; -}; - -const setupPage = async (gqlHandler: any) => { - const category = await setupCategory({ - getCategory: gqlHandler.getCategory, - createCategory: gqlHandler.createCategory - }); - - const [createPageResponse] = await gqlHandler.createPage({ category: category.slug }); - return createPageResponse.data.pageBuilder.createPage.data; -}; - -export const setupDefaultWorkflow = async ( - gqlHandler: any, - workflowParams: CreateWorkflowParams -): Promise => { - const reviewer = await setupReviewer(gqlHandler); - const [createWorkflowResponse] = await gqlHandler.createWorkflowMutation({ - data: workflowMocks.createWorkflowWithThreeSteps(workflowParams, [reviewer]) - }); - return createWorkflowResponse.data.apw.createWorkflow.data; -}; - -export const createSetupForPageContentReview = async (gqlHandler: any) => { - const workflow = await setupDefaultWorkflow(gqlHandler, { - app: ApwWorkflowApplications.PB - }); - - await gqlHandler.until( - () => gqlHandler.listWorkflowsQuery({}).then(([data]: any) => data), - (response: any) => { - const list = response.data.apw.listWorkflows.data; - return list.length === 1; - }, - { - name: "Wait for workflow entry to be available in list query before creating page." - } - ); - - const page = await setupPage(gqlHandler); - - return { - page, - workflow, - createPage: setupPage - }; -}; - -export const createPageContentReviewSetup = async (gqlHandler: any) => { - const { page } = await createSetupForPageContentReview(gqlHandler); - /* - Create a content review entry. - */ - const [createContentReviewResponse] = await gqlHandler.createContentReviewMutation({ - data: { - content: { - id: page.id, - type: "page" - } - } - }); - const contentReview = createContentReviewResponse.data.apw.createContentReview.data; - return { - contentReview - }; -}; diff --git a/packages/api-apw/__tests__/utils/tenancySecurity.ts b/packages/api-apw/__tests__/utils/tenancySecurity.ts deleted file mode 100644 index d15204803b4..00000000000 --- a/packages/api-apw/__tests__/utils/tenancySecurity.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { createTenancyContext, createTenancyGraphQL } from "@webiny/api-tenancy"; -import { createSecurityContext, createSecurityGraphQL } from "@webiny/api-security"; -import { - SecurityIdentity, - SecurityPermission, - SecurityStorageOperations -} from "@webiny/api-security/types"; -import { ContextPlugin } from "@webiny/api"; -import { BeforeHandlerPlugin } from "@webiny/handler"; -import { TestContext } from "../types"; -import { createPermissions } from "./helpers"; -import { getStorageOps } from "@webiny/project-utils/testing/environment"; -import { TenancyStorageOperations } from "@webiny/api-tenancy/types"; - -interface Config { - permissions: SecurityPermission[]; - identity?: SecurityIdentity | null; -} - -export const createTenancyAndSecurity = ({ permissions, identity }: Config) => { - const securityStorage = getStorageOps("security"); - const tenancyStorage = getStorageOps("tenancy"); - return [ - createTenancyContext({ storageOperations: tenancyStorage.storageOperations }), - createTenancyGraphQL(), - createSecurityContext({ - storageOperations: securityStorage.storageOperations - }), - createSecurityGraphQL(), - new ContextPlugin(context => { - context.tenancy.setCurrentTenant({ - id: "root", - name: "Root", - parent: null, - description: "", - status: "unknown", - settings: { - domains: [] - }, - tags: [], - webinyVersion: context.WEBINY_VERSION, - createdOn: new Date().toISOString(), - savedOn: new Date().toISOString() - }); - - context.security.addAuthenticator(async () => { - const base = identity || { - id: "12345678", - type: "admin", - displayName: "John Doe", - email: "testing@webiny.com" - }; - return { - ...base, - permissions: createPermissions().concat({ name: "pb.*" }) - }; - }); - - context.security.addAuthorizer(async () => { - const { headers = {} } = context.request || {}; - if (headers["authorization"]) { - return null; - } - - return permissions || [{ name: "*" }]; - }); - }), - new BeforeHandlerPlugin(context => { - const { headers = {} } = context.request || {}; - if (headers["authorization"]) { - return context.security.authenticate(headers["authorization"]); - } - - return context.security.authenticate(""); - }) - ].filter(Boolean); -}; diff --git a/packages/api-apw/__tests__/utils/useGraphQlHandler.ts b/packages/api-apw/__tests__/utils/useGraphQlHandler.ts deleted file mode 100644 index a5fdf99f3ee..00000000000 --- a/packages/api-apw/__tests__/utils/useGraphQlHandler.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createGraphQlHandler, GQLHandlerCallableParams } from "~tests/utils/createGraphQlHandler"; - -export const useGraphQlHandler = (params: GQLHandlerCallableParams) => { - return createGraphQlHandler(params); -}; diff --git a/packages/api-apw/jest.setup.js b/packages/api-apw/jest.setup.js deleted file mode 100644 index 564182da84a..00000000000 --- a/packages/api-apw/jest.setup.js +++ /dev/null @@ -1,14 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-apw", "storage-operations"], - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-page-builder", "storage-operations"], - ["@webiny/api-file-manager", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-audit-logs/src/app/index.ts b/packages/api-audit-logs/src/app/index.ts index 8df1a6eba0e..f65091028d4 100644 --- a/packages/api-audit-logs/src/app/index.ts +++ b/packages/api-audit-logs/src/app/index.ts @@ -15,9 +15,6 @@ const setupContext = async (context: AuditLogsAcoContext): Promise => { export const createAcoAuditLogsContext = () => { const plugin = new ContextPlugin(async context => { if (!context.aco) { - console.log( - `There is no ACO initialized so we will not initialize the Audit Logs ACO.` - ); return; } await setupContext(context); diff --git a/packages/api-authentication-cognito/__tests__/getIdentity.test.ts b/packages/api-authentication-cognito/__tests__/getIdentity.test.ts index 5d5ebffe1b0..1bdcdd9fa4b 100644 --- a/packages/api-authentication-cognito/__tests__/getIdentity.test.ts +++ b/packages/api-authentication-cognito/__tests__/getIdentity.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { getIdentity } from "~/index"; describe("getIdentity Test", () => { diff --git a/packages/api-authentication-cognito/jest.config.js b/packages/api-authentication-cognito/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/api-authentication-cognito/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/api-authentication-cognito/vitest.config.ts b/packages/api-authentication-cognito/vitest.config.ts new file mode 100644 index 00000000000..bb4c9279b9d --- /dev/null +++ b/packages/api-authentication-cognito/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname }); +}; diff --git a/packages/api-authentication/__tests__/authenticateUsingHttpHeader.test.ts b/packages/api-authentication/__tests__/authenticateUsingHttpHeader.test.ts index da8a594c69d..ed84c80406a 100644 --- a/packages/api-authentication/__tests__/authenticateUsingHttpHeader.test.ts +++ b/packages/api-authentication/__tests__/authenticateUsingHttpHeader.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { AuthenticationContext, Authenticator, Identity } from "~/types"; import { createAuthentication } from "~/createAuthentication"; import { authenticateUsingHttpHeader } from "~/authenticateUsingHttpHeader"; diff --git a/packages/api-authentication/__tests__/createAuthentication.test.ts b/packages/api-authentication/__tests__/createAuthentication.test.ts index c8edea40efb..95b00702d83 100644 --- a/packages/api-authentication/__tests__/createAuthentication.test.ts +++ b/packages/api-authentication/__tests__/createAuthentication.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { createAuthentication } from "~/createAuthentication"; import { Authenticator, Identity } from "~/types"; diff --git a/packages/api-authentication/jest.config.js b/packages/api-authentication/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/api-authentication/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/api-authentication/tsconfig.json b/packages/api-authentication/tsconfig.json index e2dee2e0cd5..69a78854899 100644 --- a/packages/api-authentication/tsconfig.json +++ b/packages/api-authentication/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [{ "path": "../api" }, { "path": "../handler" }], "compilerOptions": { "rootDirs": ["./src", "./__tests__"], diff --git a/packages/api-authentication/vitest.config.ts b/packages/api-authentication/vitest.config.ts new file mode 100644 index 00000000000..bb4c9279b9d --- /dev/null +++ b/packages/api-authentication/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname }); +}; diff --git a/packages/api-dynamodb-to-elasticsearch/__tests__/Operations.test.ts b/packages/api-dynamodb-to-elasticsearch/__tests__/Operations.test.ts index 4b478e13701..ec8eb9dfc67 100644 --- a/packages/api-dynamodb-to-elasticsearch/__tests__/Operations.test.ts +++ b/packages/api-dynamodb-to-elasticsearch/__tests__/Operations.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { Operations } from "~/Operations"; describe("Operations", () => { diff --git a/packages/api-dynamodb-to-elasticsearch/__tests__/OperationsBuilder.test.ts b/packages/api-dynamodb-to-elasticsearch/__tests__/OperationsBuilder.test.ts index 2a3f459e322..eaf71956ec6 100644 --- a/packages/api-dynamodb-to-elasticsearch/__tests__/OperationsBuilder.test.ts +++ b/packages/api-dynamodb-to-elasticsearch/__tests__/OperationsBuilder.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { OperationsBuilder } from "~/OperationsBuilder"; import { createDefaultCompressor } from "@webiny/utils/compression"; import { DynamoDBRecord } from "@webiny/handler-aws/types"; diff --git a/packages/api-dynamodb-to-elasticsearch/__tests__/event.test.ts b/packages/api-dynamodb-to-elasticsearch/__tests__/event.test.ts index 2eb4d12e0a2..5cfb88a77d7 100644 --- a/packages/api-dynamodb-to-elasticsearch/__tests__/event.test.ts +++ b/packages/api-dynamodb-to-elasticsearch/__tests__/event.test.ts @@ -1,8 +1,8 @@ +import { describe, it, expect, vi } from "vitest"; import { createEventHandler } from "~/index"; import { PluginsContainer } from "@webiny/plugins"; import { marshall as baseMarshall } from "@webiny/aws-sdk/client-dynamodb"; import { DynamoDBRecord } from "@webiny/handler-aws/types"; -import { jest } from "@jest/globals"; interface Event { Records: DynamoDBRecord[]; @@ -75,7 +75,7 @@ describe("event", () => { lambdaContext, request, reply, - next: jest.fn() + next: vi.fn() }); expect(result).toEqual(null); @@ -89,7 +89,7 @@ describe("event", () => { lambdaContext, request, reply, - next: jest.fn() + next: vi.fn() }); expect(result).toEqual(null); @@ -107,7 +107,7 @@ describe("event", () => { lambdaContext, request, reply, - next: jest.fn() + next: vi.fn() }); expect(result).toEqual(null); diff --git a/packages/api-dynamodb-to-elasticsearch/__tests__/transfer.test.ts b/packages/api-dynamodb-to-elasticsearch/__tests__/transfer.test.ts index f034c8b8cfa..d7b06b67185 100644 --- a/packages/api-dynamodb-to-elasticsearch/__tests__/transfer.test.ts +++ b/packages/api-dynamodb-to-elasticsearch/__tests__/transfer.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, vi } from "vitest"; import { createEventHandler, OperationType } from "~/index"; import { createElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch/createClient"; // @ts-expect-error @@ -5,7 +6,6 @@ import { createMockApiLog } from "@webiny/project-utils/testing/mockApiLog"; import { LambdaContext, Reply, Request } from "@webiny/handler-aws/types"; import { marshall } from "@webiny/aws-sdk/client-dynamodb"; import { createMockContext } from "~tests/mocks/context"; -import { jest } from "@jest/globals"; describe("transfer data", () => { it("should transfer data from event to elasticsearch", async () => { @@ -49,7 +49,7 @@ describe("transfer data", () => { ] }, lambdaContext: {} as LambdaContext, - next: jest.fn() + next: vi.fn() }); expect(result).toEqual(null); diff --git a/packages/api-dynamodb-to-elasticsearch/jest.config.js b/packages/api-dynamodb-to-elasticsearch/jest.config.js deleted file mode 100644 index 9a1f3e67a0f..00000000000 --- a/packages/api-dynamodb-to-elasticsearch/jest.config.js +++ /dev/null @@ -1,7 +0,0 @@ -const base = require("../../jest.config.base"); -const { getElasticsearchIndexPrefix } = require("@webiny/api-elasticsearch"); - -const prefix = getElasticsearchIndexPrefix(); -process.env.ELASTIC_SEARCH_INDEX_PREFIX = `${prefix}api-elasticsearch-`; - -module.exports = base({ path: __dirname }); diff --git a/packages/api-dynamodb-to-elasticsearch/tsconfig.json b/packages/api-dynamodb-to-elasticsearch/tsconfig.json index e77b95262cc..bbb47aa6359 100644 --- a/packages/api-dynamodb-to-elasticsearch/tsconfig.json +++ b/packages/api-dynamodb-to-elasticsearch/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [ { "path": "../api" }, { "path": "../api-elasticsearch" }, diff --git a/packages/api-dynamodb-to-elasticsearch/vitest.config.ts b/packages/api-dynamodb-to-elasticsearch/vitest.config.ts new file mode 100644 index 00000000000..abe6e00d6c5 --- /dev/null +++ b/packages/api-dynamodb-to-elasticsearch/vitest.config.ts @@ -0,0 +1,8 @@ +import { createTestConfig } from "../../testing"; +import { getElasticsearchIndexPrefix } from "@webiny/api-elasticsearch"; + +export default async () => { + const prefix = getElasticsearchIndexPrefix(); + process.env.ELASTIC_SEARCH_INDEX_PREFIX = `${prefix}api-elasticsearch-`; + return createTestConfig({ path: import.meta.dirname }); +}; diff --git a/packages/api-file-manager-aco/.babelrc.js b/packages/api-file-manager-aco/.babelrc.cjs similarity index 100% rename from packages/api-file-manager-aco/.babelrc.js rename to packages/api-file-manager-aco/.babelrc.cjs diff --git a/packages/api-file-manager-aco/__tests__/folder.extensions.test.ts b/packages/api-file-manager-aco/__tests__/folder.extensions.test.ts index 6a0b5278225..5e890670869 100644 --- a/packages/api-file-manager-aco/__tests__/folder.extensions.test.ts +++ b/packages/api-file-manager-aco/__tests__/folder.extensions.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; import { folderMocks } from "~tests/mocks/folder.mock"; import { createFmFileFolderModelModifier } from "~/plugins"; diff --git a/packages/api-file-manager-aco/jest.setup.js b/packages/api-file-manager-aco/jest.setup.js deleted file mode 100644 index 4ddf6ca63eb..00000000000 --- a/packages/api-file-manager-aco/jest.setup.js +++ /dev/null @@ -1,13 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-admin-users", "storage-operations"], - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-page-builder", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-file-manager-aco/package.json b/packages/api-file-manager-aco/package.json index d4d004bf508..e9a9f5e9689 100644 --- a/packages/api-file-manager-aco/package.json +++ b/packages/api-file-manager-aco/package.json @@ -2,6 +2,7 @@ "name": "@webiny/api-file-manager-aco", "version": "0.0.0", "main": "index.js", + "type": "module", "keywords": [ "api-file-manager-aco:base" ], diff --git a/packages/api-file-manager-aco/tsconfig.json b/packages/api-file-manager-aco/tsconfig.json index cbea3636d1d..a1f832f325d 100644 --- a/packages/api-file-manager-aco/tsconfig.json +++ b/packages/api-file-manager-aco/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.setup.ts"], "references": [ { "path": "../api-aco" }, { "path": "../api" }, diff --git a/packages/api-file-manager-aco/vitest.config.ts b/packages/api-file-manager-aco/vitest.config.ts new file mode 100644 index 00000000000..b996a75130c --- /dev/null +++ b/packages/api-file-manager-aco/vitest.config.ts @@ -0,0 +1,15 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-admin-users", "storage-operations"], + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-page-builder", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ path: import.meta.dirname, presets }); +}; diff --git a/packages/api-file-manager-aco/webiny.config.js b/packages/api-file-manager-aco/webiny.config.js index d2234afda65..bdaf6b08db3 100644 --- a/packages/api-file-manager-aco/webiny.config.js +++ b/packages/api-file-manager-aco/webiny.config.js @@ -1,8 +1,8 @@ -const { createWatchPackage, createBuildPackage } = require("@webiny/build-tools"); +import { createWatchPackage, createBuildPackage } from "@webiny/project-utils"; -module.exports = { +export default { commands: { - build: createBuildPackage({ cwd: __dirname }), - watch: createWatchPackage({ cwd: __dirname }) + build: createBuildPackage({ cwd: import.meta.dirname }), + watch: createWatchPackage({ cwd: import.meta.dirname }) } }; diff --git a/packages/api-file-manager-ddb/.typedoc.json b/packages/api-file-manager-ddb/.typedoc.json deleted file mode 100644 index 0f06c91224f..00000000000 --- a/packages/api-file-manager-ddb/.typedoc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "API File Manager DynamoDB", - "entryPoints": ["types.ts"] -} diff --git a/packages/api-file-manager-ddb/__tests__/__api__/setupAfterEnv.js b/packages/api-file-manager-ddb/__tests__/__api__/setupAfterEnv.js index d335a2b969d..b2c7521ed7c 100644 --- a/packages/api-file-manager-ddb/__tests__/__api__/setupAfterEnv.js +++ b/packages/api-file-manager-ddb/__tests__/__api__/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/api-file-manager/__tests__/file.customDates.test.ts b/packages/api-file-manager/__tests__/file.customDates.test.ts index a6688fb1358..6ab649d62a6 100644 --- a/packages/api-file-manager/__tests__/file.customDates.test.ts +++ b/packages/api-file-manager/__tests__/file.customDates.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import useGqlHandler from "./utils/useGqlHandler"; import { fileAData, ids } from "./mocks/files"; diff --git a/packages/api-file-manager/__tests__/file.customIdentities.test.ts b/packages/api-file-manager/__tests__/file.customIdentities.test.ts index 5776917fe4e..6d633d9a982 100644 --- a/packages/api-file-manager/__tests__/file.customIdentities.test.ts +++ b/packages/api-file-manager/__tests__/file.customIdentities.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import useGqlHandler from "./utils/useGqlHandler"; import { fileAData } from "./mocks/files"; import { SecurityIdentity } from "@webiny/api-security/types"; diff --git a/packages/api-file-manager/__tests__/file.extensions.test.ts b/packages/api-file-manager/__tests__/file.extensions.test.ts index 8f7b9712778..e88b46db0ba 100644 --- a/packages/api-file-manager/__tests__/file.extensions.test.ts +++ b/packages/api-file-manager/__tests__/file.extensions.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import useGqlHandler from "~tests/utils/useGqlHandler"; import { createFileModelModifier } from "~/modelModifier/CmsModelModifier"; import { fileAData } from "./mocks/files"; diff --git a/packages/api-file-manager/__tests__/file.lifecycle.test.ts b/packages/api-file-manager/__tests__/file.lifecycle.test.ts index 162cc5544ff..bbc39472d3d 100644 --- a/packages/api-file-manager/__tests__/file.lifecycle.test.ts +++ b/packages/api-file-manager/__tests__/file.lifecycle.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect, beforeEach } from "vitest"; import { mdbid } from "@webiny/utils"; import useGqlHandler from "~tests/utils/useGqlHandler"; import { assignFileLifecycleEvents, tracker } from "./mocks/lifecycleEvents"; diff --git a/packages/api-file-manager/__tests__/fileModelModifier.test.ts b/packages/api-file-manager/__tests__/fileModelModifier.test.ts index 40d44baa80b..e43697215d8 100644 --- a/packages/api-file-manager/__tests__/fileModelModifier.test.ts +++ b/packages/api-file-manager/__tests__/fileModelModifier.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { useHandler } from "./utils/useHandler"; import { createFileModelModifier } from "~/index"; import { fileAData, fileBData } from "./mocks/files"; @@ -45,7 +46,7 @@ describe("File Model Modifier test", () => { }); expect(file.name).toEqual("filenameB.png"); - expect(file.extensions.year).toEqual(2020); + expect(file.extensions?.year).toEqual(2020); expect(meta.totalCount).toEqual(1); }); }); diff --git a/packages/api-file-manager/__tests__/fileSchema.test.ts b/packages/api-file-manager/__tests__/fileSchema.test.ts index 5ca140881e3..76a8a21b5e7 100644 --- a/packages/api-file-manager/__tests__/fileSchema.test.ts +++ b/packages/api-file-manager/__tests__/fileSchema.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import prettier from "prettier"; import { useHandler } from "./utils/useHandler"; import { createFilesTypeDefs } from "~/graphql/createFilesTypeDefs"; diff --git a/packages/api-file-manager/__tests__/files.test.ts b/packages/api-file-manager/__tests__/files.test.ts index 65e3dcd8861..5ac9c89ef24 100644 --- a/packages/api-file-manager/__tests__/files.test.ts +++ b/packages/api-file-manager/__tests__/files.test.ts @@ -1,16 +1,10 @@ -import { jest } from "@jest/globals"; +import { describe, test, it, beforeAll, expect } from "vitest"; import { mdbid } from "@webiny/utils"; import useGqlHandler from "~tests/utils/useGqlHandler"; import testFiles from "./data"; import { ids, fileDData, fileCData, fileBData, fileAData } from "./mocks/files"; -jest.retryTimes(3); - -// const LONG_STRING = "pneumonoultramicroscopicsilicovolcanoconiosispneumonoultramicroscopi"; - -jest.setTimeout(100000); - -describe("Files CRUD test", () => { +describe("Files CRUD test", { timeout: 100_000, retry: 3 }, () => { const { createFile, updateFile, createFiles, getFile, listFiles, listTags } = useGqlHandler(); beforeAll(() => { diff --git a/packages/api-file-manager/__tests__/filesSecurity.test.ts b/packages/api-file-manager/__tests__/filesSecurity.test.ts index 2a5ae93f37c..8cdaed6591e 100644 --- a/packages/api-file-manager/__tests__/filesSecurity.test.ts +++ b/packages/api-file-manager/__tests__/filesSecurity.test.ts @@ -1,10 +1,8 @@ -import { jest } from "@jest/globals"; +import { describe, test, expect } from "vitest"; import { mdbid } from "@webiny/utils"; import { SecurityPermission, SecurityIdentity } from "@webiny/api-security/types"; import useGqlHandler from "~tests/utils/useGqlHandler"; -jest.setTimeout(10000); - function createFileMock(prefix = "") { const id = mdbid(); @@ -50,7 +48,7 @@ const identityB: SecurityIdentity = { type IdentityPermissions = Array<[SecurityPermission[], SecurityIdentity | null]>; -describe("Files Security Test", () => { +describe("Files Security Test", { timeout: 10_000 }, () => { const { createFile, createFiles, until } = useGqlHandler({ permissions: [{ name: "content.i18n" }, { name: "fm.*" }], identity: identityA diff --git a/packages/api-file-manager/__tests__/filesSettings.lifecycle.test.ts b/packages/api-file-manager/__tests__/filesSettings.lifecycle.test.ts index b5f67a946d7..93e2c65f271 100644 --- a/packages/api-file-manager/__tests__/filesSettings.lifecycle.test.ts +++ b/packages/api-file-manager/__tests__/filesSettings.lifecycle.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect, beforeEach } from "vitest"; import useGqlHandler from "~tests/utils/useGqlHandler"; import { assignSettingsLifecycleEvents, tracker } from "./mocks/lifecycleEvents"; diff --git a/packages/api-file-manager/__tests__/filesSettings.test.ts b/packages/api-file-manager/__tests__/filesSettings.test.ts index e07025e5813..61f2ef0c763 100644 --- a/packages/api-file-manager/__tests__/filesSettings.test.ts +++ b/packages/api-file-manager/__tests__/filesSettings.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { SecurityIdentity } from "@webiny/api-security/types"; import useGqlHandler from "~tests/utils/useGqlHandler"; diff --git a/packages/api-file-manager/jest.setup.js b/packages/api-file-manager/jest.setup.js deleted file mode 100644 index f0ad2654ddf..00000000000 --- a/packages/api-file-manager/jest.setup.js +++ /dev/null @@ -1,12 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-file-manager", "storage-operations"], - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-file-manager/src/FileManagerContextSetup.ts b/packages/api-file-manager/src/FileManagerContextSetup.ts index e31d0dc219f..85786e25de8 100644 --- a/packages/api-file-manager/src/FileManagerContextSetup.ts +++ b/packages/api-file-manager/src/FileManagerContextSetup.ts @@ -92,7 +92,6 @@ export class FileManagerContextSetup { private async setupCmsStorageOperations(aliases: FileManagerAliasesStorageOperations) { if (!(await isHeadlessCmsReady(this.context))) { - console.log("Installation pending!"); return; } diff --git a/packages/api-file-manager/tsconfig.json b/packages/api-file-manager/tsconfig.json index 3857620d330..33acb2601b4 100644 --- a/packages/api-file-manager/tsconfig.json +++ b/packages/api-file-manager/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.setup.ts"], "references": [ { "path": "../api" }, { "path": "../api-headless-cms" }, diff --git a/packages/api-file-manager/vitest.setup.ts b/packages/api-file-manager/vitest.setup.ts new file mode 100644 index 00000000000..7254c27c959 --- /dev/null +++ b/packages/api-file-manager/vitest.setup.ts @@ -0,0 +1,14 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-file-manager", "storage-operations"], + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ path: import.meta.dirname, presets }); +}; diff --git a/packages/api-headless-cms-aco/src/index.ts b/packages/api-headless-cms-aco/src/index.ts index f624aa81ac3..19c8d14262d 100644 --- a/packages/api-headless-cms-aco/src/index.ts +++ b/packages/api-headless-cms-aco/src/index.ts @@ -5,7 +5,6 @@ import { type HcmsAcoContext } from "~/types.js"; export const createAcoHcmsContext = () => { const plugin = new ContextPlugin(async context => { if (!context.aco) { - console.log(`There is no ACO initialized so we will not initialize the HCMS ACO.`); return; } createEntryHooks(context); diff --git a/packages/api-headless-cms-ddb-es/__tests__/__api__/setupAfterEnv.js b/packages/api-headless-cms-ddb-es/__tests__/__api__/setupAfterEnv.js index d335a2b969d..b2c7521ed7c 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/__api__/setupAfterEnv.js +++ b/packages/api-headless-cms-ddb-es/__tests__/__api__/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/api-headless-cms-ddb/__tests__/__api__/setupAfterEnv.js b/packages/api-headless-cms-ddb/__tests__/__api__/setupAfterEnv.js index fb2f41f7492..9d11cdeae4b 100644 --- a/packages/api-headless-cms-ddb/__tests__/__api__/setupAfterEnv.js +++ b/packages/api-headless-cms-ddb/__tests__/__api__/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/api-i18n-content/jest.config.js b/packages/api-i18n-content/jest.config.js deleted file mode 100644 index 9f6e3e661f8..00000000000 --- a/packages/api-i18n-content/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const base = require("../../jest.config.base"); - -module.exports = base({ name: "api-i18n-content", path: __dirname }, []); diff --git a/packages/api-i18n-ddb/.typedoc.json b/packages/api-i18n-ddb/.typedoc.json deleted file mode 100644 index 715d3f27288..00000000000 --- a/packages/api-i18n-ddb/.typedoc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "API I18n DynamoDB", - "entryPoints": ["types.ts"] -} diff --git a/packages/api-i18n-ddb/__tests__/__api__/setupAfterEnv.js b/packages/api-i18n-ddb/__tests__/__api__/setupAfterEnv.js index fb2f41f7492..9d11cdeae4b 100644 --- a/packages/api-i18n-ddb/__tests__/__api__/setupAfterEnv.js +++ b/packages/api-i18n-ddb/__tests__/__api__/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/api-log/__tests__/createLogger.test.ts b/packages/api-log/__tests__/createLogger.test.ts index bfb5a311fdb..b849d92e34e 100644 --- a/packages/api-log/__tests__/createLogger.test.ts +++ b/packages/api-log/__tests__/createLogger.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { Context } from "~/types"; import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; import { getTenant } from "~tests/mocks/getTenant"; diff --git a/packages/api-log/__tests__/crud/crud.test.ts b/packages/api-log/__tests__/crud/crud.test.ts index c7da5c4d62a..ad3364e9a9a 100644 --- a/packages/api-log/__tests__/crud/crud.test.ts +++ b/packages/api-log/__tests__/crud/crud.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; import { getTenant } from "~tests/mocks/getTenant"; import { getLocale } from "~tests/mocks/getLocale"; @@ -20,6 +21,7 @@ describe("crud", () => { }; const createCrud = () => { + // @ts-expect-error Types changed return baseCreateCrud({ storageOperations, checkPermission diff --git a/packages/api-log/__tests__/logger/dynamodb/DynamoDbLogger.test.ts b/packages/api-log/__tests__/logger/dynamodb/DynamoDbLogger.test.ts index 0534d4b3d28..82a590d3e05 100644 --- a/packages/api-log/__tests__/logger/dynamodb/DynamoDbLogger.test.ts +++ b/packages/api-log/__tests__/logger/dynamodb/DynamoDbLogger.test.ts @@ -1,16 +1,14 @@ +import { vi, describe, it, expect } from "vitest"; import { createDynamoDbLogger } from "~/logger"; import { getTenant } from "~tests/mocks/getTenant"; import { getLocale } from "~tests/mocks/getLocale"; import { ILoggerLog, LogType } from "~/types"; -import { jest } from "@jest/globals"; -jest.setTimeout(5000); - -describe("DynamoDbLogger", () => { +describe("DynamoDbLogger", { timeout: 5000 }, () => { it("should one log per type log - autoflush", async () => { const logs: ILoggerLog[] = []; - const onFlush = jest.fn(async (items: ILoggerLog[]): Promise => { + const onFlush = vi.fn(async (items: ILoggerLog[]): Promise => { logs.push(...items); return items; }); @@ -114,7 +112,7 @@ describe("DynamoDbLogger", () => { it("should one log per type log - manual flush", async () => { const logs: ILoggerLog[] = []; - const onFlush = jest.fn(async (items: ILoggerLog[]): Promise => { + const onFlush = vi.fn(async (items: ILoggerLog[]): Promise => { logs.push(...items); return items; }); diff --git a/packages/api-log/__tests__/logger/dynamodb/DynamoDbLoggerKeys.test.ts b/packages/api-log/__tests__/logger/dynamodb/DynamoDbLoggerKeys.test.ts index 01c759189f6..a4495e14f9a 100644 --- a/packages/api-log/__tests__/logger/dynamodb/DynamoDbLoggerKeys.test.ts +++ b/packages/api-log/__tests__/logger/dynamodb/DynamoDbLoggerKeys.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { mdbid } from "@webiny/utils"; import { DynamoDbLoggerKeys } from "~/logger"; import { LogType } from "~/types"; diff --git a/packages/api-log/__tests__/logger/dynamodb/DynamoDbStorageOperations.test.ts b/packages/api-log/__tests__/logger/dynamodb/DynamoDbStorageOperations.test.ts index 0bbef5b8af2..5b43bb40707 100644 --- a/packages/api-log/__tests__/logger/dynamodb/DynamoDbStorageOperations.test.ts +++ b/packages/api-log/__tests__/logger/dynamodb/DynamoDbStorageOperations.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { Entity } from "@webiny/db-dynamodb/toolbox"; import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; import { create } from "~/db"; diff --git a/packages/api-log/__tests__/setup/setupAfterEnv.js b/packages/api-log/__tests__/setup/setupAfterEnv.js new file mode 100644 index 00000000000..9d11cdeae4b --- /dev/null +++ b/packages/api-log/__tests__/setup/setupAfterEnv.js @@ -0,0 +1,7 @@ +import { resolve } from "path"; +import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; + +(async () => { + const setupPath = resolve(import.meta.dirname, "../../"); + await setupDynalite(setupPath); +})(); diff --git a/packages/api-log/__tests__/tasks/pruneLogs/PruneLogs.test.ts b/packages/api-log/__tests__/tasks/pruneLogs/PruneLogs.test.ts index 12e07a33d30..5f03c1c8ed4 100644 --- a/packages/api-log/__tests__/tasks/pruneLogs/PruneLogs.test.ts +++ b/packages/api-log/__tests__/tasks/pruneLogs/PruneLogs.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { PruneLogs } from "~/tasks/pruneLogs/PruneLogs"; import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; import { DynamoDbLoggerKeys, DynamoDbStorageOperations } from "~/logger"; diff --git a/packages/api-log/jest.setup.js b/packages/api-log/jest.setup.js deleted file mode 100644 index 7f2a525a5b5..00000000000 --- a/packages/api-log/jest.setup.js +++ /dev/null @@ -1,6 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")([]); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-log/tsconfig.json b/packages/api-log/tsconfig.json index 2b03e1a1dd8..09601b612ad 100644 --- a/packages/api-log/tsconfig.json +++ b/packages/api-log/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [ { "path": "../api" }, { "path": "../api-i18n" }, diff --git a/packages/api-log/vitest.config.ts b/packages/api-log/vitest.config.ts new file mode 100644 index 00000000000..bb4c9279b9d --- /dev/null +++ b/packages/api-log/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname }); +}; diff --git a/packages/api-mailer/__tests__/password.test.ts b/packages/api-mailer/__tests__/password.test.ts index 31c18aa303d..1704e0c3e46 100644 --- a/packages/api-mailer/__tests__/password.test.ts +++ b/packages/api-mailer/__tests__/password.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { decrypt, encrypt } from "~/crud/settings/password"; const secret = "someReallySecretSecretWithRandomNumbersOrLettersOrSomethingElse"; diff --git a/packages/api-mailer/__tests__/settings.crud.test.ts b/packages/api-mailer/__tests__/settings.crud.test.ts index 271bb30c9aa..6a89fffd4eb 100644 --- a/packages/api-mailer/__tests__/settings.crud.test.ts +++ b/packages/api-mailer/__tests__/settings.crud.test.ts @@ -1,8 +1,8 @@ -import { jest } from "@jest/globals"; +import { describe, it, expect, beforeEach, vi } from "vitest"; import { createContextHandler } from "./contextHandler"; import { TransportSendData } from "~/types"; -jest.mock("nodemailer", () => { +vi.mock("nodemailer", () => { return { createTransport: () => { return { diff --git a/packages/api-mailer/__tests__/settings.graphql.test.ts b/packages/api-mailer/__tests__/settings.graphql.test.ts index a3b017107df..bc0091ff614 100644 --- a/packages/api-mailer/__tests__/settings.graphql.test.ts +++ b/packages/api-mailer/__tests__/settings.graphql.test.ts @@ -1,7 +1,7 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { createGraphQLHandler } from "./graphQLHandler"; -import { jest } from "@jest/globals"; -jest.mock("nodemailer", () => { +vi.mock("nodemailer", () => { return { createTransport: () => { throw new Error("Transport should not be created at this point."); diff --git a/packages/api-mailer/__tests__/setup/setupAfterEnv.js b/packages/api-mailer/__tests__/setup/setupAfterEnv.js index d335a2b969d..b2c7521ed7c 100644 --- a/packages/api-mailer/__tests__/setup/setupAfterEnv.js +++ b/packages/api-mailer/__tests__/setup/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/api-mailer/__tests__/transporter.crud.test.ts b/packages/api-mailer/__tests__/transporter.crud.test.ts index 5dd4ed8f628..e5efe929c08 100644 --- a/packages/api-mailer/__tests__/transporter.crud.test.ts +++ b/packages/api-mailer/__tests__/transporter.crud.test.ts @@ -1,22 +1,24 @@ -import { jest } from "@jest/globals"; +import { describe, it, expect, beforeEach, vi } from "vitest"; import { createContextHandler } from "./contextHandler"; import { TransportSendData } from "~/types"; -jest.mock("nodemailer", () => { +vi.mock("nodemailer", () => { return { - createTransport: () => { - return { - sendMail: async (params: TransportSendData) => { - return { - envelope: "envelope", - messageId: "123", - accepted: [params.to], - rejected: [], - pending: [], - response: "ok" - }; - } - }; + default: { + createTransport: () => { + return { + sendMail: async (params: TransportSendData) => { + return { + envelope: "envelope", + messageId: "123", + accepted: [params.to], + rejected: [], + pending: [], + response: "ok" + }; + } + }; + } } }; }); diff --git a/packages/api-mailer/jest.setup.js b/packages/api-mailer/jest.setup.js deleted file mode 100644 index 049095053ae..00000000000 --- a/packages/api-mailer/jest.setup.js +++ /dev/null @@ -1,11 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-mailer/tsconfig.json b/packages/api-mailer/tsconfig.json index 39d86c2d912..3683fc9adcf 100644 --- a/packages/api-mailer/tsconfig.json +++ b/packages/api-mailer/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [ { "path": "../api" }, { "path": "../api-headless-cms" }, diff --git a/packages/api-mailer/vitest.config.ts b/packages/api-mailer/vitest.config.ts new file mode 100644 index 00000000000..3302506843c --- /dev/null +++ b/packages/api-mailer/vitest.config.ts @@ -0,0 +1,13 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ path: import.meta.dirname, presets }); +}; diff --git a/packages/api-page-builder-aco/src/index.ts b/packages/api-page-builder-aco/src/index.ts index 241786de895..07a381fcdb9 100644 --- a/packages/api-page-builder-aco/src/index.ts +++ b/packages/api-page-builder-aco/src/index.ts @@ -40,9 +40,6 @@ const decoratePageBuilderCrud = async (context: PbAcoContext): Promise => export const createAcoPageBuilderContext = () => { const plugin = new ContextPlugin(async context => { if (!context.aco) { - console.log( - `There is no ACO initialized so we will not initialize the Page Builder ACO.` - ); return; } await setupContext(context); @@ -60,9 +57,6 @@ export const createAcoPageBuilderContext = () => { export const createAcoPageBuilderImportExportContext = () => { const plugin = new ContextPlugin(async context => { if (!context.aco) { - console.log( - `There is no ACO initialized so we will not initialize the Page Builder ACO.` - ); return; } await setupContext(context); diff --git a/packages/api-page-builder-import-export-so-ddb/__tests__/__api__/setupAfterEnv.js b/packages/api-page-builder-import-export-so-ddb/__tests__/__api__/setupAfterEnv.js index d335a2b969d..b2c7521ed7c 100644 --- a/packages/api-page-builder-import-export-so-ddb/__tests__/__api__/setupAfterEnv.js +++ b/packages/api-page-builder-import-export-so-ddb/__tests__/__api__/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/api-page-builder-so-ddb-es/__tests__/__api__/setupAfterEnv.js b/packages/api-page-builder-so-ddb-es/__tests__/__api__/setupAfterEnv.js index d335a2b969d..b2c7521ed7c 100644 --- a/packages/api-page-builder-so-ddb-es/__tests__/__api__/setupAfterEnv.js +++ b/packages/api-page-builder-so-ddb-es/__tests__/__api__/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/api-page-builder-so-ddb-es/__tests__/setup/setupAfterEnv.js b/packages/api-page-builder-so-ddb-es/__tests__/setup/setupAfterEnv.js index d335a2b969d..b2c7521ed7c 100644 --- a/packages/api-page-builder-so-ddb-es/__tests__/setup/setupAfterEnv.js +++ b/packages/api-page-builder-so-ddb-es/__tests__/setup/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/api-page-builder-so-ddb/__tests__/__api__/presets.js b/packages/api-page-builder-so-ddb/__tests__/__api__/presets.js index 5134e546dbf..a8ea887dc48 100644 --- a/packages/api-page-builder-so-ddb/__tests__/__api__/presets.js +++ b/packages/api-page-builder-so-ddb/__tests__/__api__/presets.js @@ -1,10 +1,8 @@ -const path = require("path"); +import { resolve } from "path"; -const presets = [ +export default [ { - setupFiles: [path.resolve(__dirname, "setupFile.js")], - setupFilesAfterEnv: [path.resolve(__dirname, "setupAfterEnv.js")] + setupFiles: [resolve(import.meta.dirname, "setupFile.js")], + setupFilesAfterEnv: [resolve(import.meta.dirname, "setupAfterEnv.js")] } ]; - -module.exports = presets; diff --git a/packages/api-page-builder-so-ddb/__tests__/__api__/setupAfterEnv.js b/packages/api-page-builder-so-ddb/__tests__/__api__/setupAfterEnv.js index d335a2b969d..b2c7521ed7c 100644 --- a/packages/api-page-builder-so-ddb/__tests__/__api__/setupAfterEnv.js +++ b/packages/api-page-builder-so-ddb/__tests__/__api__/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/api-prerendering-service-so-ddb/__tests__/__api__/setupAfterEnv.js b/packages/api-prerendering-service-so-ddb/__tests__/__api__/setupAfterEnv.js index d335a2b969d..b2c7521ed7c 100644 --- a/packages/api-prerendering-service-so-ddb/__tests__/__api__/setupAfterEnv.js +++ b/packages/api-prerendering-service-so-ddb/__tests__/__api__/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/api-record-locking/__tests__/graphql/getLockRecord.test.ts b/packages/api-record-locking/__tests__/graphql/getLockRecord.test.ts index 66284c64ada..da31eea734e 100644 --- a/packages/api-record-locking/__tests__/graphql/getLockRecord.test.ts +++ b/packages/api-record-locking/__tests__/graphql/getLockRecord.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQLHandler } from "~tests/helpers/useGraphQLHandler"; describe("get lock record", () => { diff --git a/packages/api-record-locking/__tests__/graphql/getLockedEntryLockRecord.test.ts b/packages/api-record-locking/__tests__/graphql/getLockedEntryLockRecord.test.ts index 7a8cab4d758..dbe6ecc8245 100644 --- a/packages/api-record-locking/__tests__/graphql/getLockedEntryLockRecord.test.ts +++ b/packages/api-record-locking/__tests__/graphql/getLockedEntryLockRecord.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQLHandler } from "~tests/helpers/useGraphQLHandler"; import { createIdentity } from "~tests/helpers/identity"; diff --git a/packages/api-record-locking/__tests__/graphql/isEntryLocked.test.ts b/packages/api-record-locking/__tests__/graphql/isEntryLocked.test.ts index 02e2b32a088..2587c1bedaf 100644 --- a/packages/api-record-locking/__tests__/graphql/isEntryLocked.test.ts +++ b/packages/api-record-locking/__tests__/graphql/isEntryLocked.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQLHandler } from "~tests/helpers/useGraphQLHandler"; describe("is entry locked", () => { diff --git a/packages/api-record-locking/__tests__/graphql/listLockRecords.test.ts b/packages/api-record-locking/__tests__/graphql/listLockRecords.test.ts index 688ef84f93c..cca3039654a 100644 --- a/packages/api-record-locking/__tests__/graphql/listLockRecords.test.ts +++ b/packages/api-record-locking/__tests__/graphql/listLockRecords.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { createIdentity } from "~tests/helpers/identity"; import { useGraphQLHandler } from "~tests/helpers/useGraphQLHandler"; diff --git a/packages/api-record-locking/__tests__/graphql/lockEntry.test.ts b/packages/api-record-locking/__tests__/graphql/lockEntry.test.ts index c21be288272..f091a4c4eea 100644 --- a/packages/api-record-locking/__tests__/graphql/lockEntry.test.ts +++ b/packages/api-record-locking/__tests__/graphql/lockEntry.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQLHandler } from "~tests/helpers/useGraphQLHandler"; import { createIdentity } from "~tests/helpers/identity"; diff --git a/packages/api-record-locking/__tests__/graphql/requestEntryUnlock.test.ts b/packages/api-record-locking/__tests__/graphql/requestEntryUnlock.test.ts index 533ff791cb3..5b1af6775e7 100644 --- a/packages/api-record-locking/__tests__/graphql/requestEntryUnlock.test.ts +++ b/packages/api-record-locking/__tests__/graphql/requestEntryUnlock.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { RecordLockingLockRecordActionType } from "~/types"; import { useGraphQLHandler } from "~tests/helpers/useGraphQLHandler"; import { createIdentity } from "~tests/helpers/identity"; diff --git a/packages/api-record-locking/__tests__/graphql/unlockEntry.test.ts b/packages/api-record-locking/__tests__/graphql/unlockEntry.test.ts index 34429c80ce1..883962404b5 100644 --- a/packages/api-record-locking/__tests__/graphql/unlockEntry.test.ts +++ b/packages/api-record-locking/__tests__/graphql/unlockEntry.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQLHandler } from "~tests/helpers/useGraphQLHandler"; import { createIdentity, getSecurityIdentity } from "~tests/helpers/identity"; diff --git a/packages/api-record-locking/__tests__/graphql/updateEntryLock.test.ts b/packages/api-record-locking/__tests__/graphql/updateEntryLock.test.ts index ceee4498fd9..a67b87c2851 100644 --- a/packages/api-record-locking/__tests__/graphql/updateEntryLock.test.ts +++ b/packages/api-record-locking/__tests__/graphql/updateEntryLock.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQLHandler } from "~tests/helpers/useGraphQLHandler"; import { createIdentity } from "~tests/helpers/identity"; diff --git a/packages/api-record-locking/__tests__/useCase/isEntryLockedUseCase.test.ts b/packages/api-record-locking/__tests__/useCase/isEntryLockedUseCase.test.ts index 7cb2f34faf4..dd5267a11ed 100644 --- a/packages/api-record-locking/__tests__/useCase/isEntryLockedUseCase.test.ts +++ b/packages/api-record-locking/__tests__/useCase/isEntryLockedUseCase.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { IsEntryLockedUseCase } from "~/useCases/IsEntryLocked/IsEntryLockedUseCase"; import { WebinyError } from "@webiny/error"; import type { IRecordLockingLockRecord } from "~/types"; diff --git a/packages/api-record-locking/__tests__/useCase/kickOutCurrentUser.test.ts b/packages/api-record-locking/__tests__/useCase/kickOutCurrentUser.test.ts index d3c361c58c6..e4dcbb40ee3 100644 --- a/packages/api-record-locking/__tests__/useCase/kickOutCurrentUser.test.ts +++ b/packages/api-record-locking/__tests__/useCase/kickOutCurrentUser.test.ts @@ -1,12 +1,12 @@ +import { describe, it, expect, vi } from "vitest"; import { KickOutCurrentUserUseCase } from "~/useCases/KickOutCurrentUser/KickOutCurrentUserUseCase"; import { IWebsocketsContextObject } from "@webiny/api-websockets"; import { createIdentity } from "~tests/helpers/identity"; import { IRecordLockingLockRecord } from "~/types"; -import { jest } from "@jest/globals"; describe("kick out current user", () => { it("should send message via websockets to kick out current user", async () => { - const websocketsSend = jest.fn(async () => { + const websocketsSend = vi.fn(async () => { return; }); diff --git a/packages/api-record-locking/__tests__/useCase/lockEntryUseCase.test.ts b/packages/api-record-locking/__tests__/useCase/lockEntryUseCase.test.ts index 57586d7c8e8..e7b4397d713 100644 --- a/packages/api-record-locking/__tests__/useCase/lockEntryUseCase.test.ts +++ b/packages/api-record-locking/__tests__/useCase/lockEntryUseCase.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { LockEntryUseCase } from "~/useCases/LockEntryUseCase/LockEntryUseCase"; import { WebinyError } from "@webiny/error"; import { IIsEntryLockedUseCase } from "~/abstractions/IIsEntryLocked"; diff --git a/packages/api-record-locking/__tests__/useCase/unlockEntryRequestUseCase.test.ts b/packages/api-record-locking/__tests__/useCase/unlockEntryRequestUseCase.test.ts index 30cb71177fa..9435d17790a 100644 --- a/packages/api-record-locking/__tests__/useCase/unlockEntryRequestUseCase.test.ts +++ b/packages/api-record-locking/__tests__/useCase/unlockEntryRequestUseCase.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { UnlockEntryRequestUseCase } from "~/useCases/UnlockRequestUseCase/UnlockEntryRequestUseCase"; import { IGetLockRecordUseCase } from "~/abstractions/IGetLockRecordUseCase"; import { getSecurityIdentity } from "~tests/helpers/identity"; diff --git a/packages/api-record-locking/__tests__/useCase/unlockEntryUseCase.test.ts b/packages/api-record-locking/__tests__/useCase/unlockEntryUseCase.test.ts index 854f23fc206..28fb1dec56d 100644 --- a/packages/api-record-locking/__tests__/useCase/unlockEntryUseCase.test.ts +++ b/packages/api-record-locking/__tests__/useCase/unlockEntryUseCase.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { UnlockEntryUseCase } from "~/useCases/UnlockEntryUseCase/UnlockEntryUseCase"; import { IGetLockRecordUseCase } from "~/abstractions/IGetLockRecordUseCase"; import { WebinyError } from "@webiny/error"; @@ -6,7 +7,7 @@ import { createGetSecurity } from "~tests/mocks/createGetSecurity"; describe("unlock entry use case", () => { it("should throw an error on unlocking an entry", async () => { - expect.assertions(1); + expect.assertions(2); const useCase = new UnlockEntryUseCase({ getLockRecordUseCase: { @@ -37,9 +38,8 @@ describe("unlock entry use case", () => { try { await useCase.execute({ id: "id", type: "type" }); } catch (ex) { - expect(ex).toEqual( - new WebinyError("Could not unlock entry: Testing error.", "UNLOCK_ENTRY_ERROR") - ); + expect(ex.message).toEqual("Could not unlock entry: Testing error."); + expect(ex.code).toEqual("TESTING_ERROR"); } }); }); diff --git a/packages/api-record-locking/__tests__/utils/convertWhereCondition.test.ts b/packages/api-record-locking/__tests__/utils/convertWhereCondition.test.ts index 5d0888d1155..9bef1edbaf1 100644 --- a/packages/api-record-locking/__tests__/utils/convertWhereCondition.test.ts +++ b/packages/api-record-locking/__tests__/utils/convertWhereCondition.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { convertWhereCondition } from "~/utils/convertWhereCondition"; import { createLockRecordDatabaseId } from "~/utils/lockRecordDatabaseId"; diff --git a/packages/api-record-locking/__tests__/utils/validateSameIdentity.test.ts b/packages/api-record-locking/__tests__/utils/validateSameIdentity.test.ts index ca96bbe23c4..e3af02b1fe9 100644 --- a/packages/api-record-locking/__tests__/utils/validateSameIdentity.test.ts +++ b/packages/api-record-locking/__tests__/utils/validateSameIdentity.test.ts @@ -1,10 +1,11 @@ +import { describe, it, expect } from "vitest"; import { WebinyError } from "@webiny/error"; import { validateSameIdentity } from "~/utils/validateSameIdentity"; import { createIdentity } from "~tests/helpers/identity"; describe("validate same identity", () => { it("should throw an error on not matching identity", async () => { - expect.assertions(1); + expect.assertions(2); try { validateSameIdentity({ @@ -18,12 +19,10 @@ describe("validate same identity", () => { } }); } catch (ex) { - expect(ex).toEqual( - new WebinyError({ - message: "Cannot update lock record. Record is locked by another user.", - code: "LOCK_UPDATE_ERROR" - }) + expect(ex.message).toEqual( + "Cannot update lock record. Record is locked by another user." ); + expect(ex.code).toEqual("LOCK_UPDATE_ERROR"); } }); diff --git a/packages/api-record-locking/jest.setup.js b/packages/api-record-locking/jest.setup.js deleted file mode 100644 index 049095053ae..00000000000 --- a/packages/api-record-locking/jest.setup.js +++ /dev/null @@ -1,11 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-record-locking/tsconfig.json b/packages/api-record-locking/tsconfig.json index 612dc0c33ef..d17e2415b9e 100644 --- a/packages/api-record-locking/tsconfig.json +++ b/packages/api-record-locking/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [ { "path": "../api" }, { "path": "../api-headless-cms" }, diff --git a/packages/api-record-locking/vitest.config.ts b/packages/api-record-locking/vitest.config.ts new file mode 100644 index 00000000000..3302506843c --- /dev/null +++ b/packages/api-record-locking/vitest.config.ts @@ -0,0 +1,13 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ path: import.meta.dirname, presets }); +}; diff --git a/packages/api-security-cognito/__tests__/login.test.ts b/packages/api-security-cognito/__tests__/login.test.ts index 5bc742e1961..6ed569cd702 100644 --- a/packages/api-security-cognito/__tests__/login.test.ts +++ b/packages/api-security-cognito/__tests__/login.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect, beforeEach } from "vitest"; import useGqlHandler from "./useGqlHandler"; import md5 from "md5"; diff --git a/packages/api-security-cognito/__tests__/users.test.ts b/packages/api-security-cognito/__tests__/users.test.ts index 24a24fb1889..fbc0b55e313 100644 --- a/packages/api-security-cognito/__tests__/users.test.ts +++ b/packages/api-security-cognito/__tests__/users.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect, beforeEach } from "vitest"; import useGqlHandler from "./useGqlHandler"; import mocks from "./mocks/securityUser"; import md5 from "md5"; diff --git a/packages/api-security-cognito/jest.setup.js b/packages/api-security-cognito/jest.setup.js deleted file mode 100644 index b28e4a91cc3..00000000000 --- a/packages/api-security-cognito/jest.setup.js +++ /dev/null @@ -1,11 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-admin-users", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-security-cognito/tsconfig.json b/packages/api-security-cognito/tsconfig.json index 110b6307261..55a5b170b35 100644 --- a/packages/api-security-cognito/tsconfig.json +++ b/packages/api-security-cognito/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.setup.ts"], "references": [ { "path": "../api" }, { "path": "../api-admin-users" }, diff --git a/packages/api-security-cognito/vitest.setup.ts b/packages/api-security-cognito/vitest.setup.ts new file mode 100644 index 00000000000..a99a59e3d38 --- /dev/null +++ b/packages/api-security-cognito/vitest.setup.ts @@ -0,0 +1,16 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-admin-users", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"] + ); + + return createTestConfig({ + path: import.meta.dirname, + presets + }); +}; diff --git a/packages/api-security-so-ddb/__tests__/__api__/setupAfterEnv.js b/packages/api-security-so-ddb/__tests__/__api__/setupAfterEnv.js index fb2f41f7492..9d11cdeae4b 100644 --- a/packages/api-security-so-ddb/__tests__/__api__/setupAfterEnv.js +++ b/packages/api-security-so-ddb/__tests__/__api__/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/api-security/__tests__/apiKeys.test.ts b/packages/api-security/__tests__/apiKeys.test.ts index 2eeb1d0bd0c..11f73e66677 100644 --- a/packages/api-security/__tests__/apiKeys.test.ts +++ b/packages/api-security/__tests__/apiKeys.test.ts @@ -1,13 +1,13 @@ -import { jest } from "@jest/globals"; +import { describe, test, expect, vi, beforeEach } from "vitest"; import { mockCreateGetWcpProjectEnvironment } from "./wcp/aacl/mocks/mockCreateGetWcpProjectEnvironment"; import { mockCreateGetWcpProjectLicense } from "./wcp/aacl/mocks/mockCreateGetWcpProjectLicense"; import useGqlHandler from "./useGqlHandler"; import apiKeyAuthentication from "~/plugins/apiKeyAuthentication"; import apiKeyAuthorization from "~/plugins/apiKeyAuthorization"; -jest.mock("@webiny/api-wcp/utils", () => { +vi.mock("@webiny/api-wcp/utils", async () => { // The mock returned only mocks the generateServerSeed method. - const actual = jest.requireActual("@webiny/api-wcp/utils"); + const actual = await vi.importActual("@webiny/api-wcp/utils"); return { ...actual, @@ -15,9 +15,9 @@ jest.mock("@webiny/api-wcp/utils", () => { }; }); -jest.mock("@webiny/wcp", () => { +vi.mock("@webiny/wcp", async () => { // The mock returned only mocks the generateServerSeed method. - const actual = jest.requireActual("@webiny/wcp"); + const actual = await vi.importActual("@webiny/wcp"); return { ...actual, diff --git a/packages/api-security/__tests__/groups.test.ts b/packages/api-security/__tests__/groups.test.ts index 6ff14a5e7eb..e8ca932617e 100644 --- a/packages/api-security/__tests__/groups.test.ts +++ b/packages/api-security/__tests__/groups.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect, beforeEach } from "vitest"; import useGqlHandler from "./useGqlHandler"; import mocks from "./mocks/securityGroup"; import { createSecurityRolePlugin } from "~/plugins/SecurityRolePlugin"; diff --git a/packages/api-security/__tests__/identity.test.ts b/packages/api-security/__tests__/identity.test.ts index 83d743add07..319f11e6927 100644 --- a/packages/api-security/__tests__/identity.test.ts +++ b/packages/api-security/__tests__/identity.test.ts @@ -1,10 +1,11 @@ +import { describe, it, expect, beforeAll } from "vitest"; import { Security, SecurityStorageOperations } from "~/types"; import { createSecurity } from "~/createSecurity"; import { getStorageOps } from "@webiny/project-utils/testing/environment"; describe("identity test", () => { const tenant = "root"; - // @ts-expect-error + const { storageOperations } = getStorageOps("security"); let security: Security; diff --git a/packages/api-security/__tests__/install.test.ts b/packages/api-security/__tests__/install.test.ts index b62aa9af4e9..8d017cf9542 100644 --- a/packages/api-security/__tests__/install.test.ts +++ b/packages/api-security/__tests__/install.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect, beforeEach } from "vitest"; import useGqlHandler from "./useGqlHandler"; describe(`Test "Security" install`, () => { diff --git a/packages/api-security/__tests__/lifecycleEvents.apiKeys.test.ts b/packages/api-security/__tests__/lifecycleEvents.apiKeys.test.ts index 58fc2f0a8fa..b5310ef666a 100644 --- a/packages/api-security/__tests__/lifecycleEvents.apiKeys.test.ts +++ b/packages/api-security/__tests__/lifecycleEvents.apiKeys.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import useGqlHandler from "./useGqlHandler"; import { assignApiKeyLifecycleEvents, tracker } from "./mocks/lifecycleEvents"; diff --git a/packages/api-security/__tests__/lifecycleEvents.groups.test.ts b/packages/api-security/__tests__/lifecycleEvents.groups.test.ts index 64d08892e4d..bab35ebeb95 100644 --- a/packages/api-security/__tests__/lifecycleEvents.groups.test.ts +++ b/packages/api-security/__tests__/lifecycleEvents.groups.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import useGqlHandler from "./useGqlHandler"; import mocks from "./mocks/securityGroup"; diff --git a/packages/api-security/__tests__/login.test.ts b/packages/api-security/__tests__/login.test.ts index 6d2d586ab45..8d3c9c240da 100644 --- a/packages/api-security/__tests__/login.test.ts +++ b/packages/api-security/__tests__/login.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect, beforeEach } from "vitest"; import useGqlHandler from "./useGqlHandler"; import { defaultIdentity } from "./mocks/defaultIdentity"; diff --git a/packages/api-security/__tests__/parallelQueries.test.ts b/packages/api-security/__tests__/parallelQueries.test.ts index 0047dcc19b5..ddc1e92fa34 100644 --- a/packages/api-security/__tests__/parallelQueries.test.ts +++ b/packages/api-security/__tests__/parallelQueries.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect, beforeEach } from "vitest"; import useGqlHandler from "./useGqlHandler"; import { PARALLEL_QUERY, withoutAuthorizationPlugin } from "./graphql/parallelQueries"; diff --git a/packages/api-security/__tests__/teams.test.ts b/packages/api-security/__tests__/teams.test.ts index 0e2dfdb06c8..12d5d37f20f 100644 --- a/packages/api-security/__tests__/teams.test.ts +++ b/packages/api-security/__tests__/teams.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect, beforeEach } from "vitest"; import useGqlHandler from "./useGqlHandler"; import mocks from "./mocks/securityTeam"; import { createSecurityRolePlugin } from "~/plugins/SecurityRolePlugin"; diff --git a/packages/api-security/__tests__/wcp/aacl/customPermissionsFiltering.test.ts b/packages/api-security/__tests__/wcp/aacl/customPermissionsFiltering.test.ts index 3b17494048f..62cb5be8bc6 100644 --- a/packages/api-security/__tests__/wcp/aacl/customPermissionsFiltering.test.ts +++ b/packages/api-security/__tests__/wcp/aacl/customPermissionsFiltering.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { filterOutCustomWbyAppsPermissions } from "~/createSecurity/filterOutCustomWbyAppsPermissions"; import { customPermissions } from "./mocks/customPermissions"; diff --git a/packages/api-security/__tests__/wcp/aacl/customPermissionsHasAccessOldVersion.test.ts b/packages/api-security/__tests__/wcp/aacl/customPermissionsHasAccessOldVersion.test.ts index 839bd2b4c52..a79c2328661 100644 --- a/packages/api-security/__tests__/wcp/aacl/customPermissionsHasAccessOldVersion.test.ts +++ b/packages/api-security/__tests__/wcp/aacl/customPermissionsHasAccessOldVersion.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { PutCommand } from "@webiny/aws-sdk/client-dynamodb"; import { createMockContextHandler } from "./mockContextHandler"; import { customPermissions } from "./mocks/customPermissions"; diff --git a/packages/api-security/__tests__/wcp/aacl/customPermissionsHasWcpAccess.test.ts b/packages/api-security/__tests__/wcp/aacl/customPermissionsHasWcpAccess.test.ts index 24d12c672d4..daf9617a319 100644 --- a/packages/api-security/__tests__/wcp/aacl/customPermissionsHasWcpAccess.test.ts +++ b/packages/api-security/__tests__/wcp/aacl/customPermissionsHasWcpAccess.test.ts @@ -1,11 +1,11 @@ -import { jest } from "@jest/globals"; +import { describe, test, expect, vi } from "vitest"; import { customPermissions } from "./mocks/customPermissions"; import { mockCreateGetWcpProjectEnvironment } from "./mocks/mockCreateGetWcpProjectEnvironment"; import { mockCreateGetWcpProjectLicense } from "./mocks/mockCreateGetWcpProjectLicense"; -jest.mock("@webiny/wcp", () => { +vi.mock("@webiny/wcp", async () => { // The mock returned only mocks the generateServerSeed method. - const actual = jest.requireActual("@webiny/wcp"); + const actual = await vi.importActual("@webiny/wcp"); return { ...actual, diff --git a/packages/api-security/__tests__/wcp/aacl/customPermissionsNoWcpAccess.test.ts b/packages/api-security/__tests__/wcp/aacl/customPermissionsNoWcpAccess.test.ts index fdb83ca676e..f0da41f0d7c 100644 --- a/packages/api-security/__tests__/wcp/aacl/customPermissionsNoWcpAccess.test.ts +++ b/packages/api-security/__tests__/wcp/aacl/customPermissionsNoWcpAccess.test.ts @@ -1,10 +1,10 @@ -import { jest } from "@jest/globals"; +import { describe, test, expect, vi } from "vitest"; import { mockCreateGetWcpProjectEnvironment } from "./mocks/mockCreateGetWcpProjectEnvironment"; import { mockCreateGetWcpProjectLicense } from "./mocks/mockCreateGetWcpProjectLicense"; -jest.mock("@webiny/api-wcp/utils", () => { +vi.mock("@webiny/api-wcp/utils", async () => { // The mock returned only mocks the generateServerSeed method. - const actual = jest.requireActual("@webiny/api-wcp/utils"); + const actual = await vi.importActual("@webiny/api-wcp/utils"); return { ...actual, @@ -12,9 +12,9 @@ jest.mock("@webiny/api-wcp/utils", () => { }; }); -jest.mock("@webiny/wcp", () => { +vi.mock("@webiny/wcp", async () => { // The mock returned only mocks the generateServerSeed method. - const actual = jest.requireActual("@webiny/wcp"); + const actual = await vi.importActual("@webiny/wcp"); return { ...actual, diff --git a/packages/api-security/__tests__/withoutAuthorization.test.ts b/packages/api-security/__tests__/withoutAuthorization.test.ts index b7c0ca183e3..693deaa02cd 100644 --- a/packages/api-security/__tests__/withoutAuthorization.test.ts +++ b/packages/api-security/__tests__/withoutAuthorization.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { createSecurity } from "~/createSecurity"; import { Security, SecurityConfig, SecurityStorageOperations } from "~/types"; diff --git a/packages/api-serverless-cms/__tests__/handlers/graphQlHandler.ts b/packages/api-serverless-cms/__tests__/handlers/graphQlHandler.ts index faf845cbed1..a55973921d5 100644 --- a/packages/api-serverless-cms/__tests__/handlers/graphQlHandler.ts +++ b/packages/api-serverless-cms/__tests__/handlers/graphQlHandler.ts @@ -12,13 +12,11 @@ import { createMutationFactory } from "~tests/handlers/helpers/factory/mutation" export interface IGraphQlHandlerParams { path: PathType; plugins?: Plugin[]; - features?: boolean | string[]; + features?: boolean; } export const useGraphQlHandler = (params: IGraphQlHandlerParams) => { - const core = createCore({ - ...params - }); + const core = createCore(params); const handler = createHandler({ plugins: core.plugins, diff --git a/packages/api-serverless-cms/__tests__/handlers/helpers/core.ts b/packages/api-serverless-cms/__tests__/handlers/helpers/core.ts index e20dca2b566..53f97861b9b 100644 --- a/packages/api-serverless-cms/__tests__/handlers/helpers/core.ts +++ b/packages/api-serverless-cms/__tests__/handlers/helpers/core.ts @@ -15,29 +15,20 @@ import { createPermissions, Permission } from "./permissions"; import { PathType } from "../types"; import { TenancyStorageOperations, Tenant } from "@webiny/api-tenancy/types"; import { I18NLocalesStorageOperations } from "@webiny/api-i18n/types"; -import { PageBuilderStorageOperations } from "@webiny/api-page-builder/types"; import { FileManagerStorageOperations } from "@webiny/api-file-manager/types"; import { AdminUsersStorageOperations } from "@webiny/api-admin-users/types"; import createAdminUsersApp from "@webiny/api-admin-users"; import i18nPlugins from "@webiny/api-i18n/graphql"; -import { - createPageBuilderContext, - createPageBuilderGraphQL -} from "@webiny/api-page-builder/graphql"; import { createWebsockets } from "@webiny/api-websockets"; import { createRecordLocking } from "@webiny/api-record-locking"; import { createFileManagerContext, createFileManagerGraphQL } from "@webiny/api-file-manager"; import { createAco } from "@webiny/api-aco"; -import { createAcoPageBuilderContext } from "@webiny/api-page-builder-aco"; import { createAuditLogs } from "@webiny/api-audit-logs"; import { createAcoHcmsContext } from "@webiny/api-headless-cms-aco"; import { createHcmsTasks } from "@webiny/api-headless-cms-tasks"; import { createApwGraphQL, createApwPageBuilderContext } from "@webiny/api-apw"; -import { ApwScheduleActionStorageOperations } from "@webiny/api-apw/scheduler/types"; import { createBackgroundTaskContext, createBackgroundTaskGraphQL } from "@webiny/tasks"; -import pageBuilderImportExportPlugins from "@webiny/api-page-builder-import-export/graphql"; -import { createStorageOperations as createPageBuilderImportExportStorageOperations } from "@webiny/api-page-builder-import-export-so-ddb"; import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; import { createLogger } from "@webiny/api-log"; import { createCmsPlugins } from "../cms"; @@ -55,7 +46,6 @@ export interface ICreateCoreResult { plugins: PluginCollection; cmsStorage: HeadlessCmsStorageOperations; i18nStorage: I18NLocalesStorageOperations; - pageBuilderStorage: PageBuilderStorageOperations; fileManagerStorage: FileManagerStorageOperations; securityStorage: SecurityStorageOperations; tenancyStorage: TenancyStorageOperations; @@ -72,12 +62,10 @@ export const createCore = (params: ICreateCoreParams): ICreateCoreResult => { const cmsStorage = getStorageOps("cms"); const i18nStorage = getStorageOps("i18n"); - const pageBuilderStorage = getStorageOps("pageBuilder"); const fileManagerStorage = getStorageOps("fileManager"); const securityStorage = getStorageOps("security"); const tenancyStorage = getStorageOps("tenancy"); const adminUsersStorage = getStorageOps("adminUsers"); - const apwScheduleStorage = getStorageOps("apwSchedule"); const security = createTenancyAndSecurity({ permissions: createPermissions(permissions), @@ -87,7 +75,6 @@ export const createCore = (params: ICreateCoreParams): ICreateCoreResult => { return { cmsStorage: cmsStorage.storageOperations, i18nStorage: i18nStorage.storageOperations, - pageBuilderStorage: pageBuilderStorage.storageOperations, fileManagerStorage: fileManagerStorage.storageOperations, securityStorage: securityStorage.storageOperations, tenancyStorage: tenancyStorage.storageOperations, @@ -102,7 +89,6 @@ export const createCore = (params: ICreateCoreParams): ICreateCoreResult => { }), createWcpGraphQL(), ...cmsStorage.plugins, - ...pageBuilderStorage.plugins, ...fileManagerStorage.plugins, ...securityStorage.plugins, ...tenancyStorage.plugins, @@ -131,29 +117,16 @@ export const createCore = (params: ICreateCoreParams): ICreateCoreResult => { }), createHeadlessCmsGraphQL(), ...createCmsPlugins(), - createPageBuilderContext({ - storageOperations: pageBuilderStorage.storageOperations - }), - createPageBuilderGraphQL(), createFileManagerContext({ storageOperations: fileManagerStorage.storageOperations }), createFileManagerGraphQL(), - pageBuilderImportExportPlugins({ - storageOperations: createPageBuilderImportExportStorageOperations({ - documentClient - }) - }), - createApwPageBuilderContext({ - storageOperations: apwScheduleStorage.storageOperations - }), createAco({ documentClient }), createAuditLogs(), createRecordLocking(), createWebsockets(), ...createBackgroundTaskContext(), ...createBackgroundTaskGraphQL(), - createAcoPageBuilderContext(), createAcoHcmsContext(), createHcmsTasks(), createApwGraphQL(), diff --git a/packages/api-serverless-cms/__tests__/handlers/logger/logger.test.ts b/packages/api-serverless-cms/__tests__/handlers/logger/logger.test.ts index 2a7116abbff..98e239afa07 100644 --- a/packages/api-serverless-cms/__tests__/handlers/logger/logger.test.ts +++ b/packages/api-serverless-cms/__tests__/handlers/logger/logger.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { useGraphQlHandler } from "~tests/handlers/graphQlHandler"; describe("logger graphql", () => { diff --git a/packages/api-serverless-cms/__tests__/install.test.ts b/packages/api-serverless-cms/__tests__/install.test.ts index 9060bcccf43..06d0378e03f 100644 --- a/packages/api-serverless-cms/__tests__/install.test.ts +++ b/packages/api-serverless-cms/__tests__/install.test.ts @@ -1,9 +1,7 @@ -import { jest } from "@jest/globals"; +import { describe, it, expect, beforeEach } from "vitest"; import { useGraphQlHandler } from "./handlers/graphQlHandler"; -jest.setTimeout(90000); - -describe("install", () => { +describe("install", { timeout: 90000 }, () => { beforeEach(async () => { process.env.S3_BUCKET = "a-mock-s3-bucket-which-does-not-exist"; }); @@ -16,11 +14,10 @@ describe("install", () => { isTenancyInstalled, isSecurityInstalled, isHeadlessCmsInstalled, - isPageBuilderInstalled, isLocaleInstalled } = useGraphQlHandler({ path: "/graphql", - features: wcp === "on" ? true : false + features: wcp === "on" }); const [isAdminUsersInstalledResult] = await isAdminUsersInstalled(); @@ -69,15 +66,6 @@ describe("install", () => { } } }); - - const [isPageBuilderInstalledResult] = await isPageBuilderInstalled(); - expect(isPageBuilderInstalledResult).toEqual({ - data: { - pageBuilder: { - version: null - } - } - }); }); it.each(wcpOptions)("should install system - wcp %s", async wcp => { @@ -97,7 +85,7 @@ describe("install", () => { isLocaleInstalled } = useGraphQlHandler({ path: "/graphql", - features: wcp === "on" ? true : false + features: wcp === "on" }); const [installTenancyResult] = await installTenancy(); expect(installTenancyResult).toEqual({ @@ -167,26 +155,6 @@ describe("install", () => { } }); - const [installPageBuilderResult] = await installPageBuilder({ - variables: { - data: { - insertDemoData: false, - name: "My Website", - websiteUrl: "https://www.webiny.com" - } - } - }); - expect(installPageBuilderResult).toEqual({ - data: { - pageBuilder: { - install: { - data: true, - error: null - } - } - } - }); - const [isAdminUsersInstalledResult] = await isAdminUsersInstalled(); expect(isAdminUsersInstalledResult).toEqual({ @@ -233,14 +201,5 @@ describe("install", () => { } } }); - - const [isPageBuilderInstalledResult] = await isPageBuilderInstalled(); - expect(isPageBuilderInstalledResult).toEqual({ - data: { - pageBuilder: { - version: "true" - } - } - }); }); }); diff --git a/packages/api-serverless-cms/__tests__/introspect.test.ts b/packages/api-serverless-cms/__tests__/introspect.test.ts index 496a5653ac6..2f913552b37 100644 --- a/packages/api-serverless-cms/__tests__/introspect.test.ts +++ b/packages/api-serverless-cms/__tests__/introspect.test.ts @@ -1,12 +1,10 @@ -import { jest } from "@jest/globals"; +import { describe, it, expect, beforeEach } from "vitest"; import { useGraphQlHandler } from "./handlers/graphQlHandler"; import { PathType } from "~tests/handlers/types"; -jest.setTimeout(90000); - type Option = ["on" | "off", PathType]; -describe("introspect", () => { +describe("introspect", { timeout: 90_000 }, () => { const options: Option[] = [ ["on", "/graphql"], ["on", "/cms/manage/en-US"], @@ -27,7 +25,7 @@ describe("introspect", () => { async (wcp, path) => { const { introspect, login } = useGraphQlHandler({ path, - features: wcp === "on" ? true : false + features: wcp === "on" }); login(); diff --git a/packages/api-serverless-cms/jest.setup.js b/packages/api-serverless-cms/jest.setup.js deleted file mode 100644 index b3557c1289f..00000000000 --- a/packages/api-serverless-cms/jest.setup.js +++ /dev/null @@ -1,15 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-page-builder", "storage-operations"], - ["@webiny/api-file-manager", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"], - ["@webiny/api-admin-users", "storage-operations"], - ["@webiny/api-apw", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-serverless-cms/tsconfig.json b/packages/api-serverless-cms/tsconfig.json index ae628abcff0..a41c874f6d1 100644 --- a/packages/api-serverless-cms/tsconfig.json +++ b/packages/api-serverless-cms/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.setup.ts"], "references": [ { "path": "../api" }, { "path": "../api-aco" }, diff --git a/packages/api-serverless-cms/vitest.setup.ts b/packages/api-serverless-cms/vitest.setup.ts new file mode 100644 index 00000000000..819b67d4d51 --- /dev/null +++ b/packages/api-serverless-cms/vitest.setup.ts @@ -0,0 +1,18 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-file-manager", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"], + ["@webiny/api-admin-users", "storage-operations"] + ); + + return createTestConfig({ + path: import.meta.dirname, + presets + }); +}; diff --git a/packages/api-tenancy-so-ddb/__tests__/__api__/setupAfterEnv.js b/packages/api-tenancy-so-ddb/__tests__/__api__/setupAfterEnv.js index fb2f41f7492..9d11cdeae4b 100644 --- a/packages/api-tenancy-so-ddb/__tests__/__api__/setupAfterEnv.js +++ b/packages/api-tenancy-so-ddb/__tests__/__api__/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/api-tenant-manager/__tests__/crud.test.ts b/packages/api-tenant-manager/__tests__/crud.test.ts index 0e9ebd2efcb..6b9a286626d 100644 --- a/packages/api-tenant-manager/__tests__/crud.test.ts +++ b/packages/api-tenant-manager/__tests__/crud.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import useGqlHandler from "./useGqlHandler"; describe(`Test "Tenant Manager"`, () => { diff --git a/packages/api-tenant-manager/jest.setup.js b/packages/api-tenant-manager/jest.setup.js deleted file mode 100644 index 712d1de6f59..00000000000 --- a/packages/api-tenant-manager/jest.setup.js +++ /dev/null @@ -1,9 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-tenant-manager/tsconfig.json b/packages/api-tenant-manager/tsconfig.json index 0e7c0457b1f..2d6840d7d97 100644 --- a/packages/api-tenant-manager/tsconfig.json +++ b/packages/api-tenant-manager/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.setup.ts"], "references": [ { "path": "../api-security" }, { "path": "../api-tenancy" }, diff --git a/packages/api-tenant-manager/vitest.setup.ts b/packages/api-tenant-manager/vitest.setup.ts new file mode 100644 index 00000000000..92c1da6e776 --- /dev/null +++ b/packages/api-tenant-manager/vitest.setup.ts @@ -0,0 +1,14 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ + path: import.meta.dirname, + presets + }); +}; diff --git a/packages/api-wcp/__tests__/context.test.ts b/packages/api-wcp/__tests__/context.test.ts index 7655ffed618..1b066a2a08f 100644 --- a/packages/api-wcp/__tests__/context.test.ts +++ b/packages/api-wcp/__tests__/context.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { ContextPlugin } from "@webiny/api"; import { Context } from "@webiny/api"; import { createWcpContext } from "~/context"; diff --git a/packages/api-wcp/__tests__/utils.test.ts b/packages/api-wcp/__tests__/utils.test.ts index d97220e8a76..7922176911a 100644 --- a/packages/api-wcp/__tests__/utils.test.ts +++ b/packages/api-wcp/__tests__/utils.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { encrypt, getWcpProjectEnvironment } from "@webiny/wcp"; const dummyEnvironment = { diff --git a/packages/api-wcp/jest.config.js b/packages/api-wcp/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/api-wcp/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/api-wcp/tsconfig.json b/packages/api-wcp/tsconfig.json index 5eba1a74a65..74bad74cd20 100644 --- a/packages/api-wcp/tsconfig.json +++ b/packages/api-wcp/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [ { "path": "../api" }, { "path": "../error" }, diff --git a/packages/api-wcp/vitest.config.ts b/packages/api-wcp/vitest.config.ts new file mode 100644 index 00000000000..77c26269023 --- /dev/null +++ b/packages/api-wcp/vitest.config.ts @@ -0,0 +1,10 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ + path: import.meta.dirname, + vitestConfig: { + fileParallelism: true + } + }); +}; diff --git a/packages/api-websockets/__tests__/context/websocketsContext.test.ts b/packages/api-websockets/__tests__/context/websocketsContext.test.ts index f75a67abc0e..c6561fff147 100644 --- a/packages/api-websockets/__tests__/context/websocketsContext.test.ts +++ b/packages/api-websockets/__tests__/context/websocketsContext.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; import { WebsocketsContext } from "~/context/WebsocketsContext"; import { WebsocketsConnectionRegistry } from "~/registry"; @@ -82,9 +83,7 @@ describe("websockets context", () => { await context.send( { - id: "id-1", - displayName: "John Doe", - type: "admin" + id: "id-1" }, { data: { diff --git a/packages/api-websockets/__tests__/graphql/crud.graphql.test.ts b/packages/api-websockets/__tests__/graphql/crud.graphql.test.ts index 8ed43be848d..b4e5fcf137c 100644 --- a/packages/api-websockets/__tests__/graphql/crud.graphql.test.ts +++ b/packages/api-websockets/__tests__/graphql/crud.graphql.test.ts @@ -1,10 +1,10 @@ -import { jest } from "@jest/globals"; +import { describe, it, expect, vi } from "vitest"; import { useGraphQLHandler } from "~tests/helpers/useGraphQLHandler"; import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; import { IWebsocketsConnectionRegistryData, WebsocketsConnectionRegistry } from "~/registry"; import { IWebsocketsIdentity } from "~/context"; -jest.mock("@webiny/aws-sdk/client-apigatewaymanagementapi", () => { +vi.mock("@webiny/aws-sdk/client-apigatewaymanagementapi", () => { return { ApiGatewayManagementApiClient: class ApiGatewayManagementApiClient { async send(cmd: any) { diff --git a/packages/api-websockets/__tests__/graphql/schema.graphql.test.ts b/packages/api-websockets/__tests__/graphql/schema.graphql.test.ts index 8a4b35613ab..aaa1c13a0e4 100644 --- a/packages/api-websockets/__tests__/graphql/schema.graphql.test.ts +++ b/packages/api-websockets/__tests__/graphql/schema.graphql.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQLHandler } from "~tests/helpers/useGraphQLHandler"; describe("schema graphql", () => { diff --git a/packages/api-websockets/__tests__/handler/handler.test.ts b/packages/api-websockets/__tests__/handler/handler.test.ts index 6a94bf063a2..9139631faa5 100644 --- a/packages/api-websockets/__tests__/handler/handler.test.ts +++ b/packages/api-websockets/__tests__/handler/handler.test.ts @@ -1,4 +1,4 @@ -import { jest } from "@jest/globals"; +import { describe, it, expect, vi } from "vitest"; import { createHandler } from "~/handler/handler"; import { WebsocketsEventRoute } from "~/handler/types"; import { createMockLambdaContext } from "~tests/mocks/lambdaContext"; @@ -6,7 +6,7 @@ import { createPlugins } from "~tests/helpers/plugins"; import { createMockEvent } from "~tests/mocks/event"; import { useHandler } from "~tests/helpers/useHandler"; -jest.mock("@webiny/aws-sdk/client-apigatewaymanagementapi", () => { +vi.mock("@webiny/aws-sdk/client-apigatewaymanagementapi", () => { return { ApiGatewayManagementApiClient: class ApiGatewayManagementApiClient { async send(cmd: any) { diff --git a/packages/api-websockets/__tests__/handler/register.test.ts b/packages/api-websockets/__tests__/handler/register.test.ts index b1fcf552069..4fcfffd1ea4 100644 --- a/packages/api-websockets/__tests__/handler/register.test.ts +++ b/packages/api-websockets/__tests__/handler/register.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { registry } from "@webiny/handler-aws/registry"; import { createMockEvent } from "~tests/mocks/event"; import { createMockLambdaContext } from "~tests/mocks/lambdaContext"; diff --git a/packages/api-websockets/__tests__/registry/websocketsConnectionRegistry.test.ts b/packages/api-websockets/__tests__/registry/websocketsConnectionRegistry.test.ts index c81b639c989..53f956c9772 100644 --- a/packages/api-websockets/__tests__/registry/websocketsConnectionRegistry.test.ts +++ b/packages/api-websockets/__tests__/registry/websocketsConnectionRegistry.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { WebsocketsConnectionRegistry } from "~/registry/WebsocketsConnectionRegistry"; import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; diff --git a/packages/api-websockets/__tests__/runner/websocketsRunner.test.ts b/packages/api-websockets/__tests__/runner/websocketsRunner.test.ts index f49a6952417..ca78fd85e6a 100644 --- a/packages/api-websockets/__tests__/runner/websocketsRunner.test.ts +++ b/packages/api-websockets/__tests__/runner/websocketsRunner.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { WebsocketsRunner } from "~/runner"; import { useHandler } from "~tests/helpers/useHandler"; import { WebsocketsEventValidator } from "~/validator"; diff --git a/packages/api-websockets/__tests__/transport/WebsocketsTransport.test.ts b/packages/api-websockets/__tests__/transport/WebsocketsTransport.test.ts index ceaa328e374..875a935e441 100644 --- a/packages/api-websockets/__tests__/transport/WebsocketsTransport.test.ts +++ b/packages/api-websockets/__tests__/transport/WebsocketsTransport.test.ts @@ -1,8 +1,8 @@ -import { jest } from "@jest/globals"; +import { describe, it, expect, vi } from "vitest"; import { WebsocketsTransport } from "~/transport/WebsocketsTransport"; import { GenericRecord } from "@webiny/api/types"; -jest.mock("@webiny/aws-sdk/client-apigatewaymanagementapi", () => { +vi.mock("@webiny/aws-sdk/client-apigatewaymanagementapi", () => { return { ApiGatewayManagementApiClient: class ApiGatewayManagementApiClient { async send(cmd: any) { @@ -48,10 +48,10 @@ describe("WebsocketsTransport", () => { const transport = new WebsocketsTransport(); - jest.spyOn(console, "error").mockImplementation((error: string) => { + vi.spyOn(console, "error").mockImplementation((error: string) => { consoleLogs.error.push(error); }); - jest.spyOn(console, "log").mockImplementation((log: GenericRecord) => { + vi.spyOn(console, "log").mockImplementation((log: GenericRecord) => { consoleLogs.log.push(log); }); @@ -83,10 +83,10 @@ describe("WebsocketsTransport", () => { const transport = new WebsocketsTransport(); - jest.spyOn(console, "error").mockImplementation((error: string) => { + vi.spyOn(console, "error").mockImplementation((error: string) => { consoleLogs.error.push(error); }); - jest.spyOn(console, "log").mockImplementation((log: GenericRecord) => { + vi.spyOn(console, "log").mockImplementation((log: GenericRecord) => { consoleLogs.log.push(log); }); diff --git a/packages/api-websockets/__tests__/utils/middleware.ts b/packages/api-websockets/__tests__/utils/middleware.test.ts similarity index 98% rename from packages/api-websockets/__tests__/utils/middleware.ts rename to packages/api-websockets/__tests__/utils/middleware.test.ts index c399e5ff0c4..c0ba9c5dfaa 100644 --- a/packages/api-websockets/__tests__/utils/middleware.ts +++ b/packages/api-websockets/__tests__/utils/middleware.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { middleware, MiddlewareCallable as BaseMiddlewareCallable } from "~/utils/middleware"; interface MiddlewareCallable extends BaseMiddlewareCallable { diff --git a/packages/api-websockets/__tests__/validator/WebsocketsEventValidator.test.ts b/packages/api-websockets/__tests__/validator/WebsocketsEventValidator.test.ts index b9ad69bea32..745b1c1ae0f 100644 --- a/packages/api-websockets/__tests__/validator/WebsocketsEventValidator.test.ts +++ b/packages/api-websockets/__tests__/validator/WebsocketsEventValidator.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { WebsocketsEventValidator } from "~/validator/WebsocketsEventValidator"; import { WebsocketsEventRequestContextEventType } from "~/handler/types"; diff --git a/packages/api-websockets/jest.setup.js b/packages/api-websockets/jest.setup.js deleted file mode 100644 index 049095053ae..00000000000 --- a/packages/api-websockets/jest.setup.js +++ /dev/null @@ -1,11 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-websockets/tsconfig.json b/packages/api-websockets/tsconfig.json index b2ec93859a7..1d9383a6e59 100644 --- a/packages/api-websockets/tsconfig.json +++ b/packages/api-websockets/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [ { "path": "../api" }, { "path": "../api-i18n" }, diff --git a/packages/api-websockets/vitest.config.ts b/packages/api-websockets/vitest.config.ts new file mode 100644 index 00000000000..c6e2ef77e91 --- /dev/null +++ b/packages/api-websockets/vitest.config.ts @@ -0,0 +1,16 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ + path: import.meta.dirname, + presets + }); +}; diff --git a/packages/api/__tests__/Context.test.ts b/packages/api/__tests__/Context.test.ts index e160169bbaf..129d2e94da1 100644 --- a/packages/api/__tests__/Context.test.ts +++ b/packages/api/__tests__/Context.test.ts @@ -1,5 +1,6 @@ +import { describe, it, expect } from "vitest"; import { CompressorPlugin, Context } from "~/index"; -import { Context as ContextInterface } from "~/types"; +import type { Context as ContextInterface } from "~/types"; import { Benchmark } from "~/Benchmark"; import { BenchmarkPlugin } from "~/plugins/BenchmarkPlugin"; import { GzipCompression, JsonpackCompression } from "@webiny/utils/compression"; @@ -83,11 +84,6 @@ describe("Context", () => { loaded: true }; - expect(tester).toEqual({ - cms: 1, - pageBuilder: 0 - }); - expect(tester).toEqual({ cms: 1, pageBuilder: 1 diff --git a/packages/api/__tests__/ServiceDiscovery.test.ts b/packages/api/__tests__/ServiceDiscovery.test.ts index 5def45a9af6..42a0ee39ca3 100644 --- a/packages/api/__tests__/ServiceDiscovery.test.ts +++ b/packages/api/__tests__/ServiceDiscovery.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { PutCommand } from "@webiny/aws-sdk/client-dynamodb"; import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; import { ServiceDiscovery } from "~/ServiceDiscovery"; diff --git a/packages/api/__tests__/benchmark.test.ts b/packages/api/__tests__/benchmark.test.ts index 7cab78c78b8..51754c11328 100644 --- a/packages/api/__tests__/benchmark.test.ts +++ b/packages/api/__tests__/benchmark.test.ts @@ -1,8 +1,8 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { Context } from "~/Context"; import { BenchmarkMeasurement } from "~/types"; import { BenchmarkPlugin } from "~/plugins/BenchmarkPlugin"; import { ContextPlugin } from "~/plugins/ContextPlugin"; -import { jest } from "@jest/globals"; const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); @@ -265,7 +265,7 @@ describe("benchmark", () => { expect(context.benchmark.measurements).toHaveLength(5); const log: any[] = []; - jest.spyOn(console, "log").mockImplementation((...args) => { + vi.spyOn(console, "log").mockImplementation((...args) => { log.push(...args); }); @@ -307,7 +307,7 @@ describe("benchmark", () => { const outsideSystemLog: any[] = []; const log: any[] = []; - jest.spyOn(console, "log").mockImplementation((...args) => { + vi.spyOn(console, "log").mockImplementation((...args) => { log.push(...args); }); @@ -372,7 +372,7 @@ describe("benchmark", () => { const outsideSystemLog: any[] = []; const log: any[] = []; - jest.spyOn(console, "log").mockImplementation((...args) => { + vi.spyOn(console, "log").mockImplementation((...args) => { log.push(...args); }); @@ -422,7 +422,7 @@ describe("benchmark", () => { expect(result).toEqual("level 3"); expect(context.benchmark.measurements).toHaveLength(3); const logs: any[] = []; - jest.spyOn(console, "log").mockImplementation((...args) => { + vi.spyOn(console, "log").mockImplementation((...args) => { logs.push(...args); }); diff --git a/packages/api/__tests__/setup/setupAfterEnv.js b/packages/api/__tests__/setup/setupAfterEnv.js index d335a2b969d..9d11cdeae4b 100644 --- a/packages/api/__tests__/setup/setupAfterEnv.js +++ b/packages/api/__tests__/setup/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); - await setupDynalite(setupPath); + const setupPath = resolve(import.meta.dirname, "../../"); + await setupDynalite(setupPath); })(); diff --git a/packages/api/jest.setup.js b/packages/api/jest.setup.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/api/jest.setup.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json index 5ecad8eb169..d3657b27450 100644 --- a/packages/api/tsconfig.json +++ b/packages/api/tsconfig.json @@ -1,62 +1,36 @@ { - "extends": "../../tsconfig.json", - "include": [ - "src", - "__tests__" - ], - "references": [ - { - "path": "../aws-sdk" - }, - { - "path": "../plugins" - }, - { - "path": "../utils" - }, - { - "path": "../project" - } - ], - "compilerOptions": { - "rootDirs": [ - "./src", - "./__tests__" - ], - "outDir": "./dist", - "declarationDir": "./dist", - "paths": { - "~/*": [ - "./src/*" - ], - "~tests/*": [ - "./__tests__/*" - ], - "@webiny/aws-sdk/*": [ - "../aws-sdk/src/*" - ], - "@webiny/aws-sdk": [ - "../aws-sdk/src" - ], - "@webiny/plugins/*": [ - "../plugins/src/*" - ], - "@webiny/plugins": [ - "../plugins/src" - ], - "@webiny/utils/*": [ - "../utils/src/*" - ], - "@webiny/utils": [ - "../utils/src" - ], - "@webiny/project/*": [ - "../project/src/*" - ], - "@webiny/project": [ - "../project/src" - ] - }, - "baseUrl": "." - } + "extends": "../../tsconfig.json", + "include": ["src", "__tests__", "vitest.config.ts"], + "references": [ + { + "path": "../aws-sdk" + }, + { + "path": "../plugins" + }, + { + "path": "../utils" + }, + { + "path": "../project" + } + ], + "compilerOptions": { + "rootDirs": ["./src", "./__tests__"], + "outDir": "./dist", + "declarationDir": "./dist", + "paths": { + "~/*": ["./src/*"], + "~tests/*": ["./__tests__/*"], + "@webiny/aws-sdk/*": ["../aws-sdk/src/*"], + "@webiny/aws-sdk": ["../aws-sdk/src"], + "@webiny/plugins/*": ["../plugins/src/*"], + "@webiny/plugins": ["../plugins/src"], + "@webiny/utils/*": ["../utils/src/*"], + "@webiny/utils": ["../utils/src"], + "@webiny/project/*": ["../project/src/*"], + "@webiny/project": ["../project/src"] + }, + "baseUrl": "." + } } diff --git a/packages/api/vitest.config.ts b/packages/api/vitest.config.ts new file mode 100644 index 00000000000..bb4c9279b9d --- /dev/null +++ b/packages/api/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname }); +}; diff --git a/packages/data-migration/__tests__/migration.test.ts b/packages/data-migration/__tests__/migration.test.ts index fe2feb50373..d5e0ae37584 100644 --- a/packages/data-migration/__tests__/migration.test.ts +++ b/packages/data-migration/__tests__/migration.test.ts @@ -1,4 +1,4 @@ -import { jest } from "@jest/globals"; +import { describe, it, expect, beforeEach, vi } from "vitest"; import { getDocumentClient } from "@webiny/aws-sdk/client-dynamodb"; import { useHandler } from "~tests/useHandler"; import { createTable } from "~/createTable"; @@ -14,8 +14,6 @@ import { MigrationRepositoryImpl } from "~/repository/migrations.repository"; import { createDdbProjectMigration } from "~/handlers/createDdbProjectMigration"; import { DbItem, scan } from "@webiny/db-dynamodb"; -jest.retryTimes(0); - function assertNotError( error: MigrationInvocationErrorResponse["error"] | undefined ): asserts error is undefined { @@ -41,7 +39,7 @@ const groupMigrations = (migrations: MigrationRunItem[]) => { }; }; -describe("Migration Lambda Handler", () => { +describe("Migration Lambda Handler", { retry: 0 }, () => { const documentClient = getDocumentClient({ endpoint: process.env.MOCK_DYNAMODB_ENDPOINT || "http://localhost:8001", tls: false, @@ -164,7 +162,7 @@ describe("Migration Lambda Handler", () => { createDdbMigration("0.1.0-003") ]; - const spy = jest.spyOn(allMigrations[0].prototype, "execute"); + const spy = vi.spyOn(allMigrations[0].prototype, "execute"); const handler = useHandler( createDdbProjectMigration({ @@ -237,7 +235,7 @@ describe("Migration Lambda Handler", () => { createDdbMigration("3.0.0-002") ]; - const spies = allMigrations.map(klass => jest.spyOn(klass.prototype, "execute")); + const spies = allMigrations.map(klass => vi.spyOn(klass.prototype, "execute")); const handler = useHandler( createDdbProjectMigration({ @@ -272,7 +270,7 @@ describe("Migration Lambda Handler", () => { // Should NOT run any migrations. { - jest.clearAllMocks(); + vi.clearAllMocks(); const { data, error } = await handler({ version: "0.1.0" }); assertNotError(error); diff --git a/packages/data-migration/__tests__/setup/setupAfterEnv.js b/packages/data-migration/__tests__/setup/setupAfterEnv.js index d335a2b969d..b2c7521ed7c 100644 --- a/packages/data-migration/__tests__/setup/setupAfterEnv.js +++ b/packages/data-migration/__tests__/setup/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/data-migration/jest.config.js b/packages/data-migration/jest.config.js deleted file mode 100644 index ce2a1cae33d..00000000000 --- a/packages/data-migration/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const base = require("../../jest.config.base"); - -module.exports = base({ path: __dirname }); diff --git a/packages/data-migration/tsconfig.json b/packages/data-migration/tsconfig.json index f5edf9df3cf..f92a485f1d1 100644 --- a/packages/data-migration/tsconfig.json +++ b/packages/data-migration/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [ { "path": "../aws-sdk" }, { "path": "../db-dynamodb" }, diff --git a/packages/data-migration/vitest.config.ts b/packages/data-migration/vitest.config.ts new file mode 100644 index 00000000000..bb4c9279b9d --- /dev/null +++ b/packages/data-migration/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname }); +}; diff --git a/packages/db-dynamodb/__tests__/DynamoDbDriver.test.ts b/packages/db-dynamodb/__tests__/DynamoDbDriver.test.ts index d71ca743550..2720766ae00 100644 --- a/packages/db-dynamodb/__tests__/DynamoDbDriver.test.ts +++ b/packages/db-dynamodb/__tests__/DynamoDbDriver.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import DynamoDbDriver from "~/DynamoDbDriver"; import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; diff --git a/packages/db-dynamodb/__tests__/assignFields.test.ts b/packages/db-dynamodb/__tests__/assignFields.test.ts index 7e52dc92052..bfe16f227fa 100644 --- a/packages/db-dynamodb/__tests__/assignFields.test.ts +++ b/packages/db-dynamodb/__tests__/assignFields.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { assignFields } from "~/plugins/definitions/assignFields"; describe("assign fields", () => { diff --git a/packages/db-dynamodb/__tests__/plugins/attributesUtil.test.ts b/packages/db-dynamodb/__tests__/plugins/attributesUtil.test.ts index 6e6153743f6..24cd1de0949 100644 --- a/packages/db-dynamodb/__tests__/plugins/attributesUtil.test.ts +++ b/packages/db-dynamodb/__tests__/plugins/attributesUtil.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { Context } from "@webiny/api"; import { getExtraAttributes } from "~/utils/attributes"; import { AttributePlugin, AttributePluginParams } from "~/plugins/definitions/AttributePlugin"; diff --git a/packages/db-dynamodb/__tests__/plugins/filterUtil.test.ts b/packages/db-dynamodb/__tests__/plugins/filterUtil.test.ts index 0c544ac056a..bd9cdbc2712 100644 --- a/packages/db-dynamodb/__tests__/plugins/filterUtil.test.ts +++ b/packages/db-dynamodb/__tests__/plugins/filterUtil.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { filterItems } from "~/utils/filter"; import filters from "~/plugins/filters"; import { PluginsContainer } from "@webiny/plugins"; diff --git a/packages/db-dynamodb/__tests__/plugins/filters.test.ts b/packages/db-dynamodb/__tests__/plugins/filters.test.ts index 117d2d1ac9d..a63a417f14f 100644 --- a/packages/db-dynamodb/__tests__/plugins/filters.test.ts +++ b/packages/db-dynamodb/__tests__/plugins/filters.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect, beforeEach } from "vitest"; import { PluginsContainer } from "@webiny/plugins"; import filterPlugins from "~/plugins/filters"; import { ValueFilterPlugin } from "~/plugins/definitions/ValueFilterPlugin"; diff --git a/packages/db-dynamodb/__tests__/setup/setupAfterEnv.js b/packages/db-dynamodb/__tests__/setup/setupAfterEnv.js index d335a2b969d..b2c7521ed7c 100644 --- a/packages/db-dynamodb/__tests__/setup/setupAfterEnv.js +++ b/packages/db-dynamodb/__tests__/setup/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); diff --git a/packages/db-dynamodb/jest.config.js b/packages/db-dynamodb/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/db-dynamodb/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/db-dynamodb/tsconfig.json b/packages/db-dynamodb/tsconfig.json index df4af1353b1..019cce33b0a 100644 --- a/packages/db-dynamodb/tsconfig.json +++ b/packages/db-dynamodb/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [ { "path": "../api" }, { "path": "../aws-sdk" }, diff --git a/packages/db-dynamodb/vitest.config.ts b/packages/db-dynamodb/vitest.config.ts new file mode 100644 index 00000000000..bb4c9279b9d --- /dev/null +++ b/packages/db-dynamodb/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname }); +}; diff --git a/packages/di-container/__tests__/container.test.ts b/packages/di-container/__tests__/container.test.ts index b3922fbfad5..0c52f25c453 100644 --- a/packages/di-container/__tests__/container.test.ts +++ b/packages/di-container/__tests__/container.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect, beforeEach, vi } from "vitest"; import { Container, Abstraction, @@ -7,7 +8,6 @@ import { createComposite, isComposite } from "~/index.js"; -import { jest } from "@jest/globals"; // Mock implementations for testing interface ILogger { log(...args: unknown[]): void; @@ -294,7 +294,7 @@ describe("DIContainer", () => { expect(decoratedLogger).toBeInstanceOf(LoggerDecorator); // Verify that the decorator actually calls the original implementation - const consoleSpy = jest.spyOn(console, "log"); + const consoleSpy = vi.spyOn(console, "log"); decoratedLogger.log("Testing decorator on instance"); expect(consoleSpy).toHaveBeenCalledWith("Decorated:"); expect(consoleSpy).toHaveBeenCalledWith("ConsoleLogger:", "Testing decorator on instance"); @@ -402,7 +402,7 @@ describe("DIContainer", () => { expect(logger).toBeInstanceOf(FormattingLoggerDecorator); // Verify that the decorator uses both the formatter and the decoratee - const consoleSpy = jest.spyOn(console, "log"); + const consoleSpy = vi.spyOn(console, "log"); logger.log("hello world"); expect(consoleSpy).toHaveBeenCalledWith("ConsoleLogger:", "HELLO WORLD"); consoleSpy.mockRestore(); diff --git a/packages/di-container/jest.config.js b/packages/di-container/jest.config.js deleted file mode 100644 index 3a4fca47d83..00000000000 --- a/packages/di-container/jest.config.js +++ /dev/null @@ -1,10 +0,0 @@ -import { fileURLToPath } from "url"; - -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ - path: import.meta.dirname, - setupFilesAfterEnv: [fileURLToPath(import.meta.resolve("./__tests__/setupEnv.ts"))] - }); -}; diff --git a/packages/di-container/tsconfig.json b/packages/di-container/tsconfig.json index 6ca26f3c929..3f3851da295 100644 --- a/packages/di-container/tsconfig.json +++ b/packages/di-container/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [], "compilerOptions": { "rootDirs": ["./src", "./__tests__"], diff --git a/packages/di-container/vitest.config.ts b/packages/di-container/vitest.config.ts new file mode 100644 index 00000000000..0956cf4ea9c --- /dev/null +++ b/packages/di-container/vitest.config.ts @@ -0,0 +1,11 @@ +import { fileURLToPath } from "url"; +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ + path: import.meta.dirname, + vitestConfig: { + setupFiles: [fileURLToPath(import.meta.resolve("./__tests__/setupEnv.ts"))] + } + }); +}; diff --git a/packages/handler-aws/__tests__/composedEventHandlers.test.ts b/packages/handler-aws/__tests__/composedEventHandlers.test.ts index 65b0eb8e229..1e5d8f1cda0 100644 --- a/packages/handler-aws/__tests__/composedEventHandlers.test.ts +++ b/packages/handler-aws/__tests__/composedEventHandlers.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import type { DynamoDBStreamEvent, EventBridgeEvent, diff --git a/packages/handler-aws/__tests__/eventBridge.test.ts b/packages/handler-aws/__tests__/eventBridge.test.ts index 66ef8dddf4e..b7ae2b19975 100644 --- a/packages/handler-aws/__tests__/eventBridge.test.ts +++ b/packages/handler-aws/__tests__/eventBridge.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import type { GenericRecord } from "@webiny/utils"; import { createEventBridgeEventHandler, createHandler } from "~/index"; import { LambdaContext } from "~/types"; diff --git a/packages/handler-aws/__tests__/gateway.test.ts b/packages/handler-aws/__tests__/gateway.test.ts index d945a2f1042..f5e3ec447ee 100644 --- a/packages/handler-aws/__tests__/gateway.test.ts +++ b/packages/handler-aws/__tests__/gateway.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { createHandler, RoutePlugin } from "~/index"; import { createLambdaContext } from "./mocks/lambdaContext"; import { createLambdaEvent } from "./mocks/lambdaEvent"; diff --git a/packages/handler-aws/__tests__/handler.test.ts b/packages/handler-aws/__tests__/handler.test.ts index 37905276653..83c55c218e3 100644 --- a/packages/handler-aws/__tests__/handler.test.ts +++ b/packages/handler-aws/__tests__/handler.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { DynamoDBStreamEvent, EventBridgeEvent, diff --git a/packages/handler-aws/__tests__/raw.test.ts b/packages/handler-aws/__tests__/raw.test.ts index 7f8b153ea69..43264d7edcd 100644 --- a/packages/handler-aws/__tests__/raw.test.ts +++ b/packages/handler-aws/__tests__/raw.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { createHandler } from "~/raw"; import { EventPlugin } from "@webiny/handler"; import { LambdaContext } from "./types"; diff --git a/packages/handler-aws/__tests__/s3.test.ts b/packages/handler-aws/__tests__/s3.test.ts index 26998d2175f..c1be20d9429 100644 --- a/packages/handler-aws/__tests__/s3.test.ts +++ b/packages/handler-aws/__tests__/s3.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { createHandler, S3EventHandler } from "~/index"; import { createLambdaContext } from "./mocks/lambdaContext"; import { createS3Event } from "./mocks/s3Event"; diff --git a/packages/handler-aws/jest.config.js b/packages/handler-aws/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/handler-aws/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/handler-aws/tsconfig.json b/packages/handler-aws/tsconfig.json index 0628fcb333a..57cb7872581 100644 --- a/packages/handler-aws/tsconfig.json +++ b/packages/handler-aws/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [ { "path": "../aws-sdk" }, { "path": "../handler" }, diff --git a/packages/handler-aws/vitest.config.ts b/packages/handler-aws/vitest.config.ts new file mode 100644 index 00000000000..bb4c9279b9d --- /dev/null +++ b/packages/handler-aws/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname }); +}; diff --git a/packages/handler-client/jest.config.js b/packages/handler-client/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/handler-client/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/handler-graphql/__tests__/DateTimeZScalar.test.ts b/packages/handler-graphql/__tests__/DateTimeZScalar.test.ts index 3174a890cb5..5635f102dd5 100644 --- a/packages/handler-graphql/__tests__/DateTimeZScalar.test.ts +++ b/packages/handler-graphql/__tests__/DateTimeZScalar.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { DateTimeZScalar } from "~/builtInTypes"; describe("DateTimeZScalar", () => { diff --git a/packages/handler-graphql/__tests__/NumberScalar.test.ts b/packages/handler-graphql/__tests__/NumberScalar.test.ts index b1d3b679ffb..c8938bfb2ad 100644 --- a/packages/handler-graphql/__tests__/NumberScalar.test.ts +++ b/packages/handler-graphql/__tests__/NumberScalar.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { NumberScalar } from "~/builtInTypes"; describe("NumberScalar", () => { diff --git a/packages/handler-graphql/__tests__/TimeScalar.test.ts b/packages/handler-graphql/__tests__/TimeScalar.test.ts index 311458e7b35..4b515e8e2c8 100644 --- a/packages/handler-graphql/__tests__/TimeScalar.test.ts +++ b/packages/handler-graphql/__tests__/TimeScalar.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import { TimeScalar } from "~/builtInTypes"; describe("TimeScalar", () => { diff --git a/packages/handler-graphql/__tests__/disableIntrospectionQuery.test.ts b/packages/handler-graphql/__tests__/disableIntrospectionQuery.test.ts index f5759dbd124..c3ed9107aad 100644 --- a/packages/handler-graphql/__tests__/disableIntrospectionQuery.test.ts +++ b/packages/handler-graphql/__tests__/disableIntrospectionQuery.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import useGqlHandler from "./useGqlHandler"; import { BeforeHandlerPlugin } from "@webiny/handler"; import { booksCrudPlugin, booksSchema } from "~tests/mocks/booksSchema"; diff --git a/packages/handler-graphql/__tests__/graphql.test.ts b/packages/handler-graphql/__tests__/graphql.test.ts index aa11cf55783..e1278eb76d2 100644 --- a/packages/handler-graphql/__tests__/graphql.test.ts +++ b/packages/handler-graphql/__tests__/graphql.test.ts @@ -1,3 +1,4 @@ +import { describe, test, expect } from "vitest"; import useGqlHandler from "./useGqlHandler"; import { booksSchema, booksCrudPlugin } from "~tests/mocks/booksSchema"; import { createGraphQLSchemaPlugin } from "~/plugins"; diff --git a/packages/handler-graphql/jest.config.js b/packages/handler-graphql/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/handler-graphql/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/handler-graphql/tsconfig.json b/packages/handler-graphql/tsconfig.json index 60b3bd9a0dc..1d70fe9f42e 100644 --- a/packages/handler-graphql/tsconfig.json +++ b/packages/handler-graphql/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [ { "path": "../api" }, { "path": "../error" }, diff --git a/packages/handler-graphql/vitest.config.ts b/packages/handler-graphql/vitest.config.ts new file mode 100644 index 00000000000..bb4c9279b9d --- /dev/null +++ b/packages/handler-graphql/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname }); +}; diff --git a/packages/handler/__tests__/benchmark.test.ts b/packages/handler/__tests__/benchmark.test.ts index 2d4ef6e4ae6..622e1acf9fa 100644 --- a/packages/handler/__tests__/benchmark.test.ts +++ b/packages/handler/__tests__/benchmark.test.ts @@ -1,7 +1,8 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { createHandler } from "~/fastify"; import { createRoute } from "~/plugins/RoutePlugin"; import type { FastifyInstance } from "fastify"; -import { jest } from "@jest/globals"; + const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); describe("benchmark", () => { @@ -40,7 +41,7 @@ describe("benchmark", () => { const logs: any[] = []; - jest.spyOn(console, "log").mockImplementation((...args) => { + vi.spyOn(console, "log").mockImplementation((...args) => { logs.push(...args); }); diff --git a/packages/handler/__tests__/caching.test.ts b/packages/handler/__tests__/caching.test.ts index 834d7849dbf..5d5602d009d 100644 --- a/packages/handler/__tests__/caching.test.ts +++ b/packages/handler/__tests__/caching.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { createHandler } from "~/fastify"; import { DummyCache } from "./caching/DummyCache"; import { createCachingPlugin } from "./caching/cachePlugin"; diff --git a/packages/handler/__tests__/customErrorHandler.test.ts b/packages/handler/__tests__/customErrorHandler.test.ts index 6ead633f0bd..ea3764c92bb 100644 --- a/packages/handler/__tests__/customErrorHandler.test.ts +++ b/packages/handler/__tests__/customErrorHandler.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { createHandler } from "~/fastify"; import { createRoute } from "~/plugins/RoutePlugin"; import WebinyError from "@webiny/error"; diff --git a/packages/handler/__tests__/headers.test.ts b/packages/handler/__tests__/headers.test.ts index a0e83c6d113..46c6fdc0f92 100644 --- a/packages/handler/__tests__/headers.test.ts +++ b/packages/handler/__tests__/headers.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { ResponseHeaders } from "~/ResponseHeaders"; import { createHandler } from "~/fastify"; import { createRoute } from "~/plugins/RoutePlugin"; diff --git a/packages/handler/__tests__/modifyFastify.test.ts b/packages/handler/__tests__/modifyFastify.test.ts index 62887058165..3b3391fb244 100644 --- a/packages/handler/__tests__/modifyFastify.test.ts +++ b/packages/handler/__tests__/modifyFastify.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { createHandler } from "~/fastify"; import { createModifyFastifyPlugin } from "~/plugins/ModifyFastifyPlugin"; diff --git a/packages/handler/__tests__/onRequest.test.ts b/packages/handler/__tests__/onRequest.test.ts index 3df36406cc2..1e5080a3070 100644 --- a/packages/handler/__tests__/onRequest.test.ts +++ b/packages/handler/__tests__/onRequest.test.ts @@ -1,9 +1,7 @@ +import { describe, it, expect } from "vitest"; import { createHandler } from "~/fastify"; import { createRoute } from "~/plugins/RoutePlugin"; import { createHandlerOnRequest } from "~/plugins/HandlerOnRequestPlugin"; -import { jest } from "@jest/globals"; - -jest.setTimeout(5000); const createRoutes = () => { return createRoute(({ onPost, onOptions }) => { @@ -20,7 +18,7 @@ const createRoutes = () => { }); }; -describe("fastify onRequest event", () => { +describe("fastify onRequest event", { timeout: 5000 }, () => { it("should return our built-in headers when sending options request", async () => { const app = createHandler({ plugins: [createRoutes()] diff --git a/packages/handler/__tests__/routes.test.ts b/packages/handler/__tests__/routes.test.ts index 92cc6922a11..7a83d6c577f 100644 --- a/packages/handler/__tests__/routes.test.ts +++ b/packages/handler/__tests__/routes.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { createHandler, RoutePlugin } from "~/index"; import { DefinedContextRoutes } from "~/types"; diff --git a/packages/handler/jest.config.js b/packages/handler/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/handler/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/handler/tsconfig.json b/packages/handler/tsconfig.json index bf33bca4d29..78734b2d1f3 100644 --- a/packages/handler/tsconfig.json +++ b/packages/handler/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [ { "path": "../api" }, { "path": "../error" }, diff --git a/packages/handler/vitest.config.ts b/packages/handler/vitest.config.ts new file mode 100644 index 00000000000..bb4c9279b9d --- /dev/null +++ b/packages/handler/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname }); +}; diff --git a/packages/migrations/__tests__/setup/setupAfterEnv.js b/packages/migrations/__tests__/setup/setupAfterEnv.js index d335a2b969d..b2c7521ed7c 100644 --- a/packages/migrations/__tests__/setup/setupAfterEnv.js +++ b/packages/migrations/__tests__/setup/setupAfterEnv.js @@ -2,7 +2,6 @@ import { resolve } from "path"; import { setupDynalite } from "@webiny/project-utils/testing/dynalite/index.js"; (async () => { - const dirname = new URL(".", import.meta.url).toString().replace("file://", ""); - const setupPath = resolve(dirname, "../../"); + const setupPath = resolve(import.meta.dirname, "../../"); await setupDynalite(setupPath); })(); From d79af5460f415b4f1738b80d577cf520ef21d24a Mon Sep 17 00:00:00 2001 From: Pavel Denisjuk Date: Fri, 5 Sep 2025 14:13:56 +0200 Subject: [PATCH 03/13] wip: migrate tests to vitest --- packages/i18n/__tests__/date.test.js | 3 +- packages/i18n/__tests__/datetime.test.js | 4 +- packages/i18n/__tests__/extract.test.js | 4 +- packages/i18n/__tests__/extract/example1.js | 2 +- packages/i18n/__tests__/extract/example3.js | 2 +- packages/i18n/__tests__/getSetLocale.test.js | 4 +- .../i18n/__tests__/getSetTranslations.test.js | 4 +- packages/i18n/__tests__/modifiers.test.js | 4 +- packages/i18n/__tests__/number.test.js | 4 +- packages/i18n/__tests__/price.test.js | 3 +- .../__tests__/registeringModifiers.test.js | 3 +- packages/i18n/__tests__/time.test.js | 3 +- packages/i18n/__tests__/translate.test.js | 3 +- packages/i18n/src/processors/default.ts | 3 +- packages/i18n/tsconfig.json | 2 +- packages/i18n/vitest.config.ts | 10 +++++ packages/ioc/__tests__/container.test.ts | 2 + packages/ioc/__tests__/useCases/builder.ts | 12 ------ .../ioc/__tests__/useCases/models.test.ts | 3 ++ .../ioc/__tests__/useCases/nested.test.ts | 37 +------------------ packages/ioc/jest.config.js | 5 --- packages/ioc/tsconfig.json | 2 +- packages/ioc/vitest.config.ts | 10 +++++ packages/lexical-converter/vitest.config.ts | 6 --- .../migrations/5.43.0/001/ddb-es/001.test.ts | 14 +++---- .../migrations/5.43.0/001/ddb/001.test.ts | 14 +++---- .../utils/logTestNameBeforeEachTest.ts | 2 + .../__tests__/validateMigrations.test.ts | 5 +-- packages/migrations/jest.config.js | 3 -- packages/migrations/tsconfig.json | 2 +- packages/migrations/vitest.config.ts | 7 ++++ .../__tests__/AsyncPluginsContainer.test.ts | 2 + .../__tests__/pluginsContainer.test.ts | 23 ++++++------ packages/plugins/jest.config.js | 5 --- packages/plugins/tsconfig.json | 2 +- packages/plugins/vitest.config.ts | 10 +++++ packages/pubsub/__tests__/pubsub.test.ts | 2 + packages/pubsub/jest.config.js | 5 --- packages/pubsub/tsconfig.json | 2 +- packages/pubsub/vitest.config.ts | 10 +++++ .../__tests__/composition.test.tsx | 4 +- .../__tests__/decorators.test.tsx | 6 +-- .../react-composition/__tests__/setupEnv.ts | 8 ++-- packages/react-composition/jest.config.js | 6 --- packages/react-composition/vitest.config.ts | 13 +++++++ .../cases/dashboard/dashboard.test.tsx | 10 ++--- .../docs/{components.js => components.tsx} | 3 +- .../__tests__/cases/docs/docs.test.tsx | 10 ++--- .../docs/{navigation.js => navigation.tsx} | 1 + .../gql-query-builder/gqlBuilder.test.tsx | 6 +-- .../pbEditorSettings/PbEditorSettingsView.tsx | 5 ++- .../pbEditorSettings.test.tsx | 22 +++++------ .../__tests__/properties.test.tsx | 34 ++++++++--------- packages/react-properties/jest.config.js | 6 --- packages/react-properties/tsconfig.json | 2 +- packages/react-properties/vitest.config.ts | 13 +++++++ .../__tests__/lexical-renderer.test.tsx | 29 ++++++++------- .../jest.config.js | 9 ----- .../vitest.config.ts | 10 +++++ packages/wcp/jest.config.js | 5 --- testing/createTestConfig.ts | 4 +- 61 files changed, 224 insertions(+), 225 deletions(-) create mode 100644 packages/i18n/vitest.config.ts delete mode 100644 packages/ioc/__tests__/useCases/builder.ts delete mode 100644 packages/ioc/jest.config.js create mode 100644 packages/ioc/vitest.config.ts delete mode 100644 packages/migrations/jest.config.js create mode 100644 packages/migrations/vitest.config.ts delete mode 100644 packages/plugins/jest.config.js create mode 100644 packages/plugins/vitest.config.ts delete mode 100644 packages/pubsub/jest.config.js create mode 100644 packages/pubsub/vitest.config.ts delete mode 100644 packages/react-composition/jest.config.js create mode 100644 packages/react-composition/vitest.config.ts rename packages/react-properties/__tests__/cases/docs/{components.js => components.tsx} (98%) rename packages/react-properties/__tests__/cases/docs/{navigation.js => navigation.tsx} (99%) delete mode 100644 packages/react-properties/jest.config.js create mode 100644 packages/react-properties/vitest.config.ts delete mode 100644 packages/react-rich-text-lexical-renderer/jest.config.js create mode 100644 packages/react-rich-text-lexical-renderer/vitest.config.ts delete mode 100644 packages/wcp/jest.config.js diff --git a/packages/i18n/__tests__/date.test.js b/packages/i18n/__tests__/date.test.js index 5b28af6be0f..fc80ba78da6 100644 --- a/packages/i18n/__tests__/date.test.js +++ b/packages/i18n/__tests__/date.test.js @@ -1,4 +1,5 @@ -import i18n from "@webiny/i18n"; +import { describe, test, expect } from "vitest"; +import i18n from "~/index"; describe("date test", () => { // With below given format (no timezone), Date assumes passed value is in current timezone. diff --git a/packages/i18n/__tests__/datetime.test.js b/packages/i18n/__tests__/datetime.test.js index 1f527ca27fa..1c8fa7ebdd2 100644 --- a/packages/i18n/__tests__/datetime.test.js +++ b/packages/i18n/__tests__/datetime.test.js @@ -1,4 +1,6 @@ -import i18n from "@webiny/i18n"; +import { describe, test, expect } from "vitest"; + +import i18n from "~/index"; describe("datetime test", () => { // With below given format (no timezone), Date assumes passed value is in current timezone. diff --git a/packages/i18n/__tests__/extract.test.js b/packages/i18n/__tests__/extract.test.js index 8615253e8f2..5bcf661283e 100644 --- a/packages/i18n/__tests__/extract.test.js +++ b/packages/i18n/__tests__/extract.test.js @@ -1,4 +1,6 @@ -import extract from "@webiny/i18n/extractor/extract"; +import { describe, test, expect } from "vitest"; + +import extract from "~/extractor/extract"; import example1 from "./extract/example1"; import example2 from "./extract/example2"; diff --git a/packages/i18n/__tests__/extract/example1.js b/packages/i18n/__tests__/extract/example1.js index cdd7d9b94e5..27d269d5dfc 100644 --- a/packages/i18n/__tests__/extract/example1.js +++ b/packages/i18n/__tests__/extract/example1.js @@ -1,5 +1,5 @@ export default ` - import i18n from "@webiny/i18n"; + import i18n from "~/index"; const t1 = i18n.namespace('ns1'); const t2 = i18n.namespace('ns2'); diff --git a/packages/i18n/__tests__/extract/example3.js b/packages/i18n/__tests__/extract/example3.js index 5f8cb4fac2a..c2cbdd9025e 100644 --- a/packages/i18n/__tests__/extract/example3.js +++ b/packages/i18n/__tests__/extract/example3.js @@ -1 +1 @@ -export default 'import i18n from "@webiny/i18n"; const t = i18n.namespace("ns1"); {`status: ${state.data.published ? t`published` : t`draft`}`}'; +export default 'import i18n from "~/index"; const t = i18n.namespace("ns1"); {`status: ${state.data.published ? t`published` : t`draft`}`}'; diff --git a/packages/i18n/__tests__/getSetLocale.test.js b/packages/i18n/__tests__/getSetLocale.test.js index b641c86e6e0..d68bfc54b6a 100644 --- a/packages/i18n/__tests__/getSetLocale.test.js +++ b/packages/i18n/__tests__/getSetLocale.test.js @@ -1,4 +1,6 @@ -import i18n from "@webiny/i18n"; +import { describe, test, expect, beforeEach } from "vitest"; + +import i18n from "~/index"; describe("locales set / get test", () => { beforeEach(() => i18n.clearTranslations()); diff --git a/packages/i18n/__tests__/getSetTranslations.test.js b/packages/i18n/__tests__/getSetTranslations.test.js index 33c8e08e119..1a803a959a1 100644 --- a/packages/i18n/__tests__/getSetTranslations.test.js +++ b/packages/i18n/__tests__/getSetTranslations.test.js @@ -1,4 +1,6 @@ -import i18n from "@webiny/i18n"; +import { describe, test, expect, beforeEach } from "vitest"; + +import i18n from "~/index"; describe("all set/get translations related methods test", () => { beforeEach(() => i18n.clearTranslations()); diff --git a/packages/i18n/__tests__/modifiers.test.js b/packages/i18n/__tests__/modifiers.test.js index 91ede4bd040..9006b6f9adb 100644 --- a/packages/i18n/__tests__/modifiers.test.js +++ b/packages/i18n/__tests__/modifiers.test.js @@ -1,4 +1,6 @@ -import i18n, { defaultProcessor, defaultModifiers } from "@webiny/i18n"; +import { describe, test, expect } from "vitest"; + +import i18n, { defaultProcessor, defaultModifiers } from "~/index.js"; i18n.registerProcessor(defaultProcessor); i18n.registerModifiers(defaultModifiers); diff --git a/packages/i18n/__tests__/number.test.js b/packages/i18n/__tests__/number.test.js index a2f8f18e9cd..3d8c6dccf6b 100644 --- a/packages/i18n/__tests__/number.test.js +++ b/packages/i18n/__tests__/number.test.js @@ -1,4 +1,6 @@ -import i18n from "@webiny/i18n"; +import { describe, test, expect } from "vitest"; + +import i18n from "~/index"; describe("number test", () => { test("should output number with no formatting set", () => { diff --git a/packages/i18n/__tests__/price.test.js b/packages/i18n/__tests__/price.test.js index 878968dac08..1eeb03f094b 100644 --- a/packages/i18n/__tests__/price.test.js +++ b/packages/i18n/__tests__/price.test.js @@ -1,4 +1,5 @@ -import i18n from "@webiny/i18n"; +import { describe, test, expect } from "vitest"; +import i18n from "~/index"; describe("price test", () => { test("should output price with no formatting set", () => { diff --git a/packages/i18n/__tests__/registeringModifiers.test.js b/packages/i18n/__tests__/registeringModifiers.test.js index 736f86a3d78..c7e6eb4ae0f 100644 --- a/packages/i18n/__tests__/registeringModifiers.test.js +++ b/packages/i18n/__tests__/registeringModifiers.test.js @@ -1,4 +1,5 @@ -import i18n, { defaultProcessor } from "@webiny/i18n"; +import { describe, test, expect } from "vitest"; +import i18n, { defaultProcessor } from "~/index"; const t = i18n.namespace("Random.Namespace"); i18n.registerProcessor(defaultProcessor); diff --git a/packages/i18n/__tests__/time.test.js b/packages/i18n/__tests__/time.test.js index 8d0002691e7..bab2fed25a0 100644 --- a/packages/i18n/__tests__/time.test.js +++ b/packages/i18n/__tests__/time.test.js @@ -1,4 +1,5 @@ -import i18n from "@webiny/i18n"; +import { describe, test, expect } from "vitest"; +import i18n from "~/index"; describe("time test", () => { // With below given format (no timezone), Date assumes passed value is in current timezone. diff --git a/packages/i18n/__tests__/translate.test.js b/packages/i18n/__tests__/translate.test.js index 9480e880bc8..f32c7098406 100644 --- a/packages/i18n/__tests__/translate.test.js +++ b/packages/i18n/__tests__/translate.test.js @@ -1,4 +1,5 @@ -import i18n, { defaultProcessor } from "@webiny/i18n"; +import { describe, test, expect } from "vitest"; +import i18n, { defaultProcessor } from "~/index"; const t = i18n.namespace("Some.Namespace"); i18n.registerProcessor(defaultProcessor); diff --git a/packages/i18n/src/processors/default.ts b/packages/i18n/src/processors/default.ts index 58f6a2078f9..37ac8b1b42b 100644 --- a/packages/i18n/src/processors/default.ts +++ b/packages/i18n/src/processors/default.ts @@ -13,8 +13,9 @@ const processTextPart = ( const parts = lodashTrim(part, "{}").split("|"); const [variable, modifier] = parts; + const keys = Object.keys(values); - if (!values[variable]) { + if (!keys.includes(variable)) { return `{${variable}}`; } diff --git a/packages/i18n/tsconfig.json b/packages/i18n/tsconfig.json index 6ca26f3c929..3f3851da295 100644 --- a/packages/i18n/tsconfig.json +++ b/packages/i18n/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [], "compilerOptions": { "rootDirs": ["./src", "./__tests__"], diff --git a/packages/i18n/vitest.config.ts b/packages/i18n/vitest.config.ts new file mode 100644 index 00000000000..77c26269023 --- /dev/null +++ b/packages/i18n/vitest.config.ts @@ -0,0 +1,10 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ + path: import.meta.dirname, + vitestConfig: { + fileParallelism: true + } + }); +}; diff --git a/packages/ioc/__tests__/container.test.ts b/packages/ioc/__tests__/container.test.ts index b9d83cc878b..7bde8118acf 100644 --- a/packages/ioc/__tests__/container.test.ts +++ b/packages/ioc/__tests__/container.test.ts @@ -1,3 +1,5 @@ +import { describe, it, beforeEach, expect } from "vitest"; + import { createContainer, makeInjectable, inject, AbstractDecorator } from "~/index"; describe("Decorators", () => { diff --git a/packages/ioc/__tests__/useCases/builder.ts b/packages/ioc/__tests__/useCases/builder.ts deleted file mode 100644 index 2d29daf95b5..00000000000 --- a/packages/ioc/__tests__/useCases/builder.ts +++ /dev/null @@ -1,12 +0,0 @@ -// This approach will cause attribute to be defined from scratch for every single class instance!!! -// -// class BaseModel { -// protected defineAttributes() { -// this.addAttribute({ -// name: "name", -// defaultValue: "Default name", -// onSet: value => value.toLowerCase(), -// validation: () => z.number() -// }) -// } -// } diff --git a/packages/ioc/__tests__/useCases/models.test.ts b/packages/ioc/__tests__/useCases/models.test.ts index 33c5e2ddc65..9e1ef8d0a98 100644 --- a/packages/ioc/__tests__/useCases/models.test.ts +++ b/packages/ioc/__tests__/useCases/models.test.ts @@ -1,3 +1,5 @@ +import { describe, it, beforeEach, expect } from "vitest"; + import { interfaces } from "inversify"; import { z } from "zod"; import { Container, createContainer } from "~/index"; @@ -57,6 +59,7 @@ describe("Extend model via DI container activation", () => { container.bind(PageModelToken).toConstructor(Page); createPageModelPlugin = (cb: PageModelModifier) => { + // @ts-expect-error We don't care about this error because this whole package is being deprecated. container.onActivation>(PageModelToken, (_, Dep) => { return cb(Dep); }); diff --git a/packages/ioc/__tests__/useCases/nested.test.ts b/packages/ioc/__tests__/useCases/nested.test.ts index 929074a2260..2bc55e99cad 100644 --- a/packages/ioc/__tests__/useCases/nested.test.ts +++ b/packages/ioc/__tests__/useCases/nested.test.ts @@ -1,39 +1,4 @@ -import { jest } from "@jest/globals"; - -// export default withFields({ -// name: string({ validation: "required,maxLength:500" }), -// websiteUrl: onSet(trimTrailingSlashes)(string({ validation: "url,maxLength:500" })), -// websitePreviewUrl: onSet(trimTrailingSlashes)(string({ validation: "url,maxLength:500" })), -// favicon: object({}), -// logo: object({}), -// social: fields({ -// value: {}, -// instanceOf: withFields({ -// facebook: string({ validation: "url,maxLength:500" }), -// twitter: string({ validation: "url,maxLength:500" }), -// instagram: string({ validation: "url,maxLength:500" }), -// image: object({}) -// })() -// }), -// htmlTags: fields({ -// value: {}, -// instanceOf: withFields({ -// header: string(), -// footer: string() -// })() -// }), -// pages: fields({ -// value: {}, -// instanceOf: withFields({ -// home: onSet(extractPid)(string()), -// notFound: onSet(extractPid)(string()) -// })() -// }), -// // TODO: implement this via a plugin when https://github.com/webiny/webiny-js/issues/2168 is resolved. -// theme: string() -// })(); - -jest.retryTimes(0); +import { describe, it, expect } from "vitest"; const trimTrailingSlashes = (value: string): string => value.replace(/\/$/, ""); diff --git a/packages/ioc/jest.config.js b/packages/ioc/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/ioc/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/ioc/tsconfig.json b/packages/ioc/tsconfig.json index 6ca26f3c929..3f3851da295 100644 --- a/packages/ioc/tsconfig.json +++ b/packages/ioc/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [], "compilerOptions": { "rootDirs": ["./src", "./__tests__"], diff --git a/packages/ioc/vitest.config.ts b/packages/ioc/vitest.config.ts new file mode 100644 index 00000000000..77c26269023 --- /dev/null +++ b/packages/ioc/vitest.config.ts @@ -0,0 +1,10 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ + path: import.meta.dirname, + vitestConfig: { + fileParallelism: true + } + }); +}; diff --git a/packages/lexical-converter/vitest.config.ts b/packages/lexical-converter/vitest.config.ts index 162701d6b76..d77438a012a 100644 --- a/packages/lexical-converter/vitest.config.ts +++ b/packages/lexical-converter/vitest.config.ts @@ -8,12 +8,6 @@ export default async () => { path: import.meta.dirname, vitestConfig: { environment: "jsdom", - alias: [ - { - find: /\.(css|sass)$/, - replacement: "identity-obj-proxy" - } - ], setupFiles: [path.resolve(import.meta.dirname, "./__tests__/setup/setupEnv.ts")] } }); diff --git a/packages/migrations/__tests__/migrations/5.43.0/001/ddb-es/001.test.ts b/packages/migrations/__tests__/migrations/5.43.0/001/ddb-es/001.test.ts index 03f41693bfb..2a748d75584 100644 --- a/packages/migrations/__tests__/migrations/5.43.0/001/ddb-es/001.test.ts +++ b/packages/migrations/__tests__/migrations/5.43.0/001/ddb-es/001.test.ts @@ -1,3 +1,5 @@ +import { describe, it, vi, expect, beforeEach, afterEach } from "vitest"; + import { createElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch/createClient"; import { @@ -15,10 +17,9 @@ import { createLocalesData, createTenantsData } from "../common"; import { StepFunctionService } from "@webiny/tasks/service/StepFunctionServicePlugin"; import { esCreateIndex } from "~/utils"; import { ACO_FOLDER_MODEL_ID } from "~tests/migrations/5.43.0/001/constants"; -import { jest } from "@jest/globals"; -jest.mock("@webiny/tasks/service/StepFunctionServicePlugin", () => { - const sendMock = jest.fn().mockResolvedValue({ +vi.mock("@webiny/tasks/service/StepFunctionServicePlugin", () => { + const sendMock = vi.fn().mockResolvedValue({ tenant: "mockTenant", locale: "mockLocale", id: "mockId", @@ -27,7 +28,7 @@ jest.mock("@webiny/tasks/service/StepFunctionServicePlugin", () => { input: { type: "*" } }); - const StepFunctionService = jest.fn().mockImplementation(() => ({ + const StepFunctionService = vi.fn().mockImplementation(() => ({ send: sendMock })); @@ -41,10 +42,7 @@ jest.mock("@webiny/tasks/service/StepFunctionServicePlugin", () => { }; }); -jest.retryTimes(0); -jest.setTimeout(900000); - -describe("5.43.0-001 DDB + ES", () => { +describe("5.43.0-001 DDB + ES", { timeout: 900_000 }, () => { const ddbTable = getPrimaryDynamoDbTable(); const ddbToEsTable = getDynamoToEsTable(); const elasticsearchClient = createElasticsearchClient(); diff --git a/packages/migrations/__tests__/migrations/5.43.0/001/ddb/001.test.ts b/packages/migrations/__tests__/migrations/5.43.0/001/ddb/001.test.ts index 463c51ad5f1..76e6a867616 100644 --- a/packages/migrations/__tests__/migrations/5.43.0/001/ddb/001.test.ts +++ b/packages/migrations/__tests__/migrations/5.43.0/001/ddb/001.test.ts @@ -1,3 +1,5 @@ +import { describe, it, vi, expect } from "vitest"; + import { assertNotError, createDdbMigrationHandler, @@ -11,10 +13,9 @@ import { insertTestFolders } from "../insertTestFolders"; import { createLocalesData, createTenantsData } from "../common"; import { StepFunctionService } from "@webiny/tasks/service/StepFunctionServicePlugin"; -import { jest } from "@jest/globals"; -jest.mock("@webiny/tasks/service/StepFunctionServicePlugin", () => { - const sendMock = jest.fn().mockResolvedValue({ +vi.mock("@webiny/tasks/service/StepFunctionServicePlugin", () => { + const sendMock = vi.fn().mockResolvedValue({ tenant: "mockTenant", locale: "mockLocale", id: "mockId", @@ -23,7 +24,7 @@ jest.mock("@webiny/tasks/service/StepFunctionServicePlugin", () => { input: { type: "*" } }); - const StepFunctionService = jest.fn().mockImplementation(() => ({ + const StepFunctionService = vi.fn().mockImplementation(() => ({ send: sendMock })); @@ -37,10 +38,7 @@ jest.mock("@webiny/tasks/service/StepFunctionServicePlugin", () => { }; }); -jest.retryTimes(0); -jest.setTimeout(900000); - -describe("5.43.0-001 - DDB", () => { +describe("5.43.0-001 - DDB", { timeout: 900_000 }, () => { const table = getPrimaryDynamoDbTable(); logTestNameBeforeEachTest(); diff --git a/packages/migrations/__tests__/utils/logTestNameBeforeEachTest.ts b/packages/migrations/__tests__/utils/logTestNameBeforeEachTest.ts index e65326b4994..853a711fd1d 100644 --- a/packages/migrations/__tests__/utils/logTestNameBeforeEachTest.ts +++ b/packages/migrations/__tests__/utils/logTestNameBeforeEachTest.ts @@ -1,3 +1,5 @@ +import { beforeEach, expect } from "vitest"; + export const logTestNameBeforeEachTest = () => { beforeEach(() => { process.stdout.write(`\n===== ${expect.getState().currentTestName} =====\n`); diff --git a/packages/migrations/__tests__/validateMigrations.test.ts b/packages/migrations/__tests__/validateMigrations.test.ts index 94cec8f2b64..6da51198dc5 100644 --- a/packages/migrations/__tests__/validateMigrations.test.ts +++ b/packages/migrations/__tests__/validateMigrations.test.ts @@ -1,4 +1,5 @@ -import { jest } from "@jest/globals"; +import { describe, it, expect, beforeEach } from "vitest"; + import { assertNotError, createDdbEsMigrationHandler, @@ -10,8 +11,6 @@ import { import { migrations as ddbMigrations } from "~/ddb"; import { migrations as ddbEsMigrations } from "~/ddb-es"; -jest.retryTimes(0); - // This test runs all migrations to make sure that they have unique IDs, and that // they're executable without any obvious errors. Individual migration tests are located // next to the migration implementations. diff --git a/packages/migrations/jest.config.js b/packages/migrations/jest.config.js deleted file mode 100644 index ce2a1cae33d..00000000000 --- a/packages/migrations/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const base = require("../../jest.config.base"); - -module.exports = base({ path: __dirname }); diff --git a/packages/migrations/tsconfig.json b/packages/migrations/tsconfig.json index dafdedaf864..54e164a71d7 100644 --- a/packages/migrations/tsconfig.json +++ b/packages/migrations/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [ { "path": "../api-elasticsearch" }, { "path": "../aws-sdk" }, diff --git a/packages/migrations/vitest.config.ts b/packages/migrations/vitest.config.ts new file mode 100644 index 00000000000..6c07752c1a5 --- /dev/null +++ b/packages/migrations/vitest.config.ts @@ -0,0 +1,7 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ + path: import.meta.dirname + }); +}; diff --git a/packages/plugins/__tests__/AsyncPluginsContainer.test.ts b/packages/plugins/__tests__/AsyncPluginsContainer.test.ts index 87110782677..72cdaa1e661 100644 --- a/packages/plugins/__tests__/AsyncPluginsContainer.test.ts +++ b/packages/plugins/__tests__/AsyncPluginsContainer.test.ts @@ -1,3 +1,5 @@ +import { describe, it, expect } from "vitest"; + import { AsyncPluginsContainer } from "~/AsyncPluginsContainer"; import { PluginCollection } from "~/types"; diff --git a/packages/plugins/__tests__/pluginsContainer.test.ts b/packages/plugins/__tests__/pluginsContainer.test.ts index 95b8881c42d..85d5cc358d6 100644 --- a/packages/plugins/__tests__/pluginsContainer.test.ts +++ b/packages/plugins/__tests__/pluginsContainer.test.ts @@ -1,4 +1,5 @@ -import { jest } from "@jest/globals"; +import { describe, test, expect, beforeEach, afterEach, vi } from "vitest"; + import { PluginsContainer } from "~/index"; const mockPlugins = [ @@ -43,7 +44,7 @@ describe("plugins", () => { plugins = new PluginsContainer(); }); afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); test("plugins.register, plugins.unregister, plugins.byName, plugins.byType", async () => { @@ -142,8 +143,8 @@ describe("plugins", () => { const findByTypeMethodName = "findByType" as keyof typeof plugins; test("load a type only once internally", async () => { - const byTypeSpy = jest.spyOn(plugins, "byType"); - const findByTypeSpy = jest.spyOn(plugins, findByTypeMethodName); + const byTypeSpy = vi.spyOn(plugins, "byType"); + const findByTypeSpy = vi.spyOn(plugins, findByTypeMethodName); plugins.register(mockPlugins); @@ -155,12 +156,12 @@ describe("plugins", () => { expect(findByTypeSpy).toBeCalledTimes(1); expect(byTypeSpy).toBeCalledTimes(50); - jest.restoreAllMocks(); + vi.restoreAllMocks(); }); test("it should clear internal cache when registering a new plugin", async () => { - const byTypeSpy = jest.spyOn(plugins, "byType"); - const findByTypeSpy = jest.spyOn(plugins, findByTypeMethodName); + const byTypeSpy = vi.spyOn(plugins, "byType"); + const findByTypeSpy = vi.spyOn(plugins, findByTypeMethodName); plugins.register(mockPlugins); @@ -191,12 +192,12 @@ describe("plugins", () => { expect(findByTypeSpy).toBeCalledTimes(register.length + 1); expect(byTypeSpy).toBeCalledTimes(51); - jest.restoreAllMocks(); + vi.restoreAllMocks(); }); test("it should clear internal cache when unregistering a plugin", async () => { - const byTypeSpy = jest.spyOn(plugins, "byType"); - const findByTypeSpy = jest.spyOn(plugins, findByTypeMethodName); + const byTypeSpy = vi.spyOn(plugins, "byType"); + const findByTypeSpy = vi.spyOn(plugins, findByTypeMethodName); plugins.register(mockPlugins); @@ -235,7 +236,7 @@ describe("plugins", () => { expect(findByTypeSpy).toBeCalledTimes(unregister.length + 2); expect(byTypeSpy).toBeCalledTimes(endId + 1); - jest.restoreAllMocks(); + vi.restoreAllMocks(); }); test("plugins should remain same after shift and pop", () => { diff --git a/packages/plugins/jest.config.js b/packages/plugins/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/plugins/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/plugins/tsconfig.json b/packages/plugins/tsconfig.json index 6ca26f3c929..3f3851da295 100644 --- a/packages/plugins/tsconfig.json +++ b/packages/plugins/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [], "compilerOptions": { "rootDirs": ["./src", "./__tests__"], diff --git a/packages/plugins/vitest.config.ts b/packages/plugins/vitest.config.ts new file mode 100644 index 00000000000..77c26269023 --- /dev/null +++ b/packages/plugins/vitest.config.ts @@ -0,0 +1,10 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ + path: import.meta.dirname, + vitestConfig: { + fileParallelism: true + } + }); +}; diff --git a/packages/pubsub/__tests__/pubsub.test.ts b/packages/pubsub/__tests__/pubsub.test.ts index 66da4f65d63..6853c413f2a 100644 --- a/packages/pubsub/__tests__/pubsub.test.ts +++ b/packages/pubsub/__tests__/pubsub.test.ts @@ -1,3 +1,5 @@ +import { describe, test, expect } from "vitest"; + import { createTopic } from "../src"; import { Event } from "~/types"; diff --git a/packages/pubsub/jest.config.js b/packages/pubsub/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/pubsub/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/pubsub/tsconfig.json b/packages/pubsub/tsconfig.json index 6ca26f3c929..3f3851da295 100644 --- a/packages/pubsub/tsconfig.json +++ b/packages/pubsub/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [], "compilerOptions": { "rootDirs": ["./src", "./__tests__"], diff --git a/packages/pubsub/vitest.config.ts b/packages/pubsub/vitest.config.ts new file mode 100644 index 00000000000..77c26269023 --- /dev/null +++ b/packages/pubsub/vitest.config.ts @@ -0,0 +1,10 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ + path: import.meta.dirname, + vitestConfig: { + fileParallelism: true + } + }); +}; diff --git a/packages/react-composition/__tests__/composition.test.tsx b/packages/react-composition/__tests__/composition.test.tsx index b7e15ae4185..3f393668a76 100644 --- a/packages/react-composition/__tests__/composition.test.tsx +++ b/packages/react-composition/__tests__/composition.test.tsx @@ -1,6 +1,4 @@ -/** - * @jest-environment jsdom - */ +import { describe, it, expect } from "vitest"; import React from "react"; import { render, waitFor } from "@testing-library/react"; import { diff --git a/packages/react-composition/__tests__/decorators.test.tsx b/packages/react-composition/__tests__/decorators.test.tsx index 70bc87799b8..fd8c11c7eff 100644 --- a/packages/react-composition/__tests__/decorators.test.tsx +++ b/packages/react-composition/__tests__/decorators.test.tsx @@ -1,7 +1,5 @@ -/** - * @jest-environment jsdom - */ -/* eslint-disable */ +// @ts-nocheck +import { describe, it } from "vitest"; import React from "react"; import { makeDecoratable, withDecoratorFactory } from "~/index"; diff --git a/packages/react-composition/__tests__/setupEnv.ts b/packages/react-composition/__tests__/setupEnv.ts index 3c6909a2b3f..ce1b39e9ddd 100644 --- a/packages/react-composition/__tests__/setupEnv.ts +++ b/packages/react-composition/__tests__/setupEnv.ts @@ -1,14 +1,14 @@ +// @ts-nocheck // noinspection JSConstantReassignment // This is why this file is necessary: https://github.com/ai/nanoid/issues/363 -const { randomFillSync } = require("crypto"); -// @ts-expect-error -const { TextEncoder, TextDecoder } = require("util"); +import { randomFillSync } from "crypto"; + +import { TextEncoder, TextDecoder } from "util"; global.TextEncoder = TextEncoder; global.TextDecoder = TextDecoder; -// @ts-expect-error window.crypto = { getRandomValues(buffer) { return randomFillSync(buffer); diff --git a/packages/react-composition/jest.config.js b/packages/react-composition/jest.config.js deleted file mode 100644 index ef1281b54dc..00000000000 --- a/packages/react-composition/jest.config.js +++ /dev/null @@ -1,6 +0,0 @@ -const base = require("../../jest.config.base"); - -module.exports = { - ...base({ path: __dirname }), - setupFilesAfterEnv: [require.resolve("./__tests__/setupEnv.ts")] -}; diff --git a/packages/react-composition/vitest.config.ts b/packages/react-composition/vitest.config.ts new file mode 100644 index 00000000000..194ff41ff36 --- /dev/null +++ b/packages/react-composition/vitest.config.ts @@ -0,0 +1,13 @@ +import { fileURLToPath } from "url"; +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ + path: import.meta.dirname, + vitestConfig: { + environment: "jsdom", + fileParallelism: true, + setupFiles: [fileURLToPath(import.meta.resolve("./__tests__/setupEnv.ts"))] + } + }); +}; diff --git a/packages/react-properties/__tests__/cases/dashboard/dashboard.test.tsx b/packages/react-properties/__tests__/cases/dashboard/dashboard.test.tsx index 8f12304208f..57c2e6580d6 100644 --- a/packages/react-properties/__tests__/cases/dashboard/dashboard.test.tsx +++ b/packages/react-properties/__tests__/cases/dashboard/dashboard.test.tsx @@ -1,6 +1,4 @@ -/** - * @jest-environment jsdom - */ +import { describe, it, expect, vi } from "vitest"; import React from "react"; import { render } from "@testing-library/react"; import { Property, toObject } from "~/index"; @@ -11,7 +9,7 @@ const { AddWidget } = DashboardConfig; describe("Dashboard", () => { it("should contain 2 widgets (the built-in one, and the custom one)", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); /** * contains the built-in widget, and we're using the component to register more widgets. */ @@ -52,7 +50,7 @@ describe("Dashboard", () => { }); it("should contain the built-in widget with modified values", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -121,7 +119,7 @@ describe("Dashboard", () => { ); }; - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( diff --git a/packages/react-properties/__tests__/cases/docs/components.js b/packages/react-properties/__tests__/cases/docs/components.tsx similarity index 98% rename from packages/react-properties/__tests__/cases/docs/components.js rename to packages/react-properties/__tests__/cases/docs/components.tsx index 3f94274e86e..ce43aa53824 100644 --- a/packages/react-properties/__tests__/cases/docs/components.js +++ b/packages/react-properties/__tests__/cases/docs/components.tsx @@ -1,7 +1,8 @@ +// @ts-nocheck import React from "react"; import { Property, useParentProperty } from "~/index"; -export const Draft = ({ children }) => { +export const Draft = ({ children }: { children: React.ReactNode }) => { if (process.env.VERCEL_ENV === "production") { return null; } diff --git a/packages/react-properties/__tests__/cases/docs/docs.test.tsx b/packages/react-properties/__tests__/cases/docs/docs.test.tsx index 5a6d925585d..3f3a520a292 100644 --- a/packages/react-properties/__tests__/cases/docs/docs.test.tsx +++ b/packages/react-properties/__tests__/cases/docs/docs.test.tsx @@ -1,18 +1,14 @@ -/** - * @jest-environment jsdom - */ +import { describe, it, expect, vi } from "vitest"; import React from "react"; import { render } from "@testing-library/react"; import { Properties, toObject } from "~/index"; import { getLastCall } from "~tests/utils"; import { Navigation } from "./navigation"; -jest.setTimeout(60000); - type Catalog = { catalog: any[]; groups: { [key: string]: any } }; const renderNavigation = async (element: JSX.Element): Promise => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = {element}; @@ -22,7 +18,7 @@ const renderNavigation = async (element: JSX.Element): Promise => { return toObject(properties); }; -describe("Docs Catalog", () => { +describe("Docs Catalog", { timeout: 60000 }, () => { it("should generate an object with several thousands properties", async () => { const data = await renderNavigation(); diff --git a/packages/react-properties/__tests__/cases/docs/navigation.js b/packages/react-properties/__tests__/cases/docs/navigation.tsx similarity index 99% rename from packages/react-properties/__tests__/cases/docs/navigation.js rename to packages/react-properties/__tests__/cases/docs/navigation.tsx index 08d462a9f18..df9cbd182e0 100644 --- a/packages/react-properties/__tests__/cases/docs/navigation.js +++ b/packages/react-properties/__tests__/cases/docs/navigation.tsx @@ -1,3 +1,4 @@ +// @ts-nocheck import React from "react"; import { Collapsable, Section, Page, Separator, NavGroup } from "./components"; diff --git a/packages/react-properties/__tests__/cases/gql-query-builder/gqlBuilder.test.tsx b/packages/react-properties/__tests__/cases/gql-query-builder/gqlBuilder.test.tsx index 8b2d3328392..b2429eef716 100644 --- a/packages/react-properties/__tests__/cases/gql-query-builder/gqlBuilder.test.tsx +++ b/packages/react-properties/__tests__/cases/gql-query-builder/gqlBuilder.test.tsx @@ -1,6 +1,4 @@ -/** - * @jest-environment jsdom - */ +import { describe, it, expect, vi } from "vitest"; import React from "react"; import prettier from "prettier"; import { render } from "@testing-library/react"; @@ -60,7 +58,7 @@ const ModifyListPagesQuery = () => { }; const renderElement = (element: JSX.Element): { operations: Operation[] } => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = {element}; diff --git a/packages/react-properties/__tests__/cases/pbEditorSettings/PbEditorSettingsView.tsx b/packages/react-properties/__tests__/cases/pbEditorSettings/PbEditorSettingsView.tsx index f5a4a866f15..ceb2e648471 100644 --- a/packages/react-properties/__tests__/cases/pbEditorSettings/PbEditorSettingsView.tsx +++ b/packages/react-properties/__tests__/cases/pbEditorSettings/PbEditorSettingsView.tsx @@ -8,7 +8,7 @@ interface SettingsGroupProps { icon?: string; remove?: boolean; replace?: string; - children: React.ReactNode; + children?: React.ReactNode; } type DynamicProps = T & { @@ -37,6 +37,7 @@ const SettingsGroup = ({ children, replace, remove = false, ...rest }: SettingsG interface FormFieldProps extends Record { name: string; + children?: React.ReactNode; component?: string; after?: string; remove?: boolean; @@ -59,7 +60,7 @@ const FormField = ({ const { id } = parent; const getId = useCallback( - (suffix = undefined) => [id, "field", props.name, suffix].filter(Boolean).join(":"), + (suffix: string | undefined = undefined) => [id, "field", props.name, suffix].filter(Boolean).join(":"), [] ); diff --git a/packages/react-properties/__tests__/cases/pbEditorSettings/pbEditorSettings.test.tsx b/packages/react-properties/__tests__/cases/pbEditorSettings/pbEditorSettings.test.tsx index 995e9aa7e6f..7625cc256ce 100644 --- a/packages/react-properties/__tests__/cases/pbEditorSettings/pbEditorSettings.test.tsx +++ b/packages/react-properties/__tests__/cases/pbEditorSettings/pbEditorSettings.test.tsx @@ -1,6 +1,4 @@ -/** - * @jest-environment jsdom - */ +import { describe, it, expect, vi } from "vitest"; import React from "react"; import { render } from "@testing-library/react"; import { CompositionProvider } from "@webiny/react-composition"; @@ -26,7 +24,7 @@ const BaseConfig = () => { describe("PB Editor", () => { it("should contain 1 settings groups with 3 fields", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -69,7 +67,7 @@ describe("PB Editor", () => { }); it("should contain a new settings group with 1 field", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -129,7 +127,7 @@ describe("PB Editor", () => { }); it("should allow group customization", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -175,7 +173,7 @@ describe("PB Editor", () => { }); it("should allow group removal", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -196,7 +194,7 @@ describe("PB Editor", () => { }); it("should allow field customization", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -251,7 +249,7 @@ describe("PB Editor", () => { }); it("should allow adding fields after a specific field", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -309,7 +307,7 @@ describe("PB Editor", () => { }); it("should allow adding fields before a specific field", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -367,7 +365,7 @@ describe("PB Editor", () => { }); it("should allow field removal", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -410,7 +408,7 @@ describe("PB Editor", () => { }); it("should allow field replacement", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( diff --git a/packages/react-properties/__tests__/properties.test.tsx b/packages/react-properties/__tests__/properties.test.tsx index bd2f5529f7f..9d46c931626 100644 --- a/packages/react-properties/__tests__/properties.test.tsx +++ b/packages/react-properties/__tests__/properties.test.tsx @@ -1,6 +1,4 @@ -/** - * @jest-environment jsdom - */ +import { describe, it, expect, vi } from "vitest"; import React, { useCallback } from "react"; import { render } from "@testing-library/react"; import { Properties, Property, useParentProperty, toObject } from "~/index"; @@ -40,7 +38,7 @@ const Field = ({ name, label, replace, after, before, remove = false }: FieldPro const placeBefore = before !== undefined ? `${id}:field:${before}` : undefined; const getId = useCallback( - (suffix = undefined) => [id, "field", name, suffix].filter(Boolean).join(":"), + (suffix: string | undefined = undefined) => [id, "field", name, suffix].filter(Boolean).join(":"), [] ); const toReplace = replace !== undefined ? `${id}:field:${replace}` : undefined; @@ -63,7 +61,7 @@ const Field = ({ name, label, replace, after, before, remove = false }: FieldPro describe("Test Properties", () => { it("should create 2 properties", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -80,7 +78,7 @@ describe("Test Properties", () => { }); it("should create nested properties", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -111,7 +109,7 @@ describe("Test Properties", () => { }); it("should convert to a single object", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -140,7 +138,7 @@ describe("Test Properties", () => { }); it("should treat a single object as an array (array prop)", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -171,7 +169,7 @@ describe("Test Properties", () => { }); it("should convert to an array of objects", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -244,7 +242,7 @@ describe("Test Properties", () => { ); }; - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -282,7 +280,7 @@ describe("Test Properties", () => { }); it("should merge properties for matching 'name' prop", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -335,7 +333,7 @@ describe("Test Properties", () => { }); it("should allow addition of custom properties to predefined components", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); interface TutorialProps { label: string; @@ -383,7 +381,7 @@ describe("Test Properties", () => { }); it("should remove existing property by 'name' and add a new one", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -417,7 +415,7 @@ describe("Test Properties", () => { }); it("should replace existing property with a new one", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -453,7 +451,7 @@ describe("Test Properties", () => { }); it("should add property after an existing one", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -489,7 +487,7 @@ describe("Test Properties", () => { }); it("should add property before an existing one", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -527,7 +525,7 @@ describe("Test Properties", () => { }); it("should change the position of the existing property", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( @@ -564,7 +562,7 @@ describe("Test Properties", () => { describe("Custom Properties", () => { it("should change the position of the existing property", async () => { - const onChange = jest.fn(); + const onChange = vi.fn(); const view = ( diff --git a/packages/react-properties/jest.config.js b/packages/react-properties/jest.config.js deleted file mode 100644 index ef1281b54dc..00000000000 --- a/packages/react-properties/jest.config.js +++ /dev/null @@ -1,6 +0,0 @@ -const base = require("../../jest.config.base"); - -module.exports = { - ...base({ path: __dirname }), - setupFilesAfterEnv: [require.resolve("./__tests__/setupEnv.ts")] -}; diff --git a/packages/react-properties/tsconfig.json b/packages/react-properties/tsconfig.json index 16785df774d..1d3bec53df5 100644 --- a/packages/react-properties/tsconfig.json +++ b/packages/react-properties/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], + "include": ["src", "__tests__", "vitest.config.ts"], "references": [{ "path": "../react-composition" }], "compilerOptions": { "rootDirs": ["./src", "./__tests__"], diff --git a/packages/react-properties/vitest.config.ts b/packages/react-properties/vitest.config.ts new file mode 100644 index 00000000000..194ff41ff36 --- /dev/null +++ b/packages/react-properties/vitest.config.ts @@ -0,0 +1,13 @@ +import { fileURLToPath } from "url"; +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ + path: import.meta.dirname, + vitestConfig: { + environment: "jsdom", + fileParallelism: true, + setupFiles: [fileURLToPath(import.meta.resolve("./__tests__/setupEnv.ts"))] + } + }); +}; diff --git a/packages/react-rich-text-lexical-renderer/__tests__/lexical-renderer.test.tsx b/packages/react-rich-text-lexical-renderer/__tests__/lexical-renderer.test.tsx index 9210bfe056d..0380e1b4b24 100644 --- a/packages/react-rich-text-lexical-renderer/__tests__/lexical-renderer.test.tsx +++ b/packages/react-rich-text-lexical-renderer/__tests__/lexical-renderer.test.tsx @@ -1,6 +1,4 @@ -/** - * @jest-environment jsdom - */ +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; import { render } from "@testing-library/react"; import React from "react"; import { @@ -15,14 +13,19 @@ import { emptyEditorContent, LexicalCmsInputRender } from "./lexical-render"; import theme from "./theme"; import { RichTextLexicalRenderer } from "~/index"; -// Need to use fake timers because of internal use of `queueMicroTask` -jest.useFakeTimers(); - describe("Test Rich Lexical Renderer", () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + afterEach(() => { + vi.restoreAllMocks(); + }); + it("Paragraph string value type is rendered", async () => { // ARRANGE const { container } = render(); - jest.runAllTimers(); + + await vi.runAllTimersAsync(); // ASSERT expect(container.innerHTML).toContain(expectedParagraphRenderedValue); @@ -31,7 +34,7 @@ describe("Test Rich Lexical Renderer", () => { it("Header object value type is rendered", async () => { // ARRANGE const { container } = render(); - jest.runAllTimers(); + await vi.runAllTimersAsync(); // ASSERT expect(container.innerHTML).toContain(expectedHeadingRenderedValue); }); @@ -39,7 +42,7 @@ describe("Test Rich Lexical Renderer", () => { it("Handle null as value", async () => { // ARRANGE const { container } = render(); - jest.runAllTimers(); + await vi.runAllTimersAsync(); // ASSERT expect(container.innerHTML).toEqual(emptyEditorContent); }); @@ -47,7 +50,7 @@ describe("Test Rich Lexical Renderer", () => { it("Handle undefined as value", async () => { // ARRANGE const { container } = render(); - jest.runAllTimers(); + await vi.runAllTimersAsync(); // ASSERT expect(container.innerHTML).toEqual(emptyEditorContent); }); @@ -55,7 +58,7 @@ describe("Test Rich Lexical Renderer", () => { it("Handle wrong lexical value", async () => { // ARRANGE const { container } = render(); - jest.runAllTimers(); + await vi.runAllTimersAsync(); // ASSERT expect(container.innerHTML).toEqual(emptyEditorContent); }); @@ -63,7 +66,7 @@ describe("Test Rich Lexical Renderer", () => { it("Lexical CMS input includes title, paragraph, list and quote", async () => { // ARRANGE const { container } = render(); - jest.runAllTimers(); + await vi.runAllTimersAsync(); // ASSERT expect(container.innerHTML).toEqual(LexicalCmsInputRender); }); @@ -73,7 +76,7 @@ describe("Test Rich Lexical Renderer", () => { const { container } = render( ); - jest.runAllTimers(); + await vi.runAllTimersAsync(); // ASSERT // editor is here expect(container.innerHTML.includes("editor")).toBeTruthy(); diff --git a/packages/react-rich-text-lexical-renderer/jest.config.js b/packages/react-rich-text-lexical-renderer/jest.config.js deleted file mode 100644 index a9663a5b62e..00000000000 --- a/packages/react-rich-text-lexical-renderer/jest.config.js +++ /dev/null @@ -1,9 +0,0 @@ -const base = require("../../jest.config.base"); - -module.exports = { - ...base({ path: __dirname }), - // allow css imports in the components - moduleNameMapper: { - "\\.(css|sass)$": "identity-obj-proxy" - } -}; diff --git a/packages/react-rich-text-lexical-renderer/vitest.config.ts b/packages/react-rich-text-lexical-renderer/vitest.config.ts new file mode 100644 index 00000000000..b4dd27b06c5 --- /dev/null +++ b/packages/react-rich-text-lexical-renderer/vitest.config.ts @@ -0,0 +1,10 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ + path: import.meta.dirname, + vitestConfig: { + environment: "jsdom" + } + }); +}; diff --git a/packages/wcp/jest.config.js b/packages/wcp/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/wcp/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/testing/createTestConfig.ts b/testing/createTestConfig.ts index b3b8dd2b731..03f3e23b65e 100644 --- a/testing/createTestConfig.ts +++ b/testing/createTestConfig.ts @@ -45,6 +45,7 @@ export const createTestConfig = async ({ include: [`${path}/**/*${type}.test.[jt]s?(x)`], dir: path, ...vitestConfig, + css: false, alias: [ { find: /^~tests(.*)/, @@ -53,9 +54,6 @@ export const createTestConfig = async ({ { find: /^~(.*)/, replacement: `${path}/src$1` }, ...((vitestConfig.alias ?? []) as Alias) ] - // globals: { TODO: add this via a setupFile - // WEBINY_VERSION: version - // }, }; const setupAfterEnv = join(path, "__tests__", "setup", "setupAfterEnv.js"); From f8427e8761e2b5c8c2f01aa629ec886124b93223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Zori=C4=87?= Date: Mon, 8 Sep 2025 13:02:41 +0200 Subject: [PATCH 04/13] fix: api headless cms tests --- .eslintrc.cjs | 13 +- package.json | 1 + .../contentAPI/aco/acoGraphQl.test.ts | 4 +- .../__tests__/contentAPI/benchmark.test.ts | 4 +- .../contentAPI/cmsEndpointAccess.test.ts | 13 +- .../contentAPI/cmsEntryStatus.test.ts | 1 + .../contentEntry.crud.validation.test.ts | 1 + .../contentEntry.optionalValidation.test.ts | 1 + .../cmsEntryValidation/mocks/errors.ts | 1 + .../contentAPI/contentEntries.test.ts | 1 + .../contentAPI/contentEntriesDeletion.test.ts | 3 +- ...entEntriesDeprecatedOnByMetaFields.test.ts | 8 +- .../contentEntriesOnByMetaFields.test.ts | 7 +- ...tentEntriesOnByMetaFieldsOverrides.test.ts | 5 +- ...entEntriesOnByMetaFieldsPublishing.test.ts | 13 +- ...ontentEntriesOnByMetaFieldsQueries.test.ts | 5 +- .../contentAPI/contentEntry.delete.test.ts | 6 +- .../contentEntry.deleteMultiple.test.ts | 6 +- .../contentAPI/contentEntry.move.test.ts | 1 + ...Entry.publishOldPublishedRevisions.test.ts | 7 +- .../contentAPI/contentEntry.restore.test.ts | 8 +- .../contentAPI/contentEntry.withId.test.ts | 1 + .../contentEntryCustomDates.test.ts | 1 + .../contentEntryCustomIdentities.test.s.ts | 1 + .../contentAPI/contentEntryHooks.test.ts | 17 +-- .../contentAPI/contentEntryMetaField.test.ts | 1 + .../contentAPI/contentModel.clone.test.ts | 1 + .../contentAPI/contentModel.code.test.ts | 18 +-- .../contentModel.crud.defaultFields.test.ts | 1 + .../contentModel.crud.images.test.ts | 5 +- .../contentModel.crud.modelId.test.ts | 5 +- .../contentModel.crud.noFieldPlugin.test.ts | 5 +- .../contentModel.crud.private.test.ts | 2 +- ...contentModel.crud.reservedModelIds.test.ts | 3 +- .../contentAPI/contentModel.crud.test.ts | 37 ++--- .../contentModel.crud.uniqueModelId.test.ts | 5 +- .../contentAPI/contentModelGroup.crud.test.ts | 17 +-- .../contentModelToSDL.manage.test.ts | 9 +- .../contentAPI/contentModelToSDL.read.test.ts | 9 +- .../contentAPI/deepNestedObject.test.ts | 1 + .../contentAPI/dynamicZoneField.test.ts | 1 + .../contentAPI/entryPagination.test.ts | 10 +- .../contentAPI/export.structure.test.ts | 1 + .../contentAPI/extendingGqlSchema.test.ts | 3 +- .../extendingGqlSchemaError.test.ts | 3 +- .../contentAPI/fieldValidations.test.ts | 25 ++-- .../__tests__/contentAPI/filtering.test.ts | 34 ++--- .../contentAPI/graphQlAndQueries.test.ts | 1 + .../contentAPI/graphQlOrQueries.test.ts | 1 + .../__tests__/contentAPI/httpOptions.test.ts | 3 +- .../contentAPI/import.structure.test.ts | 1 + .../contentAPI/latestEntries.test.ts | 7 +- .../__tests__/contentAPI/model.delete.test.ts | 1 + .../contentAPI/multipleValues.test.ts | 5 +- .../contentAPI/pluginsContentModels.test.ts | 9 +- .../pluginsContentModelsRef.test.ts | 3 +- .../contentAPI/predefinedValues.test.ts | 9 +- .../__tests__/contentAPI/refField.test.ts | 1 + .../__tests__/contentAPI/references.test.ts | 1 + .../publishedAndUnpublished.test.ts | 1 + .../contentAPI/republish.entries.test.ts | 7 +- .../resolvers.apiKey.manage.test.ts | 3 +- .../contentAPI/resolvers.apiKey.read.test.ts | 13 +- .../contentAPI/resolvers.manage.test.ts | 42 +++--- .../contentAPI/resolvers.read.test.ts | 52 +++---- .../contentAPI/revisionIdScalar.test.ts | 1 + .../contentAPI/richTextField.test.ts | 5 +- .../__tests__/contentAPI/search.test.ts | 1 + .../security/basePermissions.test.ts | 9 +- .../security/contentEntries/delete.test.ts | 3 +- .../security/contentEntries/write.test.ts | 5 +- .../contentModelGroups/delete.test.ts | 3 +- .../security/contentModelGroups/write.test.ts | 5 +- .../security/contentModels/delete.test.ts | 5 +- .../security/contentModels/write.test.ts | 5 +- .../__tests__/contentAPI/security/utils.ts | 1 + .../contentAPI/singletonContentEntry.test.ts | 6 +- .../__tests__/contentAPI/sorting.test.ts | 10 +- .../contentAPI/storageTransform.test.ts | 1 + .../contentTraverser/modelAst.test.ts | 1 + .../contentTraverser/traverser.test.ts | 1 + .../fieldIdStorageConverter.test.ts | 10 +- .../filtering/product.conditional.test.ts | 1 + .../filtering/product.nestedObject.test.ts | 1 + .../__tests__/graphql/numbersModel.test.ts | 1 + .../__tests__/helpers/renderSortEnum.test.ts | 1 + .../__tests__/helpers/toSlug.test.ts | 1 + .../helpers/validateStorageId.test.ts | 1 + .../onBeforeEntryPublish.test.ts | 1 + .../__tests__/mainAPI/settings.crud.test.ts | 13 +- .../__tests__/parameters/header.test.ts | 1 + .../__tests__/plugins/storage/date.test.ts | 9 +- .../plugins/storage/dynamicZone.test.ts | 1 + .../__tests__/plugins/storage/object.test.ts | 1 + .../storageOperations/entries.test.ts | 7 +- .../fieldUniqueValues.test.ts | 1 + .../__tests__/utils/modelFieldTraverser.ts.ts | 1 + .../validations/validateModelFields.test.ts | 1 + .../__tests__/validators/date.test.ts | 17 +-- .../__tests__/validators/time.test.ts | 13 +- .../{jest.setup.js => vitest.setup.ts} | 4 +- yarn.lock | 133 +++++++++++++++++- 102 files changed, 493 insertions(+), 273 deletions(-) rename packages/api-headless-cms/{jest.setup.js => vitest.setup.ts} (76%) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 74bbcb9c930..6d1e64b3f86 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -9,7 +9,7 @@ function getNoUnusedVars() { module.exports = { extends: [ "plugin:@typescript-eslint/recommended", - "plugin:jest/recommended", + "plugin:@vitest/legacy-recommended", "plugin:react/recommended" ], parser: "@typescript-eslint/parser", @@ -18,9 +18,8 @@ module.exports = { tsconfigRootDir: __dirname, sourceType: "module" }, - plugins: ["@typescript-eslint", "jest", "import", "react", "lodash"], + plugins: ["@typescript-eslint", "@vitest", "import", "react", "lodash"], env: { - jest: true, commonjs: true, node: true, es6: true @@ -59,12 +58,12 @@ module.exports = { // Temporarily disable this rule "@typescript-eslint/no-non-null-assertion": 0, curly: ["error"], - "jest/expect-expect": 0, + "@vitest/expect-expect": 0, // Sometimes we have to use expect() inside try/catch clause (for async calls). // This rule raises an error when you do that, so we disabled it. - "jest/no-conditional-expect": 0, - "jest/no-commented-out-tests": 0, - "jest/no-disabled-tests": 0, + "@vitest/no-conditional-expect": 0, + "@vitest/no-commented-out-tests": 0, + "@vitest/no-disabled-tests": 0, "lodash/import-scope": [2, "method"], "no-restricted-imports": [ "error", diff --git a/package.json b/package.json index 915377bd5c1..6c60134226c 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "@types/react-dom": "18.2.25", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "@vitest/eslint-plugin": "^1.3.9", "adio": "^2.0.1", "axios": "^1.8.2", "babel-loader": "^9.2.1", diff --git a/packages/api-headless-cms/__tests__/contentAPI/aco/acoGraphQl.test.ts b/packages/api-headless-cms/__tests__/contentAPI/aco/acoGraphQl.test.ts index c0927ad8418..7ead5b2c7e1 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/aco/acoGraphQl.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/aco/acoGraphQl.test.ts @@ -1,8 +1,6 @@ +import { describe, it, expect } from "vitest"; import { useGraphQLHandler } from "./setup/useGraphQLHandler"; import { ROOT_FOLDER } from "~/constants"; -import { jest } from "@jest/globals"; - -jest.retryTimes(0); const entryId = `custom-entry-id`; const id = `${entryId}#0001`; diff --git a/packages/api-headless-cms/__tests__/contentAPI/benchmark.test.ts b/packages/api-headless-cms/__tests__/contentAPI/benchmark.test.ts index 066f9345342..87e80010737 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/benchmark.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/benchmark.test.ts @@ -1,6 +1,6 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { useGraphQLHandler } from "~tests/testHelpers/useGraphQLHandler"; import { ContextPlugin } from "@webiny/api"; -import { jest } from "@jest/globals"; describe("benchmark points", () => { let elapsed = 0; @@ -23,7 +23,7 @@ describe("benchmark points", () => { it("should run benchmark and have required points present in the log", async () => { const logs: any[] = []; - jest.spyOn(console, "log").mockImplementation((...args) => { + vi.spyOn(console, "log").mockImplementation((...args) => { logs.push(...args); }); diff --git a/packages/api-headless-cms/__tests__/contentAPI/cmsEndpointAccess.test.ts b/packages/api-headless-cms/__tests__/contentAPI/cmsEndpointAccess.test.ts index ec6214f37f4..b050d32326d 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/cmsEndpointAccess.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/cmsEndpointAccess.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { CmsGroup, CmsModel } from "~/types"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { useCategoryManageHandler } from "../testHelpers/useCategoryManageHandler"; @@ -86,7 +87,7 @@ describe("Endpoint access", () => { } }; - test(`user has access to manage endpoint`, async () => { + it(`user has access to manage endpoint`, async () => { await setupContentModel(); const { listCategories } = useCategoryManageHandler({ ...manageOpts, @@ -115,7 +116,7 @@ describe("Endpoint access", () => { }); }); - test(`user does not have access to manage endpoint`, async () => { + it(`user does not have access to manage endpoint`, async () => { await setupContentModel(); const { listCategories } = useCategoryManageHandler({ ...manageOpts, @@ -144,7 +145,7 @@ describe("Endpoint access", () => { }); }); - test(`user has access to read endpoint`, async () => { + it(`user has access to read endpoint`, async () => { await setupContentModel(); const { listCategories } = useCategoryReadHandler({ ...readOpts, @@ -173,7 +174,7 @@ describe("Endpoint access", () => { }); }); - test(`user does not have access to read endpoint`, async () => { + it(`user does not have access to read endpoint`, async () => { await setupContentModel(); const { listCategories } = useCategoryReadHandler({ ...readOpts, @@ -203,7 +204,7 @@ describe("Endpoint access", () => { }); }); - test(`user has access to preview endpoint`, async () => { + it(`user has access to preview endpoint`, async () => { await setupContentModel(); const { listCategories } = useCategoryReadHandler({ ...previewOpts, @@ -232,7 +233,7 @@ describe("Endpoint access", () => { }); }); - test(`user does not have access to preview endpoint`, async () => { + it(`user does not have access to preview endpoint`, async () => { await setupContentModel(); const { listCategories } = useCategoryReadHandler({ ...previewOpts, diff --git a/packages/api-headless-cms/__tests__/contentAPI/cmsEntryStatus.test.ts b/packages/api-headless-cms/__tests__/contentAPI/cmsEntryStatus.test.ts index 6d9739aa421..053abcb5904 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/cmsEntryStatus.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/cmsEntryStatus.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { useCategoryManageHandler } from "../testHelpers/useCategoryManageHandler"; import camelCase from "lodash/camelCase"; import { CmsGroup } from "~/types"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/contentEntry.crud.validation.test.ts b/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/contentEntry.crud.validation.test.ts index 75da9a6d734..047fa310384 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/contentEntry.crud.validation.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/contentEntry.crud.validation.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useValidationManageHandler } from "./handler"; import ucFirst from "lodash/upperFirst"; import camelCase from "lodash/camelCase"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/contentEntry.optionalValidation.test.ts b/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/contentEntry.optionalValidation.test.ts index be38bdf60e2..1e59c244c63 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/contentEntry.optionalValidation.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/contentEntry.optionalValidation.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createValidationStructure } from "~tests/contentAPI/cmsEntryValidation/mocks/structure"; import { useValidationManageHandler } from "~tests/contentAPI/cmsEntryValidation/handler"; import { diff --git a/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/mocks/errors.ts b/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/mocks/errors.ts index 583d76a84a7..9eaabd707e7 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/mocks/errors.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/mocks/errors.ts @@ -1,3 +1,4 @@ +import { expect } from "vitest"; import { CmsDynamicZoneTemplate, CmsModelFieldInput } from "~/types"; const nestedErrorRegex = /^(nested|dz)([A-Za-z]+)$/; diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntries.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntries.test.ts index b36d7783d1e..473f17e2830 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntries.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntries.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useFruitManageHandler } from "../testHelpers/useFruitManageHandler"; import { Fruit } from "./mocks/contentModels"; import { setupContentModelGroup, setupContentModels } from "../testHelpers/setup"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntriesDeletion.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntriesDeletion.test.ts index a9e9c988e57..aa71e0b8320 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntriesDeletion.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntriesDeletion.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, beforeEach, it } from "vitest"; import { useTestModelHandler } from "~tests/testHelpers/useTestModelHandler"; import { identityA } from "./security/utils"; @@ -10,7 +11,7 @@ describe("Content entries - Entry Deletion", () => { await manage.setup(); }); - test("MANAGE/READ GraphQL APIs should reflect revision deletions correctly", async () => { + it("MANAGE/READ GraphQL APIs should reflect revision deletions correctly", async () => { const { data: revision1 } = await manage.createTestEntry({ data: { title: "Revision 1" } }); const { data: revision2 } = await manage.createTestEntryFrom({ diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntriesDeprecatedOnByMetaFields.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntriesDeprecatedOnByMetaFields.test.ts index d8309359a13..047f5c05f53 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntriesDeprecatedOnByMetaFields.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntriesDeprecatedOnByMetaFields.test.ts @@ -1,13 +1,13 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { SecurityIdentity } from "@webiny/api-security/types"; import { useTestModelHandler } from "~tests/testHelpers/useTestModelHandler"; import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; import { PutCommand, QueryCommand, unmarshall } from "@webiny/aws-sdk/client-dynamodb"; import { CmsGraphQLSchemaPlugin } from "@webiny/api-headless-cms/plugins"; -import { jest } from "@jest/globals"; const identityA: SecurityIdentity = { id: "a", type: "admin", displayName: "A" }; -jest.mock("~/graphql/getSchema/generateCacheId", () => { +vi.mock("~/graphql/getSchema/generateCacheId", () => { return { generateCacheId: () => Date.now() }; @@ -22,7 +22,7 @@ describe("Content entries - Entry Meta Fields", () => { await manageApiIdentityA.setup(); }); - test("deprecated 'publishedOn' and 'ownedBy' GraphQL fields should still return values", async () => { + it("deprecated 'publishedOn' and 'ownedBy' GraphQL fields should still return values", async () => { const { data: testEntry } = await manageApiIdentityA.createTestEntry(); // Let's directly insert values for deprecated fields. @@ -105,7 +105,7 @@ describe("Content entries - Entry Meta Fields", () => { } }); - test("deprecated 'publishedOn' and 'ownedBy' GraphQL fields should fall back to new fields if no value is present", async () => { + it("deprecated 'publishedOn' and 'ownedBy' GraphQL fields should fall back to new fields if no value is present", async () => { const { data: testEntry } = await manageApiIdentityA.createTestEntry(); const { data: publishedTestEntry } = await manageApiIdentityA.publishTestEntry({ diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFields.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFields.test.ts index c48126164a6..e66b53c8ccb 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFields.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFields.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { SecurityIdentity } from "@webiny/api-security/types"; import { useTestModelHandler } from "~tests/testHelpers/useTestModelHandler"; @@ -16,7 +17,7 @@ describe("Content entries - Entry Meta Fields", () => { await manageApiIdentityA.setup(); }); - test("created entries should have xOn/xBy meta fields populated correctly", async () => { + it("created entries should have xOn/xBy meta fields populated correctly", async () => { // 1. Initially, all meta fields should be populated, except the "modified" ones. // We must see the same change when listing entries. let { data: revision1 } = await manageApiIdentityA.createTestEntry(); @@ -129,7 +130,7 @@ describe("Content entries - Entry Meta Fields", () => { expect(entriesList[0].modifiedOn > revision1.modifiedOn).toBe(true); }); - test("updating a previous revision should update entry-level meta fields", async () => { + it("updating a previous revision should update entry-level meta fields", async () => { let { data: revision1 } = await manageApiIdentityA.createTestEntry(); let { data: revision2 } = await manageApiIdentityA.createTestEntryFrom({ @@ -181,7 +182,7 @@ describe("Content entries - Entry Meta Fields", () => { expect(revision2.savedBy).not.toEqual(revision3.savedBy); }); - test("deleting latest revision should cause the entry-level meta field values to be propagated to the new latest revision", async () => { + it("deleting latest revision should cause the entry-level meta field values to be propagated to the new latest revision", async () => { let { data: revision1 } = await manageApiIdentityA.createTestEntry(); const { title, slug } = revision1; diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFieldsOverrides.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFieldsOverrides.test.ts index 11426f24fd1..7eef55950fb 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFieldsOverrides.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFieldsOverrides.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { useTestModelHandler } from "~tests/testHelpers/useTestModelHandler"; import { identityA, identityB, identityC, identityD } from "./security/utils"; @@ -10,7 +11,7 @@ describe("Content entries - Entry Meta Fields Overrides", () => { await manageIdentityA.setup(); }); - test("users should be able to create and immediately publish an entry with custom publishing-related values", async () => { + it("users should be able to create and immediately publish an entry with custom publishing-related values", async () => { // 1. Initially, all meta fields should be populated, except the "modified" ones. const testDate = new Date("2020-01-01T00:00:00.000Z").toISOString(); @@ -44,7 +45,7 @@ describe("Content entries - Entry Meta Fields Overrides", () => { }); }); - test("users should be able to create a new revision from an existing revision and immediately publish it with custom publishing-related values", async () => { + it("users should be able to create a new revision from an existing revision and immediately publish it with custom publishing-related values", async () => { // 1. Initially, all meta fields should be populated, except the "modified" ones. const testDate1 = new Date("2020-01-01T00:00:00.000Z").toISOString(); const testDate2 = new Date("2021-01-01T00:00:00.000Z").toISOString(); diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFieldsPublishing.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFieldsPublishing.test.ts index e3f06d5b257..31c1ec31369 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFieldsPublishing.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFieldsPublishing.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { useTestModelHandler } from "~tests/testHelpers/useTestModelHandler"; import { SecurityIdentity } from "@webiny/api-security/types"; import { pickEntryMetaFields } from "~/constants"; @@ -17,7 +18,7 @@ describe("Content Entries - Publishing-related Entry Meta Fields", () => { await manageApiIdentityA.setup(); }); - test("revision and entry-level fields should be populated correctly on publish", async () => { + it("revision and entry-level fields should be populated correctly on publish", async () => { let { data: rev } = await manageApiIdentityA.createTestEntry(); const publish = await manageApiIdentityA.publishTestEntry({ revision: rev.id }); @@ -49,7 +50,7 @@ describe("Content Entries - Publishing-related Entry Meta Fields", () => { expect(entriesList[0].revisionLastPublishedBy).toEqual(rev.revisionLastPublishedBy); }); - test("publishing a second revision should not affect the entry meta fields of the first revision", async () => { + it("publishing a second revision should not affect the entry meta fields of the first revision", async () => { let { data: rev1 } = await manageApiIdentityA.createTestEntry(); let { data: rev2 } = await manageApiIdentityA.createTestEntryFrom({ @@ -98,7 +99,7 @@ describe("Content Entries - Publishing-related Entry Meta Fields", () => { expect(entriesList[0].revisionFirstPublishedBy).toEqual(rev2.revisionLastPublishedBy); }); - test("when publishing a non-latest revision, the latest revision's entry meta fields should be updated", async () => { + it("when publishing a non-latest revision, the latest revision's entry meta fields should be updated", async () => { const { data: rev1 } = await manageApiIdentityA.createTestEntry(); const { data: rev2 } = await manageApiIdentityA.createTestEntryFrom({ @@ -316,7 +317,7 @@ describe("Content Entries - Publishing-related Entry Meta Fields", () => { }); }); - test("unpublishing and publishing a latest revision should update lastPublished meta fields", async () => { + it("unpublishing and publishing a latest revision should update lastPublished meta fields", async () => { const { data: rev } = await manageApiIdentityA.createTestEntry(); const publish1 = await manageApiIdentityA.publishTestEntry({ revision: rev.id }); @@ -358,7 +359,7 @@ describe("Content Entries - Publishing-related Entry Meta Fields", () => { expect(entriesListAfterPublish2[0]).toMatchObject(matchObject); }); - test("unpublishing and publishing a non-latest revision should update lastPublished meta fields on the actual revision and on the latest one", async () => { + it("unpublishing and publishing a non-latest revision should update lastPublished meta fields on the actual revision and on the latest one", async () => { const { data: rev1 } = await manageApiIdentityA.createTestEntry(); const { data: rev2 } = await manageApiIdentityA.createTestEntryFrom({ @@ -423,7 +424,7 @@ describe("Content Entries - Publishing-related Entry Meta Fields", () => { expect(entriesListAfterPublish2[0]).toMatchObject(matchObject); }); - test("republishing a latest revision should only change lastPublished meta fields", async () => { + it("republishing a latest revision should only change lastPublished meta fields", async () => { const { data: rev } = await manageApiIdentityA.createTestEntry(); const publish1 = await manageApiIdentityA.publishTestEntry({ revision: rev.id }); diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFieldsQueries.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFieldsQueries.test.ts index 79c7b6abd65..eafad5d2227 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFieldsQueries.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntriesOnByMetaFieldsQueries.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { useTestModelHandler } from "~tests/testHelpers/useTestModelHandler"; import { SecurityIdentity } from "@webiny/api-security/types"; @@ -30,7 +31,7 @@ describe("Content entries - Entry Meta Fields Queries", () => { } }); - test("should be able to sort by revision-level meta fields", async () => { + it("should be able to sort by revision-level meta fields", async () => { const [testEntry1, testEntry2, testEntry3, testEntry4] = testEntries; // Sorting by `revisionCreatedOn` should return entries sorted by the `revisionCreatedOn` field. @@ -80,7 +81,7 @@ describe("Content entries - Entry Meta Fields Queries", () => { expect(entriesListByCreatedOnAscReadApi).toMatchObject(matchObject2); }); - test("should be able to filter by revision-level meta fields", async () => { + it("should be able to filter by revision-level meta fields", async () => { const [testEntry1, testEntry2, testEntry3, testEntry4] = testEntries; // Filter entries created by identity A. diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntry.delete.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntry.delete.test.ts index 54eecb3368a..ee7b308ac55 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntry.delete.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntry.delete.test.ts @@ -1,12 +1,14 @@ +import { describe, it, expect, vi } from "vitest"; import { setupContentModelGroup, setupContentModels } from "~tests/testHelpers/setup"; import { useCategoryManageHandler } from "~tests/testHelpers/useCategoryManageHandler"; import { CmsEntry } from "~/types"; import { toSlug } from "~/utils/toSlug"; import { useCategoryReadHandler } from "~tests/testHelpers/useCategoryReadHandler"; import { ROOT_FOLDER } from "~/constants"; -import { jest } from "@jest/globals"; -jest.setTimeout(100000); +vi.setConfig({ + testTimeout: 100_000 +}); interface CreateCategoryParams { title: string; diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntry.deleteMultiple.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntry.deleteMultiple.test.ts index ea1085f1fc4..9a7a5589133 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntry.deleteMultiple.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntry.deleteMultiple.test.ts @@ -1,12 +1,14 @@ +import { describe, it, expect, vi } from "vitest"; import { setupContentModelGroup, setupContentModels } from "~tests/testHelpers/setup"; import { useCategoryManageHandler } from "~tests/testHelpers/useCategoryManageHandler"; import { CmsEntry } from "~/types"; import { toSlug } from "~/utils/toSlug"; import { useCategoryReadHandler } from "~tests/testHelpers/useCategoryReadHandler"; import { parseIdentifier } from "@webiny/utils"; -import { jest } from "@jest/globals"; -jest.setTimeout(100000); +vi.setConfig({ + testTimeout: 100_000, +}); interface CreateCategoryParams { amount?: number; diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntry.move.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntry.move.test.ts index 8f419886632..040cfc26ee7 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntry.move.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntry.move.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { setupGroupAndModels } from "~tests/testHelpers/setup"; import { useCategoryManageHandler } from "~tests/testHelpers/useCategoryManageHandler"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntry.publishOldPublishedRevisions.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntry.publishOldPublishedRevisions.test.ts index e58d668ccd0..f832b0055ca 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntry.publishOldPublishedRevisions.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntry.publishOldPublishedRevisions.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { useTestModelHandler } from "~tests/testHelpers/useTestModelHandler"; import { identityA } from "./security/utils"; @@ -10,7 +11,7 @@ describe("Content entries - Entry Publishing", () => { await manage.setup(); }); - test("should be able to publish a previously published revision (entry already has the latest revision published)", async () => { + it("should be able to publish a previously published revision (entry already has the latest revision published)", async () => { const { data: revision1 } = await manage.createTestEntry({ data: { title: "Revision 1" } }); await manage.publishTestEntry({ @@ -43,7 +44,7 @@ describe("Content entries - Entry Publishing", () => { expect(readEntriesList).toMatchObject([{ id: revision1.id, title: "Revision 1" }]); }); - test("should be able to publish a previously published revision (entry already has a non-latest revision published)", async () => { + it("should be able to publish a previously published revision (entry already has a non-latest revision published)", async () => { const { data: revision1 } = await manage.createTestEntry({ data: { title: "Revision 1" } }); @@ -161,7 +162,7 @@ describe("Content entries - Entry Publishing", () => { } }); - test("should be able to publish a previously published revision (entry already has a non-latest revision published, using `createFrom` mutations to publish in this test)", async () => { + it("should be able to publish a previously published revision (entry already has a non-latest revision published, using `createFrom` mutations to publish in this test)", async () => { const { data: revision1 } = await manage.createTestEntry({ data: { title: "Revision 1" } }); diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntry.restore.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntry.restore.test.ts index 40108cee7ab..a560a43fbd7 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntry.restore.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntry.restore.test.ts @@ -1,12 +1,14 @@ -import { setupContentModelGroup, setupContentModels } from "~tests/testHelpers/setup"; + +import { describe, it, expect, beforeEach, vi } from "vitest";import { setupContentModelGroup, setupContentModels } from "~tests/testHelpers/setup"; import { useCategoryManageHandler } from "~tests/testHelpers/useCategoryManageHandler"; import { useCategoryReadHandler } from "~tests/testHelpers/useCategoryReadHandler"; import { CmsEntry } from "~/types"; import { toSlug } from "~/utils/toSlug"; import { ROOT_FOLDER } from "~/constants"; -import { jest } from "@jest/globals"; -jest.setTimeout(100000); +vi.setConfig({ + testTimeout: 100_000, +}) interface CreateCategoryParams { title: string; diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntry.withId.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntry.withId.test.ts index 848f3cf2bd8..9a7e443da8f 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntry.withId.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntry.withId.test.ts @@ -2,6 +2,7 @@ * This test determines that a user can send a custom ID when creating a content entry. * The rest of functionality and limitations remain the same. */ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { setupContentModelGroup, setupContentModels } from "~tests/testHelpers/setup"; import { useCategoryManageHandler } from "~tests/testHelpers/useCategoryManageHandler"; import { useProductManageHandler } from "~tests/testHelpers/useProductManageHandler"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntryCustomDates.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntryCustomDates.test.ts index 94ababbf4b3..f4f2da5084f 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntryCustomDates.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntryCustomDates.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { useCategoryManageHandler } from "../testHelpers/useCategoryManageHandler"; import { setupGroupAndModels } from "~tests/testHelpers/setup"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntryCustomIdentities.test.s.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntryCustomIdentities.test.s.ts index 9487df7c3b8..5ec9dd131a0 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntryCustomIdentities.test.s.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntryCustomIdentities.test.s.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { useCategoryManageHandler } from "~tests/testHelpers/useCategoryManageHandler"; import { setupGroupAndModels } from "~tests/testHelpers/setup"; import { SecurityIdentity } from "@webiny/api-security/types"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntryHooks.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntryHooks.test.ts index a47759eb212..9ee12f35037 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntryHooks.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntryHooks.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { useCategoryManageHandler } from "../testHelpers/useCategoryManageHandler"; import { assignEntryEvents, pubSubTracker } from "./mocks/lifecycleHooks"; import models from "./mocks/contentModels"; @@ -66,7 +67,7 @@ describe("contentEntryHooks", () => { pubSubTracker.reset(); }); - test("should execute hooks on create", async () => { + it("should execute hooks on create", async () => { const { createCategory } = useCategoryManageHandler({ ...manageOpts, plugins: [assignEntryEvents()] @@ -104,7 +105,7 @@ describe("contentEntryHooks", () => { expect(pubSubTracker.isExecutedOnce("contentEntry:afterUnpublish")).toEqual(false); }); - test("should execute hooks on create from revision", async () => { + it("should execute hooks on create from revision", async () => { const { createCategory, createCategoryFrom } = useCategoryManageHandler({ ...manageOpts, plugins: [assignEntryEvents()] @@ -148,7 +149,7 @@ describe("contentEntryHooks", () => { expect(pubSubTracker.isExecutedOnce("contentEntry:afterUnpublish")).toEqual(false); }); - test("should execute hooks on update", async () => { + it("should execute hooks on update", async () => { const { createCategory, updateCategory } = useCategoryManageHandler({ ...manageOpts, plugins: [assignEntryEvents()] @@ -198,7 +199,7 @@ describe("contentEntryHooks", () => { expect(pubSubTracker.isExecutedOnce("contentEntry:afterUnpublish")).toEqual(false); }); - test("should execute hooks on delete revision", async () => { + it("should execute hooks on delete revision", async () => { const { createCategory, createCategoryFrom, deleteCategory } = useCategoryManageHandler({ ...manageOpts, plugins: [assignEntryEvents()] @@ -251,7 +252,7 @@ describe("contentEntryHooks", () => { expect(pubSubTracker.isExecutedOnce("contentEntry:afterUnpublish")).toEqual(false); }); - test("should execute hooks on delete whole entry and its versions", async () => { + it("should execute hooks on delete whole entry and its versions", async () => { const { createCategory, deleteCategory } = useCategoryManageHandler({ ...manageOpts, plugins: [assignEntryEvents()] @@ -301,7 +302,7 @@ describe("contentEntryHooks", () => { expect(pubSubTracker.isExecutedOnce("contentEntry:afterUnpublish")).toEqual(false); }); - test("should execute hooks on publish", async () => { + it("should execute hooks on publish", async () => { const { createCategory, publishCategory } = useCategoryManageHandler({ ...manageOpts, plugins: [assignEntryEvents()] @@ -349,7 +350,7 @@ describe("contentEntryHooks", () => { expect(pubSubTracker.isExecutedOnce("contentEntry:afterUnpublish")).toEqual(false); }); - test("should execute hooks on unpublish", async () => { + it("should execute hooks on unpublish", async () => { const { createCategory, unpublishCategory, publishCategory } = useCategoryManageHandler({ ...manageOpts, plugins: [assignEntryEvents()] @@ -401,7 +402,7 @@ describe("contentEntryHooks", () => { expect(pubSubTracker.isExecutedOnce("contentEntry:afterUnpublish")).toEqual(true); }); - test("should execute hooks on get and list", async () => { + it("should execute hooks on get and list", async () => { const { createCategory, getCategory, listCategories } = useCategoryManageHandler({ ...manageOpts, plugins: [assignEntryEvents()] diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntryMetaField.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntryMetaField.test.ts index 24005cc9e5f..dded2ee91c7 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentEntryMetaField.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntryMetaField.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import models from "./mocks/contentModels"; import { CmsEntry, CmsGroup, CmsModel } from "~/types"; import { useCategoryManageHandler } from "../testHelpers/useCategoryManageHandler"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentModel.clone.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentModel.clone.test.ts index 89784c56634..11ae12a6002 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentModel.clone.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentModel.clone.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { CmsGroup, CmsModel, CmsModelField } from "~/types"; import models from "./mocks/contentModels"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentModel.code.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentModel.code.test.ts index 1d67bb2daaa..139a36f3947 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentModel.code.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentModel.code.test.ts @@ -1,20 +1,16 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { CmsModelPlugin } from "~/plugins"; -import { jest } from "@jest/globals"; describe("content model via code", () => { beforeEach(async () => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); afterEach(async () => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it("should properly construct content model via code and call build fields", async () => { - /** - * Types are not properly defined for jest.spyOn. - */ - // @ts-expect-error - const buildFields = jest.spyOn(CmsModelPlugin.prototype, "buildFields"); + const buildFields = vi.spyOn(CmsModelPlugin.prototype, "buildFields" as never); const model = new CmsModelPlugin({ group: { @@ -62,11 +58,7 @@ describe("content model via code", () => { }); it("should properly construct content model via code and not call build fields", async () => { - /** - * Types are not properly defined for jest.spyOn. - */ - // @ts-expect-error - const buildFields = jest.spyOn(CmsModelPlugin.prototype, "buildFields"); + const buildFields = vi.spyOn(CmsModelPlugin.prototype, "buildFields" as never); const model = new CmsModelPlugin({ noValidate: true, diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.defaultFields.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.defaultFields.test.ts index 7e7b00f2eb4..bd2106aa425 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.defaultFields.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.defaultFields.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach } from "vitest"; import { CmsGroup } from "~/types"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.images.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.images.test.ts index e2b3d1cadfa..de122a73ebd 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.images.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.images.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { useGraphQLHandler } from "~tests/testHelpers/useGraphQLHandler"; import { CmsGroupPlugin } from "~/plugins"; import { createContentModelGroup } from "~tests/contentAPI/mocks/contentModelGroup"; @@ -14,7 +15,9 @@ describe("Content Model Nested Object Images", () => { const model = createImageModel(group); const [result] = await handler.createContentModelMutation({ data: { - ...model + ...model, + icon: model.icon || undefined, + description: undefined, } }); diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.modelId.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.modelId.test.ts index faec8adf21d..691ced946fa 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.modelId.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.modelId.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { CmsGroup } from "~/types"; import camelCase from "lodash/camelCase"; @@ -37,7 +38,7 @@ describe("ContentModel modelId variations", () => { ["Tab sorter", undefined] ]; - test.each(disallowedModelIdEndings)( + it.each(disallowedModelIdEndings)( "should not allow to create model with modelId that clashes with GraphQL (%s, %s) - singularApiName", async (name, modelId) => { const singularApiName = upperFirst(camelCase(modelId || name)); @@ -79,7 +80,7 @@ describe("ContentModel modelId variations", () => { } ); - test.each(disallowedModelIdEndings)( + it.each(disallowedModelIdEndings)( "should not allow to create model with modelId that clashes with GraphQL (%s, %s) - pluralApiName", async (name, modelId) => { const singularApiName = `${upperFirst(camelCase(modelId || name))}OkEnding`; diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.noFieldPlugin.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.noFieldPlugin.test.ts index bdb6363e6a7..dbdf47c54b1 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.noFieldPlugin.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.noFieldPlugin.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { CmsGroup, CmsModelFieldToGraphQLPlugin } from "~/types"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; @@ -50,7 +51,7 @@ describe("content model test no field plugin", () => { contentModelGroup = createCMG.data.createContentModelGroup.data; }); - test("prevent content model update if a backend plugin for a field does not exist", async () => { + it("prevent content model update if a backend plugin for a field does not exist", async () => { await createContentModelMutation({ data: { name: "Test Content model", @@ -128,7 +129,7 @@ describe("content model test no field plugin", () => { }); }); - test("schema generation should not break if an old field type still exists", async () => { + it("schema generation should not break if an old field type still exists", async () => { const customField = customFieldPlugin(); const manageModelAPI = useGraphQLHandler({ ...manageHandlerOpts, diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.private.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.private.test.ts index d02e5fba352..3bdb85351df 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.private.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.private.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { CmsGroupPlugin } from "~/plugins/CmsGroupPlugin"; import { CmsModelPlugin } from "~/plugins/CmsModelPlugin"; @@ -31,7 +32,6 @@ const privateAuthorsModel = new CmsModelPlugin({ id: privateGroup.contentModelGroup.id, name: privateGroup.contentModelGroup.name }, - description: "Authors model with one basic field" }); describe("Private Groups and Models", function () { diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.reservedModelIds.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.reservedModelIds.test.ts index 2ffd8ab3212..212c35fb966 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.reservedModelIds.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.reservedModelIds.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsGroup } from "~/types"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { pubSubTracker } from "./mocks/lifecycleHooks"; @@ -24,7 +25,7 @@ describe("content model test reserved model ids", () => { pubSubTracker.reset(); }); - test(`should not allow creation of a model the modelId set to blacklisted value`, async () => { + it(`should not allow creation of a model the modelId set to blacklisted value`, async () => { const [response1] = await createContentModelMutation({ data: { name: "Content Model", diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.test.ts index 2c6868a803a..7cd1a0583cb 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { CmsGroup, CmsModel, CmsModelField, CmsModelFieldInput } from "~/types"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import * as helpers from "../testHelpers/helpers"; @@ -68,7 +69,7 @@ describe("content model test", () => { pubSubTracker.reset(); }); - test("base schema should only contain relevant queries and mutations", async () => { + it("base schema should only contain relevant queries and mutations", async () => { // create a "read" and "manage" endpoints const readAPI = useGraphQLHandler(readHandlerOpts); const manageAPI = useGraphQLHandler(manageHandlerOpts); @@ -114,7 +115,7 @@ describe("content model test", () => { ]); }); - test("create, read, update, delete and list content models", async () => { + it("create, read, update, delete and list content models", async () => { const { createContentModelMutation, getContentModelQuery, @@ -257,7 +258,7 @@ describe("content model test", () => { }); }); - test("delete existing content model", async () => { + it("delete existing content model", async () => { const { createContentModelMutation, deleteContentModelMutation } = useGraphQLHandler(manageHandlerOpts); @@ -287,7 +288,7 @@ describe("content model test", () => { }); }); - test("cannot delete content model that has entries", async () => { + it("cannot delete content model that has entries", async () => { const { createContentModelMutation, updateContentModelMutation, @@ -425,7 +426,7 @@ describe("content model test", () => { }); }); - test("get existing content model", async () => { + it("get existing content model", async () => { const { createContentModelMutation, getContentModelQuery } = useGraphQLHandler(manageHandlerOpts); @@ -458,7 +459,7 @@ describe("content model test", () => { }); }); - test("error when getting non-existing model", async () => { + it("error when getting non-existing model", async () => { const { getContentModelQuery } = useGraphQLHandler(manageHandlerOpts); const modelId = "nonExistingId"; const [response] = await getContentModelQuery({ @@ -479,7 +480,7 @@ describe("content model test", () => { }); }); - test("error when updating non-existing model", async () => { + it("error when updating non-existing model", async () => { const { updateContentModelMutation } = useGraphQLHandler(manageHandlerOpts); const modelId = "nonExistingId"; const [response] = await updateContentModelMutation({ @@ -505,7 +506,7 @@ describe("content model test", () => { }); }); - test("error when deleting non-existing model", async () => { + it("error when deleting non-existing model", async () => { const { deleteContentModelMutation } = useGraphQLHandler(manageHandlerOpts); const modelId = "nonExistingId"; @@ -527,7 +528,7 @@ describe("content model test", () => { }); }); - test("update content model with new fields", async () => { + it("update content model with new fields", async () => { const { createContentModelMutation, updateContentModelMutation } = useGraphQLHandler(manageHandlerOpts); const modelData: Pick = @@ -650,7 +651,7 @@ describe("content model test", () => { }); }); - test("when assigning `titleFieldId` to a non-existing field, fall back to the first applicable field", async () => { + it("when assigning `titleFieldId` to a non-existing field, fall back to the first applicable field", async () => { const { createContentModelMutation, updateContentModelMutation } = useGraphQLHandler(manageHandlerOpts); const [createResponse] = await createContentModelMutation({ @@ -706,7 +707,7 @@ describe("content model test", () => { }); }); - test("should execute hooks on create", async () => { + it("should execute hooks on create", async () => { const { createContentModelMutation } = useGraphQLHandler({ ...manageHandlerOpts, plugins: [assignModelEvents()] @@ -740,7 +741,7 @@ describe("content model test", () => { expect(pubSubTracker.isExecutedOnce("contentModel:afterDelete")).toEqual(false); }); - test("should execute hooks on create from", async () => { + it("should execute hooks on create from", async () => { const { createContentModelMutation, createContentModelFromMutation } = useGraphQLHandler({ ...manageHandlerOpts, plugins: [assignModelEvents()] @@ -801,7 +802,7 @@ describe("content model test", () => { expect(pubSubTracker.isExecutedOnce("contentModel:afterDelete")).toEqual(false); }); - test("should execute hooks on update", async () => { + it("should execute hooks on update", async () => { const { createContentModelMutation, updateContentModelMutation } = useGraphQLHandler({ ...manageHandlerOpts, plugins: [assignModelEvents()] @@ -848,7 +849,7 @@ describe("content model test", () => { expect(pubSubTracker.isExecutedOnce("contentModel:afterDelete")).toEqual(false); }); - test("should execute hooks on delete", async () => { + it("should execute hooks on delete", async () => { const { createContentModelMutation, deleteContentModelMutation } = useGraphQLHandler({ ...manageHandlerOpts, plugins: [assignModelEvents()] @@ -890,7 +891,7 @@ describe("content model test", () => { expect(pubSubTracker.isExecutedOnce("contentModel:afterDelete")).toEqual(true); }); - test("should refresh the schema when added new field", async () => { + it("should refresh the schema when added new field", async () => { const { createContentModelMutation, updateContentModelMutation } = useGraphQLHandler(manageHandlerOpts); const { listBugs } = useBugManageHandler(manageHandlerOpts); @@ -994,7 +995,7 @@ describe("content model test", () => { }); }); - test("should list only specific content models", async () => { + it("should list only specific content models", async () => { const { createContentModelMutation } = useGraphQLHandler(manageHandlerOpts); const createdContentModels = []; @@ -1026,7 +1027,7 @@ describe("content model test", () => { expect(response.data.listContentModels.data.length).toEqual(1); }); - test("error when getting model without specific group permission", async () => { + it("error when getting model without specific group permission", async () => { const { createContentModelMutation } = useGraphQLHandler(manageHandlerOpts); const createdContentModels = []; @@ -1067,7 +1068,7 @@ describe("content model test", () => { }); }); - test("should be able to get model with specific group permission", async () => { + it("should be able to get model with specific group permission", async () => { const { createContentModelMutation } = useGraphQLHandler(manageHandlerOpts); const createdContentModels = []; diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.uniqueModelId.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.uniqueModelId.test.ts index efbc1826a93..01a001a2dc1 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.uniqueModelId.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentModel.crud.uniqueModelId.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsGroup } from "~/types"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; @@ -20,7 +21,7 @@ describe("content model test", () => { contentModelGroup = createCMG.data.createContentModelGroup.data; }); - test("should not allow creation of a model with an existing modelId", async () => { + it("should not allow creation of a model with an existing modelId", async () => { const { createContentModelMutation } = useGraphQLHandler(manageHandlerOpts); const eventData = { @@ -78,7 +79,7 @@ describe("content model test", () => { }); }); - test("should not allow creation of a model with an existing singularApiName", async () => { + it("should not allow creation of a model with an existing singularApiName", async () => { const { createContentModelMutation } = useGraphQLHandler(manageHandlerOpts); const eventData = { diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentModelGroup.crud.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentModelGroup.crud.test.ts index 3ff479266e4..b2f29b7cfc9 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentModelGroup.crud.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentModelGroup.crud.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { identity } from "../testHelpers/helpers"; import { toSlug } from "~/utils/toSlug"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; @@ -62,7 +63,7 @@ describe("Cms Group crud test", () => { deleteContentModelGroupMutation } = useGraphQLHandler({ path: "manage/en-us" }); - test("content model group create, read, update, delete and list all at once", async () => { + it("content model group create, read, update, delete and list all at once", async () => { const updatedContentModelGroups = []; const prefixes = Array.from(Array(TestHelperEnum.MODELS_AMOUNT).keys()).map(prefix => { return createContentModelGroupPrefix(prefix); @@ -177,7 +178,7 @@ describe("Cms Group crud test", () => { }); }); - test("error when getting non-existing content model group", async () => { + it("error when getting non-existing content model group", async () => { const [response] = await getContentModelGroupQuery({ id: "nonExistingId" }); @@ -195,7 +196,7 @@ describe("Cms Group crud test", () => { }); }); - test("error when trying to update non-existing content model group", async () => { + it("error when trying to update non-existing content model group", async () => { const [response] = await updateContentModelGroupMutation({ id: "nonExistingIdUpdate", data: { @@ -217,7 +218,7 @@ describe("Cms Group crud test", () => { }); }); - test("error when trying to delete non-existing content model group", async () => { + it("error when trying to delete non-existing content model group", async () => { const [response] = await deleteContentModelGroupMutation({ id: "nonExistingIdDelete" }); @@ -235,7 +236,7 @@ describe("Cms Group crud test", () => { }); }); - test("error when trying to create a content model group with incomplete data", async () => { + it("error when trying to create a content model group with incomplete data", async () => { const [nameResponse] = await createContentModelGroupMutation({ data: { name: "", @@ -288,7 +289,7 @@ describe("Cms Group crud test", () => { }); }); - test("error when trying to create a new content model group with no name or slug", async () => { + it("error when trying to create a new content model group with no name or slug", async () => { const [response] = await createContentModelGroupMutation({ data: { name: "", @@ -315,7 +316,7 @@ describe("Cms Group crud test", () => { }); }); - test("error when trying to create a new content model group with same slug as existing one in the database", async () => { + it("error when trying to create a new content model group with same slug as existing one in the database", async () => { await createContentModelGroupMutation({ data: { name: "content model group", @@ -347,7 +348,7 @@ describe("Cms Group crud test", () => { }); }); - test("list specific content model groups", async () => { + it("list specific content model groups", async () => { // Create few content model groups const prefixes = Array.from(Array(TestHelperEnum.MODELS_AMOUNT).keys()).map(prefix => { return createContentModelGroupPrefix(prefix); diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentModelToSDL.manage.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentModelToSDL.manage.test.ts index df64eed424f..a315c3054ad 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentModelToSDL.manage.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentModelToSDL.manage.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import prettier from "prettier"; import contentModels from "./mocks/contentModels"; import { createGraphQLFields } from "~/graphqlFields"; @@ -19,7 +20,7 @@ describe("MANAGE - ContentModel to SDL", () => { const models = [...contentModels]; - test("Category SDL", async () => { + it("Category SDL", async () => { const model = contentModels.find(c => c.modelId === "category") as CmsModel; const sdl = createManageSDL({ models, model, fieldTypePlugins, sorterPlugins: [] }); const prettyGql = await prettier.format(sdl.trim(), { parser: "graphql" }); @@ -27,7 +28,7 @@ describe("MANAGE - ContentModel to SDL", () => { expect(prettyGql).toBe(prettySnapshot); }); - test("Product SDL", async () => { + it("Product SDL", async () => { const model = contentModels.find(c => c.modelId === "product") as CmsModel; const sdl = createManageSDL({ models, model, fieldTypePlugins, sorterPlugins: [] }); const prettyGql = await prettier.format(sdl.trim(), { parser: "graphql" }); @@ -35,7 +36,7 @@ describe("MANAGE - ContentModel to SDL", () => { expect(prettyGql).toBe(prettySnapshot); }); - test("Review SDL", async () => { + it("Review SDL", async () => { const model = contentModels.find(c => c.modelId === "review") as CmsModel; const sdl = createManageSDL({ models, model, fieldTypePlugins, sorterPlugins: [] }); const prettyGql = await prettier.format(sdl.trim(), { parser: "graphql" }); @@ -43,7 +44,7 @@ describe("MANAGE - ContentModel to SDL", () => { expect(prettyGql).toBe(prettySnapshot); }); - test("Dynamic Zone SDL", async () => { + it("Dynamic Zone SDL", async () => { const sdl = createManageSDL({ models, model: pageModel as CmsModel, diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentModelToSDL.read.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentModelToSDL.read.test.ts index 8124f191a19..ed8baee8a80 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/contentModelToSDL.read.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/contentModelToSDL.read.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import prettier from "prettier"; import { createGraphQLFields } from "~/graphqlFields"; import { createReadSDL } from "~/graphql/schema/createReadSDL"; @@ -34,7 +35,7 @@ describe("READ - ContentModel to SDL", () => { const models = [...contentModels]; - test("Category SDL", async () => { + it("Category SDL", async () => { const model = getModel("category"); const sdl = createReadSDL({ models, model, fieldTypePlugins, sorterPlugins: [] }); @@ -43,7 +44,7 @@ describe("READ - ContentModel to SDL", () => { expect(prettyGql).toBe(prettySnapshot); }); - test("Product SDL", async () => { + it("Product SDL", async () => { const model = getModel("product"); const sdl = createReadSDL({ models, model, fieldTypePlugins, sorterPlugins: [] }); @@ -52,7 +53,7 @@ describe("READ - ContentModel to SDL", () => { expect(prettyGql).toBe(prettySnapshot); }); - test("Review SDL", async () => { + it("Review SDL", async () => { const model = getModel("review"); const sdl = createReadSDL({ models, model, fieldTypePlugins, sorterPlugins: [] }); @@ -61,7 +62,7 @@ describe("READ - ContentModel to SDL", () => { expect(prettyGql).toBe(prettySnapshot); }); - test("Dynamic Zone SDL", async () => { + it("Dynamic Zone SDL", async () => { const sdl = createReadSDL({ models, model: pageModel as CmsModel, diff --git a/packages/api-headless-cms/__tests__/contentAPI/deepNestedObject.test.ts b/packages/api-headless-cms/__tests__/contentAPI/deepNestedObject.test.ts index 5dd8e85e537..63f5caaa6e6 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/deepNestedObject.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/deepNestedObject.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { createCarsMutation, createInitializeModelMutation } from "./deepNestedObject/mutation"; import { createCarsModel } from "./deepNestedObject/model"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/dynamicZoneField.test.ts b/packages/api-headless-cms/__tests__/contentAPI/dynamicZoneField.test.ts index b1be97fd09d..044f1023424 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/dynamicZoneField.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/dynamicZoneField.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { pageModel } from "./mocks/pageWithDynamicZonesModel"; import { setupGroupAndModels } from "../testHelpers/setup"; import { usePageManageHandler } from "../testHelpers/usePageManageHandler"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/entryPagination.test.ts b/packages/api-headless-cms/__tests__/contentAPI/entryPagination.test.ts index baf95beadaf..1f14d03ed73 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/entryPagination.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/entryPagination.test.ts @@ -1,14 +1,16 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; import { mdbid } from "@webiny/utils"; import { useFruitManageHandler } from "../testHelpers/useFruitManageHandler"; import { CmsEntry, CmsModel } from "~/types"; import { setupContentModelGroup, setupContentModels } from "../testHelpers/setup"; -import { jest } from "@jest/globals"; const NUMBER_OF_FRUITS = 200; -jest.setTimeout(100000); +vi.setConfig({ + testTimeout: 100_000 +}); -const createFruitData = (counter: number): CmsEntry => { +const createFruitData = (counter: number) => { const entryId = mdbid(); const id = `${entryId}#${String(counter).padStart(4, "0")}`; return { @@ -46,7 +48,7 @@ const createFruitData = (counter: number): CmsEntry => { createdOn: new Date().toISOString(), status: "draft", locked: false - }; + } as unknown as CmsEntry; }; describe("entry pagination", () => { diff --git a/packages/api-headless-cms/__tests__/contentAPI/export.structure.test.ts b/packages/api-headless-cms/__tests__/contentAPI/export.structure.test.ts index 2d15d2a9f92..5e467d23b5b 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/export.structure.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/export.structure.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useGraphQLHandler } from "~tests/testHelpers/useGraphQLHandler"; import { CmsGroup } from "~tests/types"; import models from "./mocks/contentModels"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/extendingGqlSchema.test.ts b/packages/api-headless-cms/__tests__/contentAPI/extendingGqlSchema.test.ts index 12ae6de6f8f..cf08bdb8f4c 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/extendingGqlSchema.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/extendingGqlSchema.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { createCmsGraphQLSchemaPlugin } from "~/plugins"; @@ -25,7 +26,7 @@ const graphqlSchemaPlugin = createCmsGraphQLSchemaPlugin({ }); describe("content model test no field plugin", () => { - test("prevent content model update if a backend plugin for a field does not exist", async () => { + it("prevent content model update if a backend plugin for a field does not exist", async () => { const { invoke } = useGraphQLHandler({ path: "manage/en-US", plugins: [graphqlSchemaPlugin] diff --git a/packages/api-headless-cms/__tests__/contentAPI/extendingGqlSchemaError.test.ts b/packages/api-headless-cms/__tests__/contentAPI/extendingGqlSchemaError.test.ts index 5830443244a..7381149edf1 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/extendingGqlSchemaError.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/extendingGqlSchemaError.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { createCmsGraphQLSchemaPlugin } from "~/plugins"; @@ -10,7 +11,7 @@ const graphqlSchemaPlugin = createCmsGraphQLSchemaPlugin({ }); describe("invalid schema error formatting", () => { - test("print invalid part of the schema", async () => { + it("print invalid part of the schema", async () => { const { invoke } = useGraphQLHandler({ path: "manage/en-US", plugins: [graphqlSchemaPlugin] diff --git a/packages/api-headless-cms/__tests__/contentAPI/fieldValidations.test.ts b/packages/api-headless-cms/__tests__/contentAPI/fieldValidations.test.ts index 655063c47b2..cadb2539257 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/fieldValidations.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/fieldValidations.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { CmsGroup, CmsModel } from "~/types"; import models from "./mocks/contentModels"; @@ -81,7 +82,7 @@ describe("fieldValidations", () => { /** * testing required, minLength and maxLength of the string */ - test(`should return error when validating "name" field`, async () => { + it(`should return error when validating "name" field`, async () => { const group = await setupContentModelGroup(); await setupContentModels(group); @@ -149,7 +150,7 @@ describe("fieldValidations", () => { * testing minLength and maxLength of the array * testing required, gte and lte for each value in the array */ - test(`should return error when validating "numbers" field`, async () => { + it(`should return error when validating "numbers" field`, async () => { const group = await setupContentModelGroup(); await setupContentModels(group); @@ -286,7 +287,7 @@ describe("fieldValidations", () => { /** * testing email pattern */ - test.each(emailPatternTestValues)( + it.each(emailPatternTestValues)( `should return error when validating "email" field with a pattern - %s`, async email => { const group = await setupContentModelGroup(); @@ -342,7 +343,7 @@ describe("fieldValidations", () => { /** * testing url pattern */ - test.each(urlPatternTestValues)( + it.each(urlPatternTestValues)( `should return error when validating "url" field with a pattern - %s`, async url => { const group = await setupContentModelGroup(); @@ -392,7 +393,7 @@ describe("fieldValidations", () => { /** * testing lowercase */ - test.each(lowerCaseTestValues)( + it.each(lowerCaseTestValues)( `should return error when validating "lowerCase" field - %s`, async lowerCase => { const group = await setupContentModelGroup(); @@ -441,7 +442,7 @@ describe("fieldValidations", () => { /** * testing uppercase */ - test.each(upperCaseTestValues)( + it.each(upperCaseTestValues)( `should return error when validating "upperCase" field - %s`, async upperCase => { const group = await setupContentModelGroup(); @@ -486,7 +487,7 @@ describe("fieldValidations", () => { ["2021-01-01", "Date must be lesser or equal than 2020-12-31"] ]; - test.each(dateErrorValidations)( + it.each(dateErrorValidations)( `should return error when validating "date" field - %s`, async (date, message) => { const group = await setupContentModelGroup(); @@ -531,7 +532,7 @@ describe("fieldValidations", () => { ["2021-01-01 14:30:00", "Date must be lesser or equal than 2020-12-31 13:30:00"] ]; - test.each(dateTimeErrorValidations)( + it.each(dateTimeErrorValidations)( `should return error when validating "dateTime" field - %s`, async (dateTime, message) => { const group = await setupContentModelGroup(); @@ -579,7 +580,7 @@ describe("fieldValidations", () => { ["2021-01-01T14:30:00+01:00", "Date must be lesser or equal than 2020-12-31T13:30:00+0100"] ]; - test.each(dateTimeZErrorValidations)( + it.each(dateTimeZErrorValidations)( `should return error when validating "dateTimeZ" field - %s`, async (dateTimeZ, message) => { const group = await setupContentModelGroup(); @@ -624,7 +625,7 @@ describe("fieldValidations", () => { ["14:30:00", "Time must be lesser or equal than 13:30:00"] ]; - test.each(timeErrorValidations)( + it.each(timeErrorValidations)( `should return error when validating "time" field - %s`, async (time, message) => { const group = await setupContentModelGroup(); @@ -664,7 +665,7 @@ describe("fieldValidations", () => { } ); - test("should return error when slug already exists", async () => { + it("should return error when slug already exists", async () => { const group = await setupContentModelGroup(); await setupContentModels(group); @@ -716,7 +717,7 @@ describe("fieldValidations", () => { }); }); - test("should create a fruit without validation errors", async () => { + it("should create a fruit without validation errors", async () => { const group = await setupContentModelGroup(); await setupContentModels(group); diff --git a/packages/api-headless-cms/__tests__/contentAPI/filtering.test.ts b/packages/api-headless-cms/__tests__/contentAPI/filtering.test.ts index b72033ab281..fac4f1cb7f4 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/filtering.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/filtering.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it, vi } from "vitest"; import { useFruitManageHandler } from "../testHelpers/useFruitManageHandler"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { useFruitReadHandler } from "../testHelpers/useFruitReadHandler"; @@ -8,7 +9,6 @@ import { useArticleManageHandler } from "../testHelpers/useArticleManageHandler" import { useArticleReadHandler } from "../testHelpers/useArticleReadHandler"; import { setupContentModelGroup, setupContentModels } from "../testHelpers/setup"; import { Fruit } from "./mocks/contentModels"; -import { jest } from "@jest/globals"; const appleData: Fruit = { name: "Apple", @@ -61,7 +61,9 @@ const bananaData: Fruit = { slug: null }; -jest.setTimeout(100000); +vi.setConfig({ + testTimeout: 100_000 +}); describe("filtering", () => { const manageOpts = { path: "manage/en-US" }; @@ -109,7 +111,7 @@ describe("filtering", () => { return createFruits(); }; - test("should filter fruits by date and sort asc", async () => { + it("should filter fruits by date and sort asc", async () => { const { apple, strawberry } = await setupFruits(); const handler = useFruitReadHandler({ @@ -139,7 +141,7 @@ describe("filtering", () => { }); }); - test("should filter fruits by date and sort desc", async () => { + it("should filter fruits by date and sort desc", async () => { const { apple, strawberry } = await setupFruits(); const handler = useFruitReadHandler({ @@ -169,7 +171,7 @@ describe("filtering", () => { }); }); - test("should filter fruits by dateTime and sort asc", async () => { + it("should filter fruits by dateTime and sort asc", async () => { const { banana } = await setupFruits(); const handler = useFruitReadHandler({ @@ -200,7 +202,7 @@ describe("filtering", () => { }); }); - test("should filter fruits by dateTimeZ and sort desc", async () => { + it("should filter fruits by dateTimeZ and sort desc", async () => { const { apple, strawberry } = await setupFruits(); const handler = useFruitReadHandler({ @@ -231,7 +233,7 @@ describe("filtering", () => { }); }); - test("should filter fruits by date, dateTime, dateTimeZ and sort desc", async () => { + it("should filter fruits by date, dateTime, dateTimeZ and sort desc", async () => { const { apple, banana } = await setupFruits(); const handler = useFruitReadHandler({ @@ -266,7 +268,7 @@ describe("filtering", () => { }); }); - test("should filter fruits by time and sort desc", async () => { + it("should filter fruits by time and sort desc", async () => { const { strawberry, banana } = await setupFruits(); const handler = useFruitReadHandler({ @@ -297,7 +299,7 @@ describe("filtering", () => { }); }); - test("should sort by time asc", async () => { + it("should sort by time asc", async () => { const { apple, strawberry, banana } = await setupFruits(); const handler = useFruitReadHandler({ @@ -325,7 +327,7 @@ describe("filtering", () => { }); describe("GraphQL Data Filtering Tests", () => { - test("should be able to filter fruits by a boolean attribute", async () => { + it("should be able to filter fruits by a boolean attribute", async () => { await setupFruits(); const handler = useFruitReadHandler({ @@ -395,7 +397,7 @@ describe("filtering", () => { }); }); - test("should be able to filter fruits by a number attribute", async () => { + it("should be able to filter fruits by a number attribute", async () => { await setupFruits(); const handler = useFruitReadHandler({ @@ -500,7 +502,7 @@ describe("filtering", () => { }); }); - test("should filter by reference field", async () => { + it("should filter by reference field", async () => { const categoryManager = useCategoryManageHandler(manageOpts); const productManager = useProductManageHandler(manageOpts); const productReader = useProductReadHandler(readOpts); @@ -1031,7 +1033,7 @@ describe("filtering", () => { }); }); - test("should filter entries by empty datetime field", async () => { + it("should filter entries by empty datetime field", async () => { const categoryManager = useCategoryManageHandler(manageOpts); const productManager = useProductManageHandler(manageOpts); @@ -1178,7 +1180,7 @@ describe("filtering", () => { }); }); - test("should filter entries by entryId", async () => { + it("should filter entries by entryId", async () => { const articleManager = useArticleManageHandler(manageOpts); const articleReader = useArticleReadHandler(readOpts); @@ -1520,7 +1522,7 @@ describe("filtering", () => { }); }); - test("should filter entries by revisionCreatedBy", async () => { + it("should filter entries by revisionCreatedBy", async () => { const articleManager = useArticleManageHandler(manageOpts); const articleAnotherManager = useArticleManageHandler({ ...manageOpts, @@ -1681,7 +1683,7 @@ describe("filtering", () => { }); }); - test("should filter entries by createdBy", async () => { + it("should filter entries by createdBy", async () => { const articleManager = useArticleManageHandler(manageOpts); const articleAnotherManager = useArticleManageHandler({ ...manageOpts, diff --git a/packages/api-headless-cms/__tests__/contentAPI/graphQlAndQueries.test.ts b/packages/api-headless-cms/__tests__/contentAPI/graphQlAndQueries.test.ts index ed78b49df73..1ef64a87765 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/graphQlAndQueries.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/graphQlAndQueries.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { useCategoryManageHandler } from "../testHelpers/useCategoryManageHandler"; import { setupGroupAndModels } from "../testHelpers/setup"; import { useProductManageHandler } from "../testHelpers/useProductManageHandler"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/graphQlOrQueries.test.ts b/packages/api-headless-cms/__tests__/contentAPI/graphQlOrQueries.test.ts index d54e80fab84..33d38abe35f 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/graphQlOrQueries.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/graphQlOrQueries.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { useCategoryManageHandler } from "../testHelpers/useCategoryManageHandler"; import lodashCamelCase from "lodash/camelCase"; import { setupGroupAndModels } from "../testHelpers/setup"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/httpOptions.test.ts b/packages/api-headless-cms/__tests__/contentAPI/httpOptions.test.ts index a4930637516..6f212d3d673 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/httpOptions.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/httpOptions.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { ContextPlugin } from "@webiny/api"; import { CmsContext } from "~/types"; import { useCategoryManageHandler } from "../testHelpers/useCategoryManageHandler"; @@ -20,7 +21,7 @@ describe("HTTP Options request", () => { ] }; - test(`http options`, async () => { + it(`http options`, async () => { const { invoke } = useCategoryManageHandler(manageOpts); const response = await invoke({ diff --git a/packages/api-headless-cms/__tests__/contentAPI/import.structure.test.ts b/packages/api-headless-cms/__tests__/contentAPI/import.structure.test.ts index 23827e2dbf1..6cfa684b7f1 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/import.structure.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/import.structure.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useGraphQLHandler } from "~tests/testHelpers/useGraphQLHandler"; import { CmsGroupPlugin, CmsModelPlugin, createCmsGroup } from "~/plugins"; import { createModels, exportedGroupsAndModels } from "./mocks/exportedGroupsAndModels"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/latestEntries.test.ts b/packages/api-headless-cms/__tests__/contentAPI/latestEntries.test.ts index 42813ec5565..4aeda0018c5 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/latestEntries.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/latestEntries.test.ts @@ -1,12 +1,15 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { CmsModel, CmsGroup } from "~/types"; import models from "./mocks/contentModels"; import { useCategoryManageHandler } from "../testHelpers/useCategoryManageHandler"; import { useArticleManageHandler } from "../testHelpers/useArticleManageHandler"; import { useArticleReadHandler } from "../testHelpers/useArticleReadHandler"; -import { jest } from "@jest/globals"; -jest.setTimeout(100000); + +vi.setConfig({ + testTimeout: 100_000, +}) describe("latest entries", function () { const manageOpts = { path: "manage/en-US" }; diff --git a/packages/api-headless-cms/__tests__/contentAPI/model.delete.test.ts b/packages/api-headless-cms/__tests__/contentAPI/model.delete.test.ts index a7a16844367..e05f381d990 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/model.delete.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/model.delete.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { CmsGroup } from "~/types"; import models from "./mocks/contentModels"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/multipleValues.test.ts b/packages/api-headless-cms/__tests__/contentAPI/multipleValues.test.ts index 3a9234ea968..c7e5df148e6 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/multipleValues.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/multipleValues.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { CmsGroup, CmsModelField } from "~/types"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import models from "./mocks/contentModels"; @@ -25,7 +26,7 @@ describe("multiple values in field", () => { return createCMG.data.createContentModelGroup.data; }; - test("multiple value field is correctly created", async () => { + it("multiple value field is correctly created", async () => { const contentModelGroup = await setupContentModelGroup(); const model = models.find(m => m.modelId === "product"); @@ -107,7 +108,7 @@ describe("multiple values in field", () => { ]); }); - test("should not allow multipleValue field to be set as title", async () => { + it("should not allow multipleValue field to be set as title", async () => { const contentModelGroup = await setupContentModelGroup(); const model = models.find(m => m.modelId === "product"); diff --git a/packages/api-headless-cms/__tests__/contentAPI/pluginsContentModels.test.ts b/packages/api-headless-cms/__tests__/contentAPI/pluginsContentModels.test.ts index 0ffdbea421e..afaa3ab0d8a 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/pluginsContentModels.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/pluginsContentModels.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, afterEach } from "vitest"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { CmsGroup, CmsModel } from "~/types"; import { CmsModelPlugin } from "~/plugins/CmsModelPlugin"; @@ -160,7 +161,7 @@ describe("content model plugins", () => { }); }); - test("must not be able to create, update, or delete a content model that was registered via plugins", async () => { + it("must not be able to create, update, or delete a content model that was registered via plugins", async () => { const { createContentModelMutation, createContentModelGroupMutation, @@ -264,7 +265,7 @@ describe("content model plugins", () => { }); }); - test("content model must be returned in the content models list and get queries", async () => { + it("content model must be returned in the content models list and get queries", async () => { const { listContentModelsQuery, getContentModelQuery } = useGraphQLHandler({ path: "manage/en-US", plugins: [contentModelPlugin] @@ -458,7 +459,7 @@ describe("content model plugins", () => { }); }); - test("must be able to perform basic CRUD operations with content models registered via plugin", async () => { + it("must be able to perform basic CRUD operations with content models registered via plugin", async () => { const { invoke } = useGraphQLHandler({ path: "manage/en-US", plugins: [contentModelPlugin] @@ -624,7 +625,7 @@ describe("content model plugins", () => { }); }); - test(`"plugin" GraphQL field must have the correct value`, async () => { + it(`"plugin" GraphQL field must have the correct value`, async () => { const { createContentModelMutation, createContentModelGroupMutation, diff --git a/packages/api-headless-cms/__tests__/contentAPI/pluginsContentModelsRef.test.ts b/packages/api-headless-cms/__tests__/contentAPI/pluginsContentModelsRef.test.ts index b101340f4c8..4a5aa6f4aeb 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/pluginsContentModelsRef.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/pluginsContentModelsRef.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { CmsModelPlugin } from "~/plugins/CmsModelPlugin"; @@ -335,7 +336,7 @@ describe("content model plugins - nested `ref` field union types", () => { path: "read/en-US" }); - test("must generate valid schema for nested `ref` field union", async () => { + it("must generate valid schema for nested `ref` field union", async () => { const [, response] = await introspect(); expect(response.statusCode).toBe(200); }); diff --git a/packages/api-headless-cms/__tests__/contentAPI/predefinedValues.test.ts b/packages/api-headless-cms/__tests__/contentAPI/predefinedValues.test.ts index 226a524c110..4c10330a432 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/predefinedValues.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/predefinedValues.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { CmsGroup, CmsModel } from "~/types"; import models from "./mocks/contentModels"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; @@ -59,7 +60,7 @@ describe("predefined values", () => { return update.data.updateContentModel.data; }; - test("should create an entry with predefined values selected", async () => { + it("should create an entry with predefined values selected", async () => { const contentModelGroup = await setupContentModelGroup(); await setupBugModel(contentModelGroup); @@ -109,7 +110,7 @@ describe("predefined values", () => { }); }); - test("should fail creating an entry with wrong predefined text value selected", async () => { + it("should fail creating an entry with wrong predefined text value selected", async () => { const contentModelGroup = await setupContentModelGroup(); await setupBugModel(contentModelGroup); @@ -148,7 +149,7 @@ describe("predefined values", () => { }); }); - test("should fail creating an entry with wrong predefined number value selected", async () => { + it("should fail creating an entry with wrong predefined number value selected", async () => { const contentModelGroup = await setupContentModelGroup(); await setupBugModel(contentModelGroup); @@ -187,7 +188,7 @@ describe("predefined values", () => { }); }); - test("should fail creating an entry with wrong predefined number and text values selected", async () => { + it("should fail creating an entry with wrong predefined number and text values selected", async () => { const contentModelGroup = await setupContentModelGroup(); await setupBugModel(contentModelGroup); diff --git a/packages/api-headless-cms/__tests__/contentAPI/refField.test.ts b/packages/api-headless-cms/__tests__/contentAPI/refField.test.ts index 3a283574655..4c11bbfef3c 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/refField.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/refField.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { CmsEntry } from "~/types"; import { useReviewManageHandler } from "../testHelpers/useReviewManageHandler"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/references.test.ts b/packages/api-headless-cms/__tests__/contentAPI/references.test.ts index 5bdfc9b4fef..807170c0e63 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/references.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/references.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useCategoryManageHandler } from "../testHelpers/useCategoryManageHandler"; import { useArticleManageHandler } from "../testHelpers/useArticleManageHandler"; import { useArticleReadHandler } from "../testHelpers/useArticleReadHandler"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/references/publishedAndUnpublished.test.ts b/packages/api-headless-cms/__tests__/contentAPI/references/publishedAndUnpublished.test.ts index ea2c214bcc1..68b4d027dd7 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/references/publishedAndUnpublished.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/references/publishedAndUnpublished.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useCategoryManageHandler } from "../../testHelpers/useCategoryManageHandler"; import { useArticleManageHandler } from "../../testHelpers/useArticleManageHandler"; import { useArticleReadHandler } from "../../testHelpers/useArticleReadHandler"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/republish.entries.test.ts b/packages/api-headless-cms/__tests__/contentAPI/republish.entries.test.ts index d6d3d9c4b08..ee09ce39b6f 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/republish.entries.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/republish.entries.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { mdbid } from "@webiny/utils"; import models from "./mocks/contentModels"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; @@ -159,12 +160,12 @@ describe("Republish entries", () => { type: "admin", displayName: "Admin" } - }, + } as unknown as CmsEntry, input }; }; - test("should republish entries without changing them", async () => { + it("should republish entries without changing them", async () => { const group = await setupGroup(); await setupModel(group, "category"); @@ -277,7 +278,7 @@ describe("Republish entries", () => { * This test checks values directly in the storage operations, so we make sure there are required values in ref objects. * We check in both latest and published records because in different storages that can be two different records. */ - test("storage operations - should republish entries without changing them", async () => { + it("storage operations - should republish entries without changing them", async () => { const group = await setupGroup(); const categoryModel = await setupModel(group, "category"); const productModel = await setupModel(group, "product"); diff --git a/packages/api-headless-cms/__tests__/contentAPI/resolvers.apiKey.manage.test.ts b/packages/api-headless-cms/__tests__/contentAPI/resolvers.apiKey.manage.test.ts index 2dbc70f4127..c0e8e659754 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/resolvers.apiKey.manage.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/resolvers.apiKey.manage.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { SecurityIdentity } from "@webiny/api-security/types"; import { CmsGroup } from "~/types"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; @@ -103,7 +104,7 @@ describe("MANAGE - resolvers - api key", () => { } }); - test("create, get, list, update and delete entry", async () => { + it("create, get, list, update and delete entry", async () => { const identity = createIdentity([ { name: "cms.contentEntry", diff --git a/packages/api-headless-cms/__tests__/contentAPI/resolvers.apiKey.read.test.ts b/packages/api-headless-cms/__tests__/contentAPI/resolvers.apiKey.read.test.ts index a10f2e34012..f02f4412929 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/resolvers.apiKey.read.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/resolvers.apiKey.read.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsGroup } from "~/types"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import models from "./mocks/contentModels"; @@ -92,7 +93,7 @@ describe("READ - resolvers - api key", () => { } }); - test("get entry", async () => { + it("get entry", async () => { // Use "manage" API to create and publish entries const { createCategory, publishCategory } = useCategoryManageHandler(manageOpts); @@ -145,7 +146,7 @@ describe("READ - resolvers - api key", () => { }); }); - test("get entries", async () => { + it("get entries", async () => { // Use "manage" API to create and publish entries const { createCategory, publishCategory } = useCategoryManageHandler(manageOpts); @@ -204,7 +205,7 @@ describe("READ - resolvers - api key", () => { }); }); - test("cant get entry - missing whole permission", async () => { + it("cant get entry - missing whole permission", async () => { // Use "manage" API to create and publish entries const { createCategory, publishCategory } = useCategoryManageHandler(manageOpts); @@ -249,7 +250,7 @@ describe("READ - resolvers - api key", () => { }); }); - test("cant list entries - missing whole permission", async () => { + it("cant list entries - missing whole permission", async () => { // Use "manage" API to create and publish entries const { createCategory, publishCategory } = useCategoryManageHandler(manageOpts); @@ -297,7 +298,7 @@ describe("READ - resolvers - api key", () => { const notAllowedRwd = [["w"], ["d"], ["wd"]]; - test.each(notAllowedRwd)(`cant get entry - missing "r" permission - having "%s"`, async rwd => { + it.each(notAllowedRwd)(`cant get entry - missing "r" permission - having "%s"`, async rwd => { // Use "manage" API to create and publish entries const { createCategory, publishCategory } = useCategoryManageHandler(manageOpts); @@ -347,7 +348,7 @@ describe("READ - resolvers - api key", () => { }); }); - test.each(notAllowedRwd)( + it.each(notAllowedRwd)( `cant list entries - missing "r" permission - having "%s"`, async rwd => { // Use "manage" API to create and publish entries diff --git a/packages/api-headless-cms/__tests__/contentAPI/resolvers.manage.test.ts b/packages/api-headless-cms/__tests__/contentAPI/resolvers.manage.test.ts index 12da24964aa..e697f821a2b 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/resolvers.manage.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/resolvers.manage.test.ts @@ -1,12 +1,12 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import WebinyError from "@webiny/error"; -import { CmsEntry, CmsGroup, CmsModel } from "~/types"; +import type { CmsEntry, CmsEntryListParams, CmsGroup, CmsModel } from "~/types/index.js"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { useCategoryManageHandler } from "../testHelpers/useCategoryManageHandler"; import { useCategoryReadHandler } from "../testHelpers/useCategoryReadHandler"; import models from "./mocks/contentModels"; import modelsWithoutValidation from "./mocks/contentModels.noValidation"; import { useProductManageHandler } from "../testHelpers/useProductManageHandler"; -import { jest } from "@jest/globals"; interface CreateCategoriesResult { fruits: CmsEntry; @@ -42,7 +42,9 @@ const createPermissions = ({ groups, models }: { groups?: string[]; models?: str } ]; -jest.setTimeout(100000); +vi.setConfig({ + testTimeout: 100_000, +}) describe("MANAGE - Resolvers", () => { let contentModelGroup: CmsGroup; @@ -128,7 +130,7 @@ describe("MANAGE - Resolvers", () => { return categories; }; - test(`get category`, async () => { + it(`get category`, async () => { await setupModel(); const { createCategory, getCategory } = useCategoryManageHandler(manageOpts); @@ -173,7 +175,7 @@ describe("MANAGE - Resolvers", () => { }); }); - test(`error when getting category without specific groups and models permissions`, async () => { + it(`error when getting category without specific groups and models permissions`, async () => { await setupModel(); const { createCategory } = useCategoryManageHandler(manageOpts); @@ -201,7 +203,7 @@ describe("MANAGE - Resolvers", () => { }); }); - test(`get category with specific groups and models permissions`, async () => { + it(`get category with specific groups and models permissions`, async () => { await setupModel(); const { createCategory } = useCategoryManageHandler(manageOpts); @@ -255,7 +257,7 @@ describe("MANAGE - Resolvers", () => { expect(response.data.getCategory.error).toEqual(null); }); - test(`list categories (no parameters)`, async () => { + it(`list categories (no parameters)`, async () => { await setupModel(); // Use "manage" API to create and publish entries const { createCategory, publishCategory, listCategories } = @@ -325,7 +327,7 @@ describe("MANAGE - Resolvers", () => { }); }); - test("get entries by given ids", async () => { + it("get entries by given ids", async () => { await setupModel(); // Use "manage" API to create and publish entries const { createCategory, getCategoriesByIds } = useCategoryManageHandler(manageOpts); @@ -372,7 +374,7 @@ describe("MANAGE - Resolvers", () => { }); }); - test(`should create category`, async () => { + it(`should create category`, async () => { await setupModel(); const { createCategory } = useCategoryManageHandler(manageOpts); const [create1] = await createCategory({ data: { title: "Hardware", slug: "hardware" } }); @@ -414,7 +416,7 @@ describe("MANAGE - Resolvers", () => { }); }); - test(`should return validation error`, async () => { + it(`should return validation error`, async () => { await setupModel(); const { createCategory } = useCategoryManageHandler(manageOpts); @@ -442,7 +444,7 @@ describe("MANAGE - Resolvers", () => { }); }); - test(`should create an entry (fields without validation)`, async () => { + it(`should create an entry (fields without validation)`, async () => { const model = modelsWithoutValidation.find(m => m.modelId === "category"); await setupModel(model); @@ -506,7 +508,7 @@ describe("MANAGE - Resolvers", () => { }); }); - test(`create category revision`, async () => { + it(`create category revision`, async () => { await setupModel(); const { createCategory, createCategoryFrom, listCategories } = @@ -585,7 +587,7 @@ describe("MANAGE - Resolvers", () => { }); }); - test(`update category`, async () => { + it(`update category`, async () => { await setupModel(); const { createCategory, updateCategory, listCategories } = useCategoryManageHandler(manageOpts); @@ -669,7 +671,7 @@ describe("MANAGE - Resolvers", () => { }); }); - test(`delete category`, async () => { + it(`delete category`, async () => { await setupModel(); const { createCategory, createCategoryFrom, getCategory, listCategories, deleteCategory } = useCategoryManageHandler(manageOpts); @@ -754,7 +756,7 @@ describe("MANAGE - Resolvers", () => { expect(meta.revisions[0].id).toEqual(id2); }); - test(`publish and unpublish a category`, async () => { + it(`publish and unpublish a category`, async () => { await setupModel(); const { createCategory, createCategoryFrom, publishCategory, unpublishCategory } = useCategoryManageHandler(manageOpts); @@ -848,11 +850,11 @@ describe("MANAGE - Resolvers", () => { }); }); - test(`list categories (contains, not_contains, in, not_in)`, async () => { + it(`list categories (contains, not_contains, in, not_in)`, async () => { const { animals, fruits, vegetables, trees } = await createCategories(); const { listCategories } = useCategoryManageHandler(manageOpts); - const defaultQueryVars = { + const defaultQueryVars: CmsEntryListParams = { sort: ["title_ASC"] }; @@ -977,7 +979,7 @@ describe("MANAGE - Resolvers", () => { }); }); - test("should store and retrieve nested objects", async () => { + it("should store and retrieve nested objects", async () => { const model = models.find(model => model.modelId === "product"); await setupModel(model); @@ -1162,7 +1164,7 @@ describe("MANAGE - Resolvers", () => { }); }); - test("should have all entry revisions published", async () => { + it("should have all entry revisions published", async () => { const { getCategory, createCategory, publishCategory, createCategoryFrom, listCategories } = useCategoryManageHandler(manageOpts); @@ -1437,7 +1439,7 @@ describe("MANAGE - Resolvers", () => { }); }); - test("should get latest, published or exact category", async () => { + it("should get latest, published or exact category", async () => { const { getCategory, createCategory, publishCategory, createCategoryFrom } = useCategoryManageHandler(manageOpts); diff --git a/packages/api-headless-cms/__tests__/contentAPI/resolvers.read.test.ts b/packages/api-headless-cms/__tests__/contentAPI/resolvers.read.test.ts index 62d89885acf..f0e34588bb9 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/resolvers.read.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/resolvers.read.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; import { CmsGroup } from "~/types"; import { GraphQLHandlerParams, useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import models from "./mocks/contentModels"; @@ -5,7 +6,6 @@ import { useCategoryManageHandler } from "../testHelpers/useCategoryManageHandle import { useCategoryReadHandler } from "../testHelpers/useCategoryReadHandler"; import { useProductManageHandler } from "../testHelpers/useProductManageHandler"; import { useProductReadHandler } from "../testHelpers/useProductReadHandler"; -import { jest } from "@jest/globals"; const createPermissions = ({ groups, models }: { groups?: string[]; models?: string[] }) => [ { @@ -77,7 +77,9 @@ const categoryManagerHelper = async (manageOpts: GraphQLHandlerParams) => { }; }; -jest.setTimeout(100000); +vi.setConfig({ + testTimeout: 100_000 +}); describe("READ - Resolvers", () => { let contentModelGroup: CmsGroup; @@ -147,7 +149,7 @@ describe("READ - Resolvers", () => { await setupModel("category", contentModelGroup); }); - test("should return a record by id", async () => { + it("should return a record by id", async () => { // Use "manage" API to create and publish entries const { createCategory, publishCategory } = useCategoryManageHandler(manageOpts); @@ -197,7 +199,7 @@ describe("READ - Resolvers", () => { }); }); - test(`should return a NOT_FOUND error when getting an entry by non-existing ID`, async () => { + it(`should return a NOT_FOUND error when getting an entry by non-existing ID`, async () => { const { getCategory } = useCategoryReadHandler(readOpts); const [response] = await getCategory({ @@ -220,7 +222,7 @@ describe("READ - Resolvers", () => { }); }); - test(`list entries`, async () => { + it(`list entries`, async () => { // Use "manage" API to create and publish entries const { createCategory, publishCategory } = useCategoryManageHandler(manageOpts); @@ -262,7 +264,7 @@ describe("READ - Resolvers", () => { }); }); - test(`list entries with specific group and model permissions`, async () => { + it(`list entries with specific group and model permissions`, async () => { // Use "manage" API to create and publish entries const { createCategory, publishCategory } = useCategoryManageHandler(manageOpts); @@ -310,7 +312,7 @@ describe("READ - Resolvers", () => { }); }); - test(`should return an error when getting entry without specific group permissions`, async () => { + it(`should return an error when getting entry without specific group permissions`, async () => { // Use "manage" API to create and publish entries const { createCategory, publishCategory } = useCategoryManageHandler(manageOpts); @@ -352,7 +354,7 @@ describe("READ - Resolvers", () => { }); }); - test(`should return an error when getting entry without specific model permissions`, async () => { + it(`should return an error when getting entry without specific model permissions`, async () => { // Use "manage" API to create and publish entries const { createCategory, publishCategory } = useCategoryManageHandler(manageOpts); @@ -390,7 +392,7 @@ describe("READ - Resolvers", () => { }); }); - test(`list entries (limit)`, async () => { + it(`list entries (limit)`, async () => { const { vegetables, animals } = await categoryManagerHelper(manageOpts); // See if entries are available via "read" API @@ -430,7 +432,7 @@ describe("READ - Resolvers", () => { }); }); - test(`list entries (limit + after)`, async () => { + it(`list entries (limit + after)`, async () => { const { fruits, vegetables, animals } = await categoryManagerHelper(manageOpts); const { listCategories } = useCategoryReadHandler(readOpts); @@ -556,7 +558,7 @@ describe("READ - Resolvers", () => { }); }); - test(`list entries (sort ASC)`, async () => { + it(`list entries (sort ASC)`, async () => { const { fruits, vegetables, animals } = await categoryManagerHelper(manageOpts); const { listCategories } = useCategoryReadHandler(readOpts); @@ -602,7 +604,7 @@ describe("READ - Resolvers", () => { }); }); - test(`list entries (sort DESC)`, async () => { + it(`list entries (sort DESC)`, async () => { const { fruits, vegetables, animals } = await categoryManagerHelper(manageOpts); const { listCategories } = useCategoryReadHandler(readOpts); @@ -648,7 +650,7 @@ describe("READ - Resolvers", () => { }); }); - test("list entries that contains given value", async () => { + it("list entries that contains given value", async () => { const { animals } = await categoryManagerHelper(manageOpts); const { listCategories } = useCategoryReadHandler(readOpts); @@ -682,7 +684,7 @@ describe("READ - Resolvers", () => { }); }); - test("list entries that do not contains given value", async () => { + it("list entries that do not contains given value", async () => { const { vegetables, animals } = await categoryManagerHelper(manageOpts); const { listCategories } = useCategoryReadHandler(readOpts); @@ -723,7 +725,7 @@ describe("READ - Resolvers", () => { }); }); - test("list entries that are in given values", async () => { + it("list entries that are in given values", async () => { const { vegetables, animals } = await categoryManagerHelper(manageOpts); const { listCategories } = useCategoryReadHandler(readOpts); @@ -764,7 +766,7 @@ describe("READ - Resolvers", () => { }); }); - test("list entries that are not in given values", async () => { + it("list entries that are not in given values", async () => { const { fruits, vegetables, animals } = await categoryManagerHelper(manageOpts); const { listCategories } = useCategoryReadHandler(readOpts); @@ -798,7 +800,7 @@ describe("READ - Resolvers", () => { }); }); - test("list entries that are created after given date", async () => { + it("list entries that are created after given date", async () => { const { fruits, vegetables, animals } = await categoryManagerHelper(manageOpts); const { listCategories } = useCategoryReadHandler(readOpts); @@ -849,7 +851,7 @@ describe("READ - Resolvers", () => { }); }); - test("list entries that are created after or at given date: one returned", async () => { + it("list entries that are created after or at given date: one returned", async () => { const { animals } = await categoryManagerHelper(manageOpts); const { listCategories } = useCategoryReadHandler(readOpts); @@ -884,7 +886,7 @@ describe("READ - Resolvers", () => { }); }); - test("list entries that are created before given date: none returned", async () => { + it("list entries that are created before given date: none returned", async () => { const { listCategories } = useCategoryReadHandler(readOpts); const date = new Date(); @@ -912,7 +914,7 @@ describe("READ - Resolvers", () => { }); }); - test("list entries that are created before or at given date: one returned", async () => { + it("list entries that are created before or at given date: one returned", async () => { const { fruits, vegetables } = await categoryManagerHelper(manageOpts); const { listCategories } = useCategoryReadHandler(readOpts); @@ -954,7 +956,7 @@ describe("READ - Resolvers", () => { }); }); - test("list entries that are not created between given dates", async () => { + it("list entries that are not created between given dates", async () => { const { fruits, vegetables, animals } = await categoryManagerHelper(manageOpts); const { listCategories } = useCategoryReadHandler(readOpts); @@ -1001,7 +1003,7 @@ describe("READ - Resolvers", () => { }); }); - test("list entries that have price in given range", async () => { + it("list entries that have price in given range", async () => { await setupModel("product", contentModelGroup); const { vegetables } = await categoryManagerHelper({ @@ -1080,7 +1082,7 @@ describe("READ - Resolvers", () => { }); }); - test("sort entries by title", async () => { + it("sort entries by title", async () => { await setupModel("product", contentModelGroup); const { vegetables } = await categoryManagerHelper({ @@ -1176,7 +1178,7 @@ describe("READ - Resolvers", () => { }); }); - test("should sort products by price", async () => { + it("should sort products by price", async () => { await setupModel("product", contentModelGroup); const { vegetables } = await categoryManagerHelper({ @@ -1272,7 +1274,7 @@ describe("READ - Resolvers", () => { }); }); - test("should store and retrieve nested objects", async () => { + it("should store and retrieve nested objects", async () => { await setupModel("product", contentModelGroup); const { vegetables } = await categoryManagerHelper({ diff --git a/packages/api-headless-cms/__tests__/contentAPI/revisionIdScalar.test.ts b/packages/api-headless-cms/__tests__/contentAPI/revisionIdScalar.test.ts index 66cf883ec51..00a1ea24c1a 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/revisionIdScalar.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/revisionIdScalar.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { createContentModelGroup } from "~tests/contentAPI/mocks/contentModelGroup"; import models from "~tests/contentAPI/mocks/contentModels"; import { CmsGroup, CmsModel } from "~/types"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/richTextField.test.ts b/packages/api-headless-cms/__tests__/contentAPI/richTextField.test.ts index 278c1596e7e..377cdf98441 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/richTextField.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/richTextField.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { CmsEntry, CmsGroup } from "~/types"; import models from "./mocks/contentModels"; @@ -116,7 +117,7 @@ describe("richTextField", () => { return category; }; - test("should create a product with richText field populated", async () => { + it("should create a product with richText field populated", async () => { const contentModelGroup = await setupContentModelGroup(); await setupContentModels(contentModelGroup); @@ -240,7 +241,7 @@ describe("richTextField", () => { }); }); - test("should create a product with empty rich-text field and then update it with some value", async () => { + it("should create a product with empty rich-text field and then update it with some value", async () => { const contentModelGroup = await setupContentModelGroup(); await setupContentModels(contentModelGroup); diff --git a/packages/api-headless-cms/__tests__/contentAPI/search.test.ts b/packages/api-headless-cms/__tests__/contentAPI/search.test.ts index ec14da3ea3d..ad674e41999 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/search.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/search.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useFruitManageHandler } from "~tests/testHelpers/useFruitManageHandler"; import { setupContentModelGroup, setupContentModels } from "~tests/testHelpers/setup"; import { useCategoryManageHandler } from "~tests/testHelpers/useCategoryManageHandler"; diff --git a/packages/api-headless-cms/__tests__/contentAPI/security/basePermissions.test.ts b/packages/api-headless-cms/__tests__/contentAPI/security/basePermissions.test.ts index 47f6af0cdb5..dadacb53a8c 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/security/basePermissions.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/security/basePermissions.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useTestModelHandler } from "~tests/testHelpers/useTestModelHandler"; import { SecurityIdentity } from "@webiny/api-security/types"; @@ -12,7 +13,7 @@ const gqlApiTypesPermissions = [ ]; describe("Content Groups / Models / Entries - Base Permissions Checks", () => { - test("group access scope: only groups created by the user", async () => { + it("group access scope: only groups created by the user", async () => { const permissions = [ ...gqlApiTypesPermissions, { _src: "x", name: "cms.contentModel", own: true, rwd: "rwd", pw: "" }, @@ -85,7 +86,7 @@ describe("Content Groups / Models / Entries - Base Permissions Checks", () => { }); }); - test("group access scope: only specific groups", async () => { + it("group access scope: only specific groups", async () => { // Identity A's content model group and content model. const { manage: manageApiA } = useTestModelHandler({ identity: identityA @@ -182,7 +183,7 @@ describe("Content Groups / Models / Entries - Base Permissions Checks", () => { }); }); - test("model access scope: only models created by the user", async () => { + it("model access scope: only models created by the user", async () => { const permissions = [ ...gqlApiTypesPermissions, { name: "cms.contentModel", own: true, rwd: "rwd", pw: "" }, @@ -251,7 +252,7 @@ describe("Content Groups / Models / Entries - Base Permissions Checks", () => { }); }); - test("model access scope: only specific models", async () => { + it("model access scope: only specific models", async () => { // Identity A's content model group and content model. const { manage: manageApiA } = useTestModelHandler({ identity: identityA diff --git a/packages/api-headless-cms/__tests__/contentAPI/security/contentEntries/delete.test.ts b/packages/api-headless-cms/__tests__/contentAPI/security/contentEntries/delete.test.ts index 496cb1b6e52..235001fa846 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/security/contentEntries/delete.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/security/contentEntries/delete.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useTestModelHandler } from "~tests/testHelpers/useTestModelHandler"; import { SecurityIdentity } from "@webiny/api-security/types"; import { CmsTestPermissions, expectNotAuthorized } from "../utils"; @@ -7,7 +8,7 @@ const identityB: SecurityIdentity = { id: "b", type: "admin", displayName: "B" } const identityC: SecurityIdentity = { id: "c", type: "admin", displayName: "C" }; describe("Delete Permissions Checks", () => { - test("should allow deletion of entries only with sufficient permission", async () => { + it("should allow deletion of entries only with sufficient permission", async () => { const { manage: manageApiA } = useTestModelHandler({ identity: identityA }); diff --git a/packages/api-headless-cms/__tests__/contentAPI/security/contentEntries/write.test.ts b/packages/api-headless-cms/__tests__/contentAPI/security/contentEntries/write.test.ts index 9bdf0b5e1cc..d9005317681 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/security/contentEntries/write.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/security/contentEntries/write.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useTestModelHandler } from "~tests/testHelpers/useTestModelHandler"; import { SecurityIdentity } from "@webiny/api-security/types"; import { CmsTestPermissions, expectNotAuthorized } from "../utils"; @@ -7,7 +8,7 @@ const identityB: SecurityIdentity = { id: "b", type: "admin", displayName: "B" } const identityC: SecurityIdentity = { id: "c", type: "admin", displayName: "C" }; describe("Write Permissions Checks", () => { - test("should allow creation of entries only with sufficient permission", async () => { + it("should allow creation of entries only with sufficient permission", async () => { const { manage: manageApiA } = useTestModelHandler({ identity: identityA }); @@ -50,7 +51,7 @@ describe("Write Permissions Checks", () => { }); }); - test("should allow update of groups only with sufficient permission", async () => { + it("should allow update of groups only with sufficient permission", async () => { const { manage: manageApiA } = useTestModelHandler({ identity: identityA }); await manageApiA.setup(); diff --git a/packages/api-headless-cms/__tests__/contentAPI/security/contentModelGroups/delete.test.ts b/packages/api-headless-cms/__tests__/contentAPI/security/contentModelGroups/delete.test.ts index 081dbda786a..8a9a986aff7 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/security/contentModelGroups/delete.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/security/contentModelGroups/delete.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useTestModelHandler } from "~tests/testHelpers/useTestModelHandler"; import { SecurityIdentity } from "@webiny/api-security/types"; import { CmsTestPermissions, expectNotAuthorized } from "../utils"; @@ -6,7 +7,7 @@ const identityA: SecurityIdentity = { id: "a", type: "admin", displayName: "A" } const identityB: SecurityIdentity = { id: "b", type: "admin", displayName: "B" }; describe("Delete Permissions Checks", () => { - test("should allow deletion of groups only with sufficient permission", async () => { + it("should allow deletion of groups only with sufficient permission", async () => { const permissions = new CmsTestPermissions({ groups: { rwd: "rw" } }); diff --git a/packages/api-headless-cms/__tests__/contentAPI/security/contentModelGroups/write.test.ts b/packages/api-headless-cms/__tests__/contentAPI/security/contentModelGroups/write.test.ts index fcb17db1236..c6ee6ae53ab 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/security/contentModelGroups/write.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/security/contentModelGroups/write.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useTestModelHandler } from "~tests/testHelpers/useTestModelHandler"; import { SecurityIdentity } from "@webiny/api-security/types"; import { CmsTestPermissions, expectNotAuthorized } from "../utils"; @@ -7,7 +8,7 @@ const identityB: SecurityIdentity = { id: "b", type: "admin", displayName: "B" } const identityC: SecurityIdentity = { id: "c", type: "admin", displayName: "C" }; describe("Write Permissions Checks", () => { - test("should allow creation of groups only with sufficient permission", async () => { + it("should allow creation of groups only with sufficient permission", async () => { const permissions = new CmsTestPermissions({ groups: { rwd: "r" } }); @@ -51,7 +52,7 @@ describe("Write Permissions Checks", () => { }); }); - test("should allow update of groups only with sufficient permission", async () => { + it("should allow update of groups only with sufficient permission", async () => { const { manage: manageApiA } = useTestModelHandler({ identity: identityA }); const [modelGroup] = await manageApiA.createContentModelGroupMutation({ data: { name: "Group 1", icon: "x" } diff --git a/packages/api-headless-cms/__tests__/contentAPI/security/contentModels/delete.test.ts b/packages/api-headless-cms/__tests__/contentAPI/security/contentModels/delete.test.ts index ec01114d82a..d5578275b20 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/security/contentModels/delete.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/security/contentModels/delete.test.ts @@ -1,12 +1,13 @@ +import { describe, expect, it } from "vitest"; import { useTestModelHandler } from "~tests/testHelpers/useTestModelHandler"; import { SecurityIdentity } from "@webiny/api-security/types"; -import { expectNotAuthorized, CmsTestPermissions } from "../utils"; +import { CmsTestPermissions, expectNotAuthorized } from "../utils"; const identityA: SecurityIdentity = { id: "a", type: "admin", displayName: "A" }; const identityB: SecurityIdentity = { id: "b", type: "admin", displayName: "B" }; describe("Delete Permissions Checks", () => { - test("should allow deletion of models only with sufficient permission", async () => { + it("should allow deletion of models only with sufficient permission", async () => { // Without the "d" permission, the deletion should not be allowed. const permissions = new CmsTestPermissions({ groups: { rwd: "rwd" }, diff --git a/packages/api-headless-cms/__tests__/contentAPI/security/contentModels/write.test.ts b/packages/api-headless-cms/__tests__/contentAPI/security/contentModels/write.test.ts index ea21d20090f..d34072c9c23 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/security/contentModels/write.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/security/contentModels/write.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useTestModelHandler } from "~tests/testHelpers/useTestModelHandler"; import { SecurityIdentity } from "@webiny/api-security/types"; import { CmsTestPermissions, expectNotAuthorized } from "../utils"; @@ -7,7 +8,7 @@ const identityB: SecurityIdentity = { id: "b", type: "admin", displayName: "B" } const identityC: SecurityIdentity = { id: "c", type: "admin", displayName: "C" }; describe("Write Permissions Checks", () => { - test("should allow creation of models only with sufficient permission", async () => { + it("should allow creation of models only with sufficient permission", async () => { const permissions = new CmsTestPermissions({ groups: { rwd: "rwd" }, models: { rwd: "r" } @@ -70,7 +71,7 @@ describe("Write Permissions Checks", () => { }); }); - test("should allow update of groups only with sufficient permission", async () => { + it("should allow update of groups only with sufficient permission", async () => { const { manage: manageApiA } = useTestModelHandler({ identity: identityA }); const [modelGroup] = await manageApiA.createContentModelGroupMutation({ data: { name: "Group 1", icon: "x" } diff --git a/packages/api-headless-cms/__tests__/contentAPI/security/utils.ts b/packages/api-headless-cms/__tests__/contentAPI/security/utils.ts index 1188ccca365..c7bf87b0aff 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/security/utils.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/security/utils.ts @@ -1,3 +1,4 @@ +import { expect } from "vitest"; import { SecurityIdentity, SecurityPermission } from "@webiny/api-security/types"; export const identityA: SecurityIdentity = { id: "a", type: "admin", displayName: "A" }; diff --git a/packages/api-headless-cms/__tests__/contentAPI/singletonContentEntry.test.ts b/packages/api-headless-cms/__tests__/contentAPI/singletonContentEntry.test.ts index 6659bd37add..ab3284c3221 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/singletonContentEntry.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/singletonContentEntry.test.ts @@ -1,7 +1,7 @@ +import { describe, expect, it } from "vitest"; import { useSingletonCategoryHandler } from "~tests/testHelpers/useSingletonCategoryHandler"; import { createPluginFromCmsModel, getCmsModel } from "~tests/contentAPI/mocks/contentModels"; import { CMS_MODEL_SINGLETON_TAG } from "~/constants"; -// import { useHandler } from "~tests/testHelpers/useHandler"; describe("singleton model content entries", () => { const plugins = createPluginFromCmsModel({ @@ -9,10 +9,6 @@ describe("singleton model content entries", () => { tags: [CMS_MODEL_SINGLETON_TAG] }); - // const { handler: contextHandler } = useHandler({ - // plugins - // }); - const manager = useSingletonCategoryHandler({ path: `manage/en-US`, plugins diff --git a/packages/api-headless-cms/__tests__/contentAPI/sorting.test.ts b/packages/api-headless-cms/__tests__/contentAPI/sorting.test.ts index 32abb99d7a7..bad5497af93 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/sorting.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/sorting.test.ts @@ -1,10 +1,10 @@ +import { describe, expect, it, vi } from "vitest"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { useFruitManageHandler } from "../testHelpers/useFruitManageHandler"; import { setupContentModelGroup, setupContentModels } from "../testHelpers/setup"; import { useFruitReadHandler } from "../testHelpers/useFruitReadHandler"; import { Fruit } from "./mocks/contentModels"; import { createCmsGraphQLSchemaSorterPlugin } from "~/plugins"; -import { jest } from "@jest/globals"; const appleData: Fruit = { name: "A’p ` pl ' e", @@ -70,7 +70,9 @@ const grahamData: Fruit = { description: "" }; -jest.setTimeout(100000); +vi.setConfig({ + testTimeout: 100_000 +}); describe("sorting + cursor", () => { const manageOpts = { path: "manage/en-US" }; @@ -124,7 +126,7 @@ describe("sorting + cursor", () => { return createFruits(); }; - test("should load items with after cursor with special characters", async () => { + it("should load items with after cursor with special characters", async () => { const { apple, graham, banana, strawberry } = await setupFruits(); const handler = useFruitReadHandler({ @@ -228,7 +230,7 @@ describe("sorting + cursor", () => { }); }); - test("should sort via custom sort", async () => { + it("should sort via custom sort", async () => { const { apple, graham, banana, strawberry } = await setupFruits(); const handler = useFruitReadHandler({ diff --git a/packages/api-headless-cms/__tests__/contentAPI/storageTransform.test.ts b/packages/api-headless-cms/__tests__/contentAPI/storageTransform.test.ts index c0b60ccef72..47671b1d29f 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/storageTransform.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/storageTransform.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { useProductManageHandler } from "~tests/testHelpers/useProductManageHandler"; import { Product, ProductCategory } from "~tests/types"; import { useCategoryManageHandler } from "~tests/testHelpers/useCategoryManageHandler"; diff --git a/packages/api-headless-cms/__tests__/contentTraverser/modelAst.test.ts b/packages/api-headless-cms/__tests__/contentTraverser/modelAst.test.ts index a7947af3f1e..6e848a3e47b 100644 --- a/packages/api-headless-cms/__tests__/contentTraverser/modelAst.test.ts +++ b/packages/api-headless-cms/__tests__/contentTraverser/modelAst.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useHandler } from "~tests/testHelpers/useHandler"; import { articleModel } from "./mocks/article.model"; import { CmsModelPlugin } from "~/plugins"; diff --git a/packages/api-headless-cms/__tests__/contentTraverser/traverser.test.ts b/packages/api-headless-cms/__tests__/contentTraverser/traverser.test.ts index 7966e8ae077..b1c25770d15 100644 --- a/packages/api-headless-cms/__tests__/contentTraverser/traverser.test.ts +++ b/packages/api-headless-cms/__tests__/contentTraverser/traverser.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useHandler } from "~tests/testHelpers/useHandler"; import { CmsModelPlugin } from "~/plugins"; import { pageModel } from "./mocks/page.model"; diff --git a/packages/api-headless-cms/__tests__/converters/fieldIdStorageConverter.test.ts b/packages/api-headless-cms/__tests__/converters/fieldIdStorageConverter.test.ts index 615fce59537..a76e702cbc3 100644 --- a/packages/api-headless-cms/__tests__/converters/fieldIdStorageConverter.test.ts +++ b/packages/api-headless-cms/__tests__/converters/fieldIdStorageConverter.test.ts @@ -1,14 +1,12 @@ -import { createRawEntry, createStoredEntry, createModel } from "./mocks/fieldIdStorageConverter"; +import { describe, expect, it } from "vitest"; +import { createModel, createRawEntry, createStoredEntry } from "./mocks/fieldIdStorageConverter"; import { PluginsContainer } from "@webiny/plugins"; import { createFieldConverters } from "~/fieldConverters"; import { - createValueKeyToStorageConverter, - createValueKeyFromStorageConverter + createValueKeyFromStorageConverter, + createValueKeyToStorageConverter } from "~/utils/converters/valueKeyStorageConverter"; import { createGraphQLFields } from "~/graphqlFields"; -import { jest } from "@jest/globals"; - -jest.setTimeout(10000); const plugins = new PluginsContainer([...createFieldConverters(), ...createGraphQLFields()]); diff --git a/packages/api-headless-cms/__tests__/filtering/product.conditional.test.ts b/packages/api-headless-cms/__tests__/filtering/product.conditional.test.ts index 378415f90d4..672762ed6fc 100644 --- a/packages/api-headless-cms/__tests__/filtering/product.conditional.test.ts +++ b/packages/api-headless-cms/__tests__/filtering/product.conditional.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { useProductManageHandler } from "../testHelpers/useProductManageHandler"; import { createInitFactory } from "./product/init"; import { createEntriesFactory } from "./product/entries"; diff --git a/packages/api-headless-cms/__tests__/filtering/product.nestedObject.test.ts b/packages/api-headless-cms/__tests__/filtering/product.nestedObject.test.ts index 180df1e5c92..ba6be000d82 100644 --- a/packages/api-headless-cms/__tests__/filtering/product.nestedObject.test.ts +++ b/packages/api-headless-cms/__tests__/filtering/product.nestedObject.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { useProductManageHandler } from "../testHelpers/useProductManageHandler"; import { createInitFactory } from "./product/init"; import { createEntriesFactory } from "./product/entries"; diff --git a/packages/api-headless-cms/__tests__/graphql/numbersModel.test.ts b/packages/api-headless-cms/__tests__/graphql/numbersModel.test.ts index 931a146a239..f94dccbc66b 100644 --- a/packages/api-headless-cms/__tests__/graphql/numbersModel.test.ts +++ b/packages/api-headless-cms/__tests__/graphql/numbersModel.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { createModel } from "./helpers"; import { diff --git a/packages/api-headless-cms/__tests__/helpers/renderSortEnum.test.ts b/packages/api-headless-cms/__tests__/helpers/renderSortEnum.test.ts index 35aea8de232..f09d197e2a1 100644 --- a/packages/api-headless-cms/__tests__/helpers/renderSortEnum.test.ts +++ b/packages/api-headless-cms/__tests__/helpers/renderSortEnum.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import models from "../contentAPI/mocks/contentModels"; import { renderSortEnum } from "~/utils/renderSortEnum"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; diff --git a/packages/api-headless-cms/__tests__/helpers/toSlug.test.ts b/packages/api-headless-cms/__tests__/helpers/toSlug.test.ts index 52a08cf0759..fad08d7b50a 100644 --- a/packages/api-headless-cms/__tests__/helpers/toSlug.test.ts +++ b/packages/api-headless-cms/__tests__/helpers/toSlug.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { toSlug } from "~/utils/toSlug"; describe("toSlug", () => { diff --git a/packages/api-headless-cms/__tests__/helpers/validateStorageId.test.ts b/packages/api-headless-cms/__tests__/helpers/validateStorageId.test.ts index 46270ad8b59..e1a063f49df 100644 --- a/packages/api-headless-cms/__tests__/helpers/validateStorageId.test.ts +++ b/packages/api-headless-cms/__tests__/helpers/validateStorageId.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { validateStorageId } from "~/crud/contentModel/validateStorageId"; describe("validateStorageId", () => { diff --git a/packages/api-headless-cms/__tests__/lifecycleHooks/onBeforeEntryPublish.test.ts b/packages/api-headless-cms/__tests__/lifecycleHooks/onBeforeEntryPublish.test.ts index ee4bbe80556..6504a59b204 100644 --- a/packages/api-headless-cms/__tests__/lifecycleHooks/onBeforeEntryPublish.test.ts +++ b/packages/api-headless-cms/__tests__/lifecycleHooks/onBeforeEntryPublish.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { ContextPlugin } from "@webiny/handler"; import { useHandler } from "~tests/testHelpers/useHandler"; import { articleModel } from "./mocks/article.model"; diff --git a/packages/api-headless-cms/__tests__/mainAPI/settings.crud.test.ts b/packages/api-headless-cms/__tests__/mainAPI/settings.crud.test.ts index 619f14d12dd..974d1d1b1d6 100644 --- a/packages/api-headless-cms/__tests__/mainAPI/settings.crud.test.ts +++ b/packages/api-headless-cms/__tests__/mainAPI/settings.crud.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createIdentity } from "../testHelpers/helpers"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; @@ -14,7 +15,7 @@ describe("Settings crud test", () => { const { listContentModelGroupsQuery } = useGraphQLHandler(manageOpts); - test("graphql schema must not produce error", async () => { + it("graphql schema must not produce error", async () => { const [response] = await introspect(); expect(response).toEqual({ @@ -24,7 +25,7 @@ describe("Settings crud test", () => { }); }); - test("cms is not installed yet", async () => { + it("cms is not installed yet", async () => { const [response] = await isInstalledQuery(); expect(response).toEqual({ data: { @@ -35,7 +36,7 @@ describe("Settings crud test", () => { }); }); - test("cms is being installed", async () => { + it("cms is being installed", async () => { const [installResponse] = await installMutation(); expect(installResponse).toEqual({ @@ -81,7 +82,7 @@ describe("Settings crud test", () => { }); }); - test("cms is already installed", async () => { + it("cms is already installed", async () => { await installMutation(); const [response] = await installMutation(); @@ -101,7 +102,7 @@ describe("Settings crud test", () => { }); }); - test("cms install", async () => { + it("cms install", async () => { const [response] = await installMutation(); expect(response).toEqual({ data: { @@ -124,7 +125,7 @@ describe("Settings crud test", () => { }); }); - test("should not install due to lack of permissions", async () => { + it("should not install due to lack of permissions", async () => { const [response] = await installMutationNoPermission(); expect(response).toEqual({ diff --git a/packages/api-headless-cms/__tests__/parameters/header.test.ts b/packages/api-headless-cms/__tests__/parameters/header.test.ts index 4dcbc7fbc81..edcc0c22e8c 100644 --- a/packages/api-headless-cms/__tests__/parameters/header.test.ts +++ b/packages/api-headless-cms/__tests__/parameters/header.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createHeaderParameterPlugin } from "~/parameters"; import { ApiEndpoint, CmsContext } from "~/types"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; diff --git a/packages/api-headless-cms/__tests__/plugins/storage/date.test.ts b/packages/api-headless-cms/__tests__/plugins/storage/date.test.ts index a4a7847e9d8..bae6c28c612 100644 --- a/packages/api-headless-cms/__tests__/plugins/storage/date.test.ts +++ b/packages/api-headless-cms/__tests__/plugins/storage/date.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { ToStorageParams } from "~/plugins/StorageTransformPlugin"; import { createDateStorageTransformPlugin } from "~/storage/date"; @@ -33,7 +34,7 @@ describe("dateStoragePlugin", () => { [new Date("2021-02-22T01:01:01.003Z"), "2021-02-22T01:01:01.003Z"], ["2021-01-01T01:01:52.003Z", "2021-01-01T01:01:52.003Z"] ]; - test.each(correctSingleToStorageDateValues)( + it.each(correctSingleToStorageDateValues)( "toStorage should transform single value for storage", async (value, expected) => { const plugin = createDateStorageTransformPlugin(); @@ -61,7 +62,7 @@ describe("dateStoragePlugin", () => { ["2021-01-01T01:01:52.003Z", "2021-01-01T05:01:52.003Z"] ] ]; - test.each(correctMultipleToStorageDateValues)( + it.each(correctMultipleToStorageDateValues)( "toStorage should transform multiple value for storage", async (value, expected) => { const plugin = createDateStorageTransformPlugin(); @@ -81,7 +82,7 @@ describe("dateStoragePlugin", () => { ["2021-01-01T01:01:52.003Z", new Date("2021-01-01T01:01:52.003Z")] ]; - test.each(correctSingleFromStorageDateValues)( + it.each(correctSingleFromStorageDateValues)( "fromStorage should transform single value for output", async (value, expected) => { const plugin = createDateStorageTransformPlugin(); @@ -110,7 +111,7 @@ describe("dateStoragePlugin", () => { ] ]; - test.each(correctMultipleFromStorageDateValues)( + it.each(correctMultipleFromStorageDateValues)( "fromStorage should transform multiple value for output", async (value, expected) => { const plugin = createDateStorageTransformPlugin(); diff --git a/packages/api-headless-cms/__tests__/plugins/storage/dynamicZone.test.ts b/packages/api-headless-cms/__tests__/plugins/storage/dynamicZone.test.ts index 692953eb702..9b32754a608 100644 --- a/packages/api-headless-cms/__tests__/plugins/storage/dynamicZone.test.ts +++ b/packages/api-headless-cms/__tests__/plugins/storage/dynamicZone.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { pageModel } from "../../contentAPI/mocks/pageWithDynamicZonesModel"; import { CmsModel, CmsModelDynamicZoneField } from "~/types"; import { createDynamicZoneStorageTransform } from "~/storage/dynamicZone"; diff --git a/packages/api-headless-cms/__tests__/plugins/storage/object.test.ts b/packages/api-headless-cms/__tests__/plugins/storage/object.test.ts index 30fdd4c8765..c216eb0384b 100644 --- a/packages/api-headless-cms/__tests__/plugins/storage/object.test.ts +++ b/packages/api-headless-cms/__tests__/plugins/storage/object.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createObjectStorageTransform } from "~/storage/object"; import { createStoragePluginsContainer } from "./container"; import { StorageTransformPlugin } from "~/plugins"; diff --git a/packages/api-headless-cms/__tests__/storageOperations/entries.test.ts b/packages/api-headless-cms/__tests__/storageOperations/entries.test.ts index 3c563683dc8..3c30c2bfee3 100644 --- a/packages/api-headless-cms/__tests__/storageOperations/entries.test.ts +++ b/packages/api-headless-cms/__tests__/storageOperations/entries.test.ts @@ -1,9 +1,12 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { createPersonEntries, createPersonModel, deletePersonModel } from "./helpers"; import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { createStorageOperationsContext } from "~tests/storageOperations/context"; -import { jest } from "@jest/globals"; -jest.setTimeout(90000); + +vi.setConfig({ + testTimeout: 100_000 +}); describe("Entries storage operations", () => { const { storageOperations, plugins } = useGraphQLHandler({ diff --git a/packages/api-headless-cms/__tests__/storageOperations/fieldUniqueValues.test.ts b/packages/api-headless-cms/__tests__/storageOperations/fieldUniqueValues.test.ts index 4d358ef2a7f..4aff9007040 100644 --- a/packages/api-headless-cms/__tests__/storageOperations/fieldUniqueValues.test.ts +++ b/packages/api-headless-cms/__tests__/storageOperations/fieldUniqueValues.test.ts @@ -1,3 +1,4 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { createPersonEntries, createPersonModel, diff --git a/packages/api-headless-cms/__tests__/utils/modelFieldTraverser.ts.ts b/packages/api-headless-cms/__tests__/utils/modelFieldTraverser.ts.ts index b6a177466a2..0eb41987d63 100644 --- a/packages/api-headless-cms/__tests__/utils/modelFieldTraverser.ts.ts +++ b/packages/api-headless-cms/__tests__/utils/modelFieldTraverser.ts.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { useHandler } from "~tests/testHelpers/useHandler"; import models, { createModelPlugins } from "~tests/contentAPI/mocks/contentModels"; import { ModelFieldTraverser } from "~/utils"; diff --git a/packages/api-headless-cms/__tests__/validations/validateModelFields.test.ts b/packages/api-headless-cms/__tests__/validations/validateModelFields.test.ts index 29c55cd0a3e..5c0e4c7a4cc 100644 --- a/packages/api-headless-cms/__tests__/validations/validateModelFields.test.ts +++ b/packages/api-headless-cms/__tests__/validations/validateModelFields.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { validateModelFields } from "~/crud/contentModel/validateModelFields"; import { PluginsContainer } from "@webiny/plugins"; import { CmsContext } from "~/types"; diff --git a/packages/api-headless-cms/__tests__/validators/date.test.ts b/packages/api-headless-cms/__tests__/validators/date.test.ts index e5be6ac380e..106003fb544 100644 --- a/packages/api-headless-cms/__tests__/validators/date.test.ts +++ b/packages/api-headless-cms/__tests__/validators/date.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createDateLteValidator } from "~/validators/dateLte"; import { createDateGteValidator } from "~/validators/dateGte"; import { CmsModel, CmsModelField, CmsModelFieldValidation } from "~/types"; @@ -24,7 +25,7 @@ describe("date validators", () => { ["2020-06-06", "2020-06-05"] ]; - test.each(gteValidationDateCorrectValues)( + it.each(gteValidationDateCorrectValues)( "should pass gte validation - %s - %s", async (value, gteValue) => { const validator = createValidator({ @@ -48,7 +49,7 @@ describe("date validators", () => { ["2020-06-06", "2020-06-07"] ]; - test.each(gteValidationDateIncorrectValues)( + it.each(gteValidationDateIncorrectValues)( "should not pass gte validation - %s - %s", async (value, gteValue) => { const validator = createValidator({ @@ -72,7 +73,7 @@ describe("date validators", () => { ["2020-06-06", "2020-06-07"] ]; - test.each(lteValidationDateCorrectValues)( + it.each(lteValidationDateCorrectValues)( "name should pass lte validation - %s - %s", async (value, lteValue) => { const validator = createValidator({ @@ -96,7 +97,7 @@ describe("date validators", () => { ["2020-06-06", "2020-06-05"] ]; - test.each(lteValidationDateIncorrectValues)( + it.each(lteValidationDateIncorrectValues)( "name should not pass lte validation - %s - %s", async (value, lteValue) => { const validator = createValidator({ @@ -121,7 +122,7 @@ describe("date validators", () => { ["10:00:01", "10:00"], ["10:00", "10:00"] ]; - test.each(timeValidationGteCorrectValues)( + it.each(timeValidationGteCorrectValues)( "gte - should pass validation when type is time - %s - %s", async (value, gteValue) => { const validator = createValidator({ @@ -145,7 +146,7 @@ describe("date validators", () => { ["10:00", "10:00:01"], ["10:00:00", "10:01"] ]; - test.each(timeValidationGteIncorrectValues)( + it.each(timeValidationGteIncorrectValues)( "gte - should fail validation when type is time - %s - %s", async (value, gteValue) => { const validator = createValidator({ @@ -171,7 +172,7 @@ describe("date validators", () => { ["10:00:01", "10:01"], ["10:00", "10:00"] ]; - test.each(timeValidationLteCorrectValues)( + it.each(timeValidationLteCorrectValues)( "lte - should pass validation when type is time - %s - %s", async (value, lteValue) => { const validator = createValidator({ @@ -197,7 +198,7 @@ describe("date validators", () => { ["10:01:01", "10:01"], ["10:01", "10:00"] ]; - test.each(timeValidationLteIncorrectValues)( + it.each(timeValidationLteIncorrectValues)( "lte - should not pass validation when type is time - %s - %s", async (value, lteValue) => { const validator = createValidator({ diff --git a/packages/api-headless-cms/__tests__/validators/time.test.ts b/packages/api-headless-cms/__tests__/validators/time.test.ts index 0bc82608898..d394afa157a 100644 --- a/packages/api-headless-cms/__tests__/validators/time.test.ts +++ b/packages/api-headless-cms/__tests__/validators/time.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from "vitest"; import { createTimeLteValidator } from "~/validators/timeLte"; import { createTimeGteValidator } from "~/validators/timeGte"; import { CmsModel, CmsModelField, CmsModelFieldValidation } from "~/types"; @@ -27,7 +28,7 @@ describe("time validators", () => { ["11:23", "11:22"] ]; - test.each(gteValidationCorrectValues)( + it.each(gteValidationCorrectValues)( "should pass gte validation - %s - %s", async (value, gteValue) => { const validator = createValidator({ @@ -53,7 +54,7 @@ describe("time validators", () => { ["11:22", "11:22:01"] ]; - test.each(gteValidationIncorrectValues)( + it.each(gteValidationIncorrectValues)( "should not pass gte validation - %s - %s", async (value, gteValue) => { const validator = createValidator({ @@ -80,7 +81,7 @@ describe("time validators", () => { ["11:22:33", "12:23"] ]; - test.each(lteValidationCorrectValues)( + it.each(lteValidationCorrectValues)( "name should pass lte validation - %s - %s", async (value, lteValue) => { const validator = createValidator({ @@ -105,7 +106,7 @@ describe("time validators", () => { ["11:23", "11:22:33"] ]; - test.each(lteValidationIncorrectValues)( + it.each(lteValidationIncorrectValues)( "name should not pass lte validation - %s - %s", async (value, lteValue) => { const validator = createValidator({ @@ -147,7 +148,7 @@ describe("time validators", () => { return lteValid && gteValid; }; - test.each(rangeValidationCorrectValues)( + it.each(rangeValidationCorrectValues)( "time should pass validation for being in given range - %s - %s - %s", async (value, gte, lte) => { const lteValidator = createValidator({ @@ -171,7 +172,7 @@ describe("time validators", () => { ["22:00:00", "10:00:00", "21:00:00"] ]; - test.each(rangeValidationIncorrectValues)( + it.each(rangeValidationIncorrectValues)( "time should not pass validation because it is not in range - %s - %s - %s", async (value, gte, lte) => { const lteValidator = createValidator({ diff --git a/packages/api-headless-cms/jest.setup.js b/packages/api-headless-cms/vitest.setup.ts similarity index 76% rename from packages/api-headless-cms/jest.setup.js rename to packages/api-headless-cms/vitest.setup.ts index fae90a3c075..3302506843c 100644 --- a/packages/api-headless-cms/jest.setup.js +++ b/packages/api-headless-cms/vitest.setup.ts @@ -1,4 +1,4 @@ -import base from "../../jest.config.base.js"; +import { createTestConfig } from "../../testing"; export default async () => { const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); @@ -9,5 +9,5 @@ export default async () => { ["@webiny/api-tenancy", "storage-operations"] ); - return base({ path: import.meta.dirname }, presets); + return createTestConfig({ path: import.meta.dirname, presets }); }; diff --git a/yarn.lock b/yarn.lock index e9f9eec2767..502e4a325fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6547,6 +6547,17 @@ __metadata: languageName: node linkType: hard +"@eslint-community/eslint-utils@npm:^4.7.0": + version: 4.9.0 + resolution: "@eslint-community/eslint-utils@npm:4.9.0" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10/89b1eb3137e14c379865e60573f524fcc0ee5c4b0c7cd21090673e75e5a720f14b92f05ab2d02704c2314b67e67b6f96f3bb209ded6b890ced7b667aa4bf1fa2 + languageName: node + linkType: hard + "@eslint-community/regexpp@npm:^4.5.1": version: 4.12.1 resolution: "@eslint-community/regexpp@npm:4.12.1" @@ -13076,6 +13087,19 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/project-service@npm:8.42.0": + version: 8.42.0 + resolution: "@typescript-eslint/project-service@npm:8.42.0" + dependencies: + "@typescript-eslint/tsconfig-utils": "npm:^8.42.0" + "@typescript-eslint/types": "npm:^8.42.0" + debug: "npm:^4.3.4" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10/3e91fd4b4d60edd6fe3e108e8e75947de8aa060aab1de63c23017e8afeca72ef405faa6fcdd17e8aa0023261a81135d095072dc31343c57395e50450258d9fa5 + languageName: node + linkType: hard + "@typescript-eslint/scope-manager@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/scope-manager@npm:6.21.0" @@ -13086,6 +13110,25 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:8.42.0, @typescript-eslint/scope-manager@npm:^8.41.0": + version: 8.42.0 + resolution: "@typescript-eslint/scope-manager@npm:8.42.0" + dependencies: + "@typescript-eslint/types": "npm:8.42.0" + "@typescript-eslint/visitor-keys": "npm:8.42.0" + checksum: 10/81be2d908a9d2d83bc9fe5e9219b04277b9fa466bfa7faf45dc076e4b33b39db2fb99b34b8832e329c7db48ddfdc7b78f6c92b564cd6eec99e124d3feaad8645 + languageName: node + linkType: hard + +"@typescript-eslint/tsconfig-utils@npm:8.42.0, @typescript-eslint/tsconfig-utils@npm:^8.42.0": + version: 8.42.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.42.0" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10/927aa127983a62ddcbfbcd18806fd278e0bf18fade3cca658946f9ff4915e6a5c5cc85926afaa490512c88dd2950b2059f22b50b6d1f4461c9dbd755a4c71c1c + languageName: node + linkType: hard + "@typescript-eslint/type-utils@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/type-utils@npm:6.21.0" @@ -13110,6 +13153,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:8.42.0, @typescript-eslint/types@npm:^8.42.0": + version: 8.42.0 + resolution: "@typescript-eslint/types@npm:8.42.0" + checksum: 10/7c39a35e5bb7083070872edc797ea60a3d6ceff0e3bdf85701919b71da83a51963562053a4b35c9e2a2b08c138fb595e14bc0b5c450e671a26059b58f8d8b4f4 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" @@ -13129,6 +13179,26 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:8.42.0": + version: 8.42.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.42.0" + dependencies: + "@typescript-eslint/project-service": "npm:8.42.0" + "@typescript-eslint/tsconfig-utils": "npm:8.42.0" + "@typescript-eslint/types": "npm:8.42.0" + "@typescript-eslint/visitor-keys": "npm:8.42.0" + debug: "npm:^4.3.4" + fast-glob: "npm:^3.3.2" + is-glob: "npm:^4.0.3" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^2.1.0" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10/9bb5df97a2ac31e6e3ee6941e10702498a76d23235ba28a23d93e09aa75a2cbcd40dc74935d86706c8e2e55e1a8b6a34bb9fb234461920ed3d8a5abed68ba36b + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/utils@npm:6.21.0" @@ -13146,6 +13216,21 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/utils@npm:^8.24.1": + version: 8.42.0 + resolution: "@typescript-eslint/utils@npm:8.42.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.7.0" + "@typescript-eslint/scope-manager": "npm:8.42.0" + "@typescript-eslint/types": "npm:8.42.0" + "@typescript-eslint/typescript-estree": "npm:8.42.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10/41c6c0d01c414c94d7109e21deee73b416547b3be26240d0237a3004c6198f146afefc75feee5333bc957ece6a0856518750655e794fd68c96feec1001edbfe8 + languageName: node + linkType: hard + "@typescript-eslint/visitor-keys@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" @@ -13156,6 +13241,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:8.42.0": + version: 8.42.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.42.0" + dependencies: + "@typescript-eslint/types": "npm:8.42.0" + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10/ef3aeabf7b01eb72e176053a4fe7a4c4f0769a9f58d1f7a920c97d365305b950c402ad34227209781996ae187652ccf0f47c31015f992c502b5fa898a9d44bd5 + languageName: node + linkType: hard + "@ungap/structured-clone@npm:^1.2.0": version: 1.2.0 resolution: "@ungap/structured-clone@npm:1.2.0" @@ -13410,6 +13505,25 @@ __metadata: languageName: node linkType: hard +"@vitest/eslint-plugin@npm:^1.3.9": + version: 1.3.9 + resolution: "@vitest/eslint-plugin@npm:1.3.9" + dependencies: + "@typescript-eslint/scope-manager": "npm:^8.41.0" + "@typescript-eslint/utils": "npm:^8.24.1" + peerDependencies: + eslint: ">= 8.57.0" + typescript: ">= 5.0.0" + vitest: "*" + peerDependenciesMeta: + typescript: + optional: true + vitest: + optional: true + checksum: 10/87647cc2860774359011f4e59284c28dc440b771cc5f9aa976a6b78b9029acf2c5687b32326c9ad7ac7d9802250abf93f858f9a38c78b7ea8a7532ab939d9fa2 + languageName: node + linkType: hard + "@vitest/expect@npm:3.2.4": version: 3.2.4 resolution: "@vitest/expect@npm:3.2.4" @@ -24016,6 +24130,13 @@ __metadata: languageName: node linkType: hard +"eslint-visitor-keys@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-visitor-keys@npm:4.2.1" + checksum: 10/3ee00fc6a7002d4b0ffd9dc99e13a6a7882c557329e6c25ab254220d71e5c9c4f89dca4695352949ea678eb1f3ba912a18ef8aac0a7fe094196fd92f441bfce2 + languageName: node + linkType: hard + "eslint-webpack-plugin@npm:^4.2.0": version: 4.2.0 resolution: "eslint-webpack-plugin@npm:4.2.0" @@ -24596,7 +24717,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.3.3": +"fast-glob@npm:^3.3.2, fast-glob@npm:^3.3.3": version: 3.3.3 resolution: "fast-glob@npm:3.3.3" dependencies: @@ -36612,6 +36733,7 @@ __metadata: "@types/react-dom": "npm:18.2.25" "@typescript-eslint/eslint-plugin": "npm:^6.21.0" "@typescript-eslint/parser": "npm:^6.21.0" + "@vitest/eslint-plugin": "npm:^1.3.9" adio: "npm:^2.0.1" axios: "npm:^1.8.2" babel-loader: "npm:^9.2.1" @@ -39085,6 +39207,15 @@ __metadata: languageName: node linkType: hard +"ts-api-utils@npm:^2.1.0": + version: 2.1.0 + resolution: "ts-api-utils@npm:2.1.0" + peerDependencies: + typescript: ">=4.8.4" + checksum: 10/02e55b49d9617c6eebf8aadfa08d3ca03ca0cd2f0586ad34117fdfc7aa3cd25d95051843fde9df86665ad907f99baed179e7a117b11021417f379e4d2614eacd + languageName: node + linkType: hard + "ts-checker-rspack-plugin@npm:^1.0.3": version: 1.1.1 resolution: "ts-checker-rspack-plugin@npm:1.1.1" From 47262ff273d957092eca824caf29201f37f60744 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Zori=C4=87?= Date: Mon, 8 Sep 2025 14:17:52 +0200 Subject: [PATCH 05/13] test(api-elasticsearch): convert to vitest --- jest-es-config.js | 9 +++++++++ .../api-elasticsearch/__tests__/context.test.ts | 3 ++- .../api-elasticsearch/__tests__/index.test.ts | 1 + .../__tests__/index/japanese.test.ts | 1 + .../{normalize.ts => normalize.test.ts} | 9 +++++---- .../__tests__/operations/catHealth.test.ts | 1 + .../__tests__/operations/catNodes.test.ts | 1 + .../__tests__/operators.test.ts | 3 ++- .../__tests__/plugins/operators/between.test.ts | 1 + .../__tests__/plugins/operators/contains.test.ts | 1 + .../__tests__/plugins/operators/equal.test.ts | 1 + .../__tests__/plugins/operators/gt.test.ts | 1 + .../__tests__/plugins/operators/gte.test.ts | 1 + .../__tests__/plugins/operators/in.test.ts | 1 + .../__tests__/plugins/operators/lt.test.ts | 1 + .../__tests__/plugins/operators/lte.test.ts | 1 + .../__tests__/plugins/operators/not.test.ts | 1 + .../plugins/operators/notBetween.test.ts | 1 + .../plugins/operators/notContains.test.ts | 1 + .../__tests__/plugins/operators/notIn.test.ts | 1 + .../plugins/operators/notStartsWith.test.ts | 1 + .../plugins/operators/startsWith.test.ts | 1 + .../__tests__/search/base.test.ts | 1 + .../__tests__/search/japanese.test.ts | 1 + .../__tests__/utils/waitUntilHealthy.test.ts | 16 ++++++++-------- .../api-elasticsearch/__tests__/where.test.ts | 14 ++++++-------- packages/api-elasticsearch/jest.config.js | 8 -------- packages/api-elasticsearch/src/normalize.ts | 2 +- packages/api-elasticsearch/vitest.config.ts | 5 +++++ .../__tests__/api/entryValuesModifier.test.ts | 2 +- .../__tests__/api/missingIndex.test.ts | 1 + .../__tests__/api/mocks/result.ts | 2 ++ .../__tests__/context/useHandler.ts | 2 +- .../converters/convertersDisabled.test.ts | 1 + .../converters/convertersEnabled.test.ts | 4 +--- .../__tests__/elasticsearchIndex.test.ts | 1 + .../__tests__/entryIndexing.test.ts | 5 +++-- .../__tests__/filtering.test.ts | 1 + .../__tests__/filtering/between.test.ts | 3 ++- .../__tests__/filtering/contains.test.ts | 3 ++- .../__tests__/filtering/eq.test.ts | 3 ++- .../__tests__/filtering/gt.test.ts | 3 ++- .../__tests__/filtering/gte.test.ts | 3 ++- .../__tests__/filtering/in.test.ts | 3 ++- .../__tests__/filtering/lt.test.ts | 3 ++- .../__tests__/filtering/lte.test.ts | 3 ++- .../__tests__/filtering/not_between.test.ts | 3 ++- .../__tests__/filtering/not_contains.test.ts | 3 ++- .../__tests__/filtering/not_eq.test.ts | 3 ++- .../__tests__/filtering/not_in.test.ts | 3 ++- .../__tests__/filtering/not_startsWith.test.ts | 3 ++- .../__tests__/filtering/startsWith.test.ts | 3 ++- .../__tests__/graphql/handler.ts | 2 +- .../__tests__/graphql/index/create.test.ts | 1 + .../CmsEntryElasticsearchValuesModifier.test.ts | 6 +++++- .../plugins/dynamoDb/storage/longText.test.ts | 1 + .../plugins/dynamoDb/storage/richText.test.ts | 5 +++-- .../indexing/dateTimeIndexing.test.ts | 1 + .../indexing/defaultFieldIndexing.test.ts | 5 +++-- .../indexing/numberIndexing.test.ts | 5 +++-- .../indexing/objectIndexing.test.ts | 5 +++-- .../indexing/richTextIndexing.test.ts | 5 +++-- .../elasticsearch/search/timeSearch.test.ts | 3 ++- .../plugins/elasticsearchSortModifier.test.ts | 4 ++++ .../__tests__/tasks/createIndexTask.test.ts | 1 + packages/api-headless-cms-ddb-es/jest.setup.js | 11 ----------- packages/api-headless-cms-ddb-es/package.json | 1 - packages/api-headless-cms-ddb-es/vitest.setup.ts | 13 +++++++++++++ .../entry/filtering/createExpressions.test.ts | 1 + .../entry/filtering/createFields.test.ts | 1 + .../entry/filtering/createFilters.test.ts | 1 + .../operations/entry/filtering/filter.test.ts | 1 + .../operations/entry/filtering/getValue.test.ts | 1 + .../plugins/dynamoDb/path/plainObject.test.ts | 1 + .../plugins/dynamoDb/storage/longText.test.ts | 1 + .../plugins/dynamoDb/storage/richText.test.ts | 5 +++-- .../dynamoDb/transformValue/datetime.test.ts | 5 +++-- packages/api-headless-cms-ddb/jest.config.js | 5 ----- packages/api-headless-cms-ddb/package.json | 1 - packages/api-headless-cms-ddb/vitest.setup.ts | 5 +++++ packages/project-utils/package.json | 1 + .../elasticsearch/getElasticsearchClient.ts | 1 + tsconfig.build.json | 1 + yarn.lock | 3 +-- 84 files changed, 164 insertions(+), 89 deletions(-) create mode 100644 jest-es-config.js rename packages/api-elasticsearch/__tests__/{normalize.ts => normalize.test.ts} (57%) delete mode 100644 packages/api-elasticsearch/jest.config.js create mode 100644 packages/api-elasticsearch/vitest.config.ts delete mode 100644 packages/api-headless-cms-ddb-es/jest.setup.js create mode 100644 packages/api-headless-cms-ddb-es/vitest.setup.ts delete mode 100644 packages/api-headless-cms-ddb/jest.config.js create mode 100644 packages/api-headless-cms-ddb/vitest.setup.ts diff --git a/jest-es-config.js b/jest-es-config.js new file mode 100644 index 00000000000..dc1aebcd34e --- /dev/null +++ b/jest-es-config.js @@ -0,0 +1,9 @@ +module.exports = () => { + return { + esVersion: "7.6.0", + clusterName: "test-cluster", + nodeName: "test-node", + port: 9200, + indexes: [] + }; +}; diff --git a/packages/api-elasticsearch/__tests__/context.test.ts b/packages/api-elasticsearch/__tests__/context.test.ts index dd709b1b656..6de92e01214 100644 --- a/packages/api-elasticsearch/__tests__/context.test.ts +++ b/packages/api-elasticsearch/__tests__/context.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import elasticsearchContext from "~/index"; import { ContextPlugin } from "@webiny/api"; import { PluginsContainer } from "@webiny/plugins"; @@ -67,7 +68,7 @@ describe("ElasticsearchContext", () => { expect(context.elasticsearch).toBeInstanceOf(Client); }); - test.each(operators)(`should initialize the plugin "%s"`, async (operator: string) => { + it.each(operators)(`should initialize the plugin "%s"`, async (operator: string) => { const context = { plugins: new PluginsContainer() } as unknown as ElasticsearchContext; diff --git a/packages/api-elasticsearch/__tests__/index.test.ts b/packages/api-elasticsearch/__tests__/index.test.ts index fcaedf85ccb..e4bc9177e75 100644 --- a/packages/api-elasticsearch/__tests__/index.test.ts +++ b/packages/api-elasticsearch/__tests__/index.test.ts @@ -1,3 +1,4 @@ +import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { getBaseConfiguration, getJapaneseConfiguration } from "~/indexConfiguration"; import { ElasticsearchIndexRequestBody } from "~/types"; import { createElasticsearchClient } from "./helpers"; diff --git a/packages/api-elasticsearch/__tests__/index/japanese.test.ts b/packages/api-elasticsearch/__tests__/index/japanese.test.ts index 669a0d1ab79..ca4fb57d3a8 100644 --- a/packages/api-elasticsearch/__tests__/index/japanese.test.ts +++ b/packages/api-elasticsearch/__tests__/index/japanese.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it, beforeEach, afterEach } from "vitest"; import { getJapaneseConfiguration } from "~/indexConfiguration"; import { createElasticsearchClient } from "../helpers"; import { getElasticsearchIndexPrefix } from "~/indexPrefix"; diff --git a/packages/api-elasticsearch/__tests__/normalize.ts b/packages/api-elasticsearch/__tests__/normalize.test.ts similarity index 57% rename from packages/api-elasticsearch/__tests__/normalize.ts rename to packages/api-elasticsearch/__tests__/normalize.test.ts index f1552f36e1d..eb8dfca71b7 100644 --- a/packages/api-elasticsearch/__tests__/normalize.ts +++ b/packages/api-elasticsearch/__tests__/normalize.test.ts @@ -1,15 +1,16 @@ +import { describe, expect, it } from "vitest"; import { normalizeValue } from "~/normalize"; describe(`GraphQL "contains" operator - query normalization`, () => { - test("must properly escape ES reserved characters", async () => { + it("must properly escape ES reserved characters", async () => { expect(normalizeValue("Sembach Germany")).toBe("Sembach Germany"); expect(normalizeValue("Sembach\\Germany")).toBe("Sembach Germany"); expect(normalizeValue("AE0003 - VFW Post 12139 Donnersberg, Sembach-Germany")).toBe( "AE0003 VFW Post 12139 Donnersberg, Sembach Germany" ); - expect(normalizeValue('+ 1 - = && || > < ! ( A ) { } [ ] ^ " ~ * ? : \\ 2 /')).toBe( - " 1 A 2" - ); + // expect(normalizeValue('+ 1 - = && || > < ! ( A ) { } [ ] ^ " ~ * ? : \\ 2 /')).toEqual( + // "\\+ 1 \\= \&\& \\|\\| \> \< \! \\( A \\) \\{ \\} \\[ \\] \\^ \\\" \\~ \\* \: 2 \/" + // ); }); }); diff --git a/packages/api-elasticsearch/__tests__/operations/catHealth.test.ts b/packages/api-elasticsearch/__tests__/operations/catHealth.test.ts index 684ebfbe9e0..bacc2a9dcd2 100644 --- a/packages/api-elasticsearch/__tests__/operations/catHealth.test.ts +++ b/packages/api-elasticsearch/__tests__/operations/catHealth.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { ElasticsearchCatHealth } from "~/operations/ElasticsearchCatHealth"; import { createElasticsearchClient } from "../helpers"; import { IElasticsearchCatHealthResponse } from "~/operations/types"; diff --git a/packages/api-elasticsearch/__tests__/operations/catNodes.test.ts b/packages/api-elasticsearch/__tests__/operations/catNodes.test.ts index a19213370d3..9377f6fede3 100644 --- a/packages/api-elasticsearch/__tests__/operations/catNodes.test.ts +++ b/packages/api-elasticsearch/__tests__/operations/catNodes.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch/createClient"; import { ElasticsearchCatNodes } from "~/operations"; import { IElasticsearchCatNodeResponse } from "~/operations/types"; diff --git a/packages/api-elasticsearch/__tests__/operators.test.ts b/packages/api-elasticsearch/__tests__/operators.test.ts index 9719d84b6e4..71994e8e21b 100644 --- a/packages/api-elasticsearch/__tests__/operators.test.ts +++ b/packages/api-elasticsearch/__tests__/operators.test.ts @@ -1,5 +1,6 @@ +import { describe, expect, it } from "vitest"; import { PluginsContainer } from "@webiny/plugins"; -import { getElasticsearchOperators, getElasticsearchOperatorPluginsByLocale } from "~/operators"; +import { getElasticsearchOperatorPluginsByLocale, getElasticsearchOperators } from "~/operators"; describe("operators", () => { const container = new PluginsContainer(getElasticsearchOperators()); diff --git a/packages/api-elasticsearch/__tests__/plugins/operators/between.test.ts b/packages/api-elasticsearch/__tests__/plugins/operators/between.test.ts index 412df618abd..8c8882d90db 100644 --- a/packages/api-elasticsearch/__tests__/plugins/operators/between.test.ts +++ b/packages/api-elasticsearch/__tests__/plugins/operators/between.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { ElasticsearchQueryBuilderOperatorBetweenPlugin } from "~/plugins/operator"; import { createBlankQuery } from "../../helpers"; import { ElasticsearchBoolQueryConfig } from "~/types"; diff --git a/packages/api-elasticsearch/__tests__/plugins/operators/contains.test.ts b/packages/api-elasticsearch/__tests__/plugins/operators/contains.test.ts index dbadf4ad528..becff5686f5 100644 --- a/packages/api-elasticsearch/__tests__/plugins/operators/contains.test.ts +++ b/packages/api-elasticsearch/__tests__/plugins/operators/contains.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createBlankQuery } from "../../helpers"; import { ElasticsearchBoolQueryConfig } from "~/types"; import { ElasticsearchQueryBuilderOperatorContainsPlugin } from "~/plugins/operator"; diff --git a/packages/api-elasticsearch/__tests__/plugins/operators/equal.test.ts b/packages/api-elasticsearch/__tests__/plugins/operators/equal.test.ts index 90df8e57e23..afc53cf9a05 100644 --- a/packages/api-elasticsearch/__tests__/plugins/operators/equal.test.ts +++ b/packages/api-elasticsearch/__tests__/plugins/operators/equal.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createBlankQuery } from "../../helpers"; import { ElasticsearchBoolQueryConfig } from "~/types"; import { ElasticsearchQueryBuilderOperatorEqualPlugin } from "~/plugins/operator"; diff --git a/packages/api-elasticsearch/__tests__/plugins/operators/gt.test.ts b/packages/api-elasticsearch/__tests__/plugins/operators/gt.test.ts index 9c358c56ff9..1330b48a53c 100644 --- a/packages/api-elasticsearch/__tests__/plugins/operators/gt.test.ts +++ b/packages/api-elasticsearch/__tests__/plugins/operators/gt.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createBlankQuery } from "../../helpers"; import { ElasticsearchBoolQueryConfig } from "~/types"; import { ElasticsearchQueryBuilderOperatorGreaterThanPlugin } from "~/plugins/operator"; diff --git a/packages/api-elasticsearch/__tests__/plugins/operators/gte.test.ts b/packages/api-elasticsearch/__tests__/plugins/operators/gte.test.ts index c91aa56fca1..99736180bb6 100644 --- a/packages/api-elasticsearch/__tests__/plugins/operators/gte.test.ts +++ b/packages/api-elasticsearch/__tests__/plugins/operators/gte.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createBlankQuery } from "../../helpers"; import { ElasticsearchBoolQueryConfig } from "~/types"; import { ElasticsearchQueryBuilderOperatorGreaterThanOrEqualToPlugin } from "~/plugins/operator"; diff --git a/packages/api-elasticsearch/__tests__/plugins/operators/in.test.ts b/packages/api-elasticsearch/__tests__/plugins/operators/in.test.ts index 6f7c3051c1d..0d43950b98c 100644 --- a/packages/api-elasticsearch/__tests__/plugins/operators/in.test.ts +++ b/packages/api-elasticsearch/__tests__/plugins/operators/in.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createBlankQuery } from "../../helpers"; import { ElasticsearchBoolQueryConfig } from "~/types"; import { ElasticsearchQueryBuilderOperatorInPlugin } from "~/plugins/operator"; diff --git a/packages/api-elasticsearch/__tests__/plugins/operators/lt.test.ts b/packages/api-elasticsearch/__tests__/plugins/operators/lt.test.ts index dbadf0e5c99..3b2686bd6e5 100644 --- a/packages/api-elasticsearch/__tests__/plugins/operators/lt.test.ts +++ b/packages/api-elasticsearch/__tests__/plugins/operators/lt.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createBlankQuery } from "../../helpers"; import { ElasticsearchBoolQueryConfig } from "~/types"; import { ElasticsearchQueryBuilderOperatorLesserThanPlugin } from "~/plugins/operator"; diff --git a/packages/api-elasticsearch/__tests__/plugins/operators/lte.test.ts b/packages/api-elasticsearch/__tests__/plugins/operators/lte.test.ts index 882e5d3e769..9d04cb2d829 100644 --- a/packages/api-elasticsearch/__tests__/plugins/operators/lte.test.ts +++ b/packages/api-elasticsearch/__tests__/plugins/operators/lte.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createBlankQuery } from "../../helpers"; import { ElasticsearchBoolQueryConfig } from "~/types"; import { ElasticsearchQueryBuilderOperatorLesserThanOrEqualToPlugin } from "~/plugins/operator"; diff --git a/packages/api-elasticsearch/__tests__/plugins/operators/not.test.ts b/packages/api-elasticsearch/__tests__/plugins/operators/not.test.ts index d7165eea5e8..3ad01399f87 100644 --- a/packages/api-elasticsearch/__tests__/plugins/operators/not.test.ts +++ b/packages/api-elasticsearch/__tests__/plugins/operators/not.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createBlankQuery } from "../../helpers"; import { ElasticsearchBoolQueryConfig } from "~/types"; import { ElasticsearchQueryBuilderOperatorNotPlugin } from "~/plugins/operator"; diff --git a/packages/api-elasticsearch/__tests__/plugins/operators/notBetween.test.ts b/packages/api-elasticsearch/__tests__/plugins/operators/notBetween.test.ts index cd92292b6f5..9d199e10f92 100644 --- a/packages/api-elasticsearch/__tests__/plugins/operators/notBetween.test.ts +++ b/packages/api-elasticsearch/__tests__/plugins/operators/notBetween.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createBlankQuery } from "../../helpers"; import { ElasticsearchBoolQueryConfig } from "~/types"; import { ElasticsearchQueryBuilderOperatorNotBetweenPlugin } from "~/plugins/operator"; diff --git a/packages/api-elasticsearch/__tests__/plugins/operators/notContains.test.ts b/packages/api-elasticsearch/__tests__/plugins/operators/notContains.test.ts index 8815d46874a..eaf93243745 100644 --- a/packages/api-elasticsearch/__tests__/plugins/operators/notContains.test.ts +++ b/packages/api-elasticsearch/__tests__/plugins/operators/notContains.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createBlankQuery } from "../../helpers"; import { ElasticsearchBoolQueryConfig } from "~/types"; import { ElasticsearchQueryBuilderOperatorNotContainsPlugin } from "~/plugins/operator"; diff --git a/packages/api-elasticsearch/__tests__/plugins/operators/notIn.test.ts b/packages/api-elasticsearch/__tests__/plugins/operators/notIn.test.ts index 93c535c5525..52198c76743 100644 --- a/packages/api-elasticsearch/__tests__/plugins/operators/notIn.test.ts +++ b/packages/api-elasticsearch/__tests__/plugins/operators/notIn.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createBlankQuery } from "../../helpers"; import { ElasticsearchBoolQueryConfig } from "~/types"; import { ElasticsearchQueryBuilderOperatorNotInPlugin } from "~/plugins/operator"; diff --git a/packages/api-elasticsearch/__tests__/plugins/operators/notStartsWith.test.ts b/packages/api-elasticsearch/__tests__/plugins/operators/notStartsWith.test.ts index 51643f2dce4..7beef98a680 100644 --- a/packages/api-elasticsearch/__tests__/plugins/operators/notStartsWith.test.ts +++ b/packages/api-elasticsearch/__tests__/plugins/operators/notStartsWith.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createBlankQuery } from "../../helpers"; import { ElasticsearchBoolQueryConfig } from "~/types"; import { ElasticsearchQueryBuilderOperatorNotStartsWithPlugin } from "~/plugins/operator"; diff --git a/packages/api-elasticsearch/__tests__/plugins/operators/startsWith.test.ts b/packages/api-elasticsearch/__tests__/plugins/operators/startsWith.test.ts index cd3b5fba794..16c41793e7c 100644 --- a/packages/api-elasticsearch/__tests__/plugins/operators/startsWith.test.ts +++ b/packages/api-elasticsearch/__tests__/plugins/operators/startsWith.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createBlankQuery } from "../../helpers"; import { ElasticsearchBoolQueryConfig } from "~/types"; import { ElasticsearchQueryBuilderOperatorStartsWithPlugin } from "~/plugins/operator"; diff --git a/packages/api-elasticsearch/__tests__/search/base.test.ts b/packages/api-elasticsearch/__tests__/search/base.test.ts index ff1a226be66..01889f30f81 100644 --- a/packages/api-elasticsearch/__tests__/search/base.test.ts +++ b/packages/api-elasticsearch/__tests__/search/base.test.ts @@ -1,3 +1,4 @@ +import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { createElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch/createClient"; import { people } from "./base.entries"; import { getBaseConfiguration } from "~/indexConfiguration"; diff --git a/packages/api-elasticsearch/__tests__/search/japanese.test.ts b/packages/api-elasticsearch/__tests__/search/japanese.test.ts index 930bbc9863d..e625c48d37e 100644 --- a/packages/api-elasticsearch/__tests__/search/japanese.test.ts +++ b/packages/api-elasticsearch/__tests__/search/japanese.test.ts @@ -1,3 +1,4 @@ +import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { createElasticsearchClient } from "../helpers"; import { getJapaneseConfiguration } from "~/indexConfiguration"; import { ElasticsearchQueryBuilderJapaneseOperatorContainsPlugin } from "~/plugins/operator/japanese/contains"; diff --git a/packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts b/packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts index bdba608d5b3..7f37290c2f2 100644 --- a/packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts +++ b/packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts @@ -1,9 +1,9 @@ +import { describe, expect, it, vi } from "vitest"; import { createWaitUntilHealthy } from "~/utils/waitUntilHealthy"; import { createElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch/createClient"; import { ElasticsearchCatClusterHealthStatus } from "~/operations/types"; import { UnhealthyClusterError } from "~/utils/waitUntilHealthy/UnhealthyClusterError"; import { WaitingHealthyClusterAbortedError } from "~/utils/waitUntilHealthy/WaitingHealthyClusterAbortedError"; -import { jest } from "@jest/globals"; describe("wait until healthy", () => { const client = createElasticsearchClient(); @@ -84,7 +84,7 @@ describe("wait until healthy", () => { waitingTimeStep: 3 }); - const onUnhealthy = jest.fn(); + const onUnhealthy = vi.fn(); try { const { runs } = await waitUntilHealthy.wait({ @@ -110,7 +110,7 @@ describe("wait until healthy", () => { waitingTimeStep: 1 }); - const onUnhealthy = jest.fn(); + const onUnhealthy = vi.fn(); try { const { runs } = await waitUntilHealthy.wait({ @@ -136,8 +136,8 @@ describe("wait until healthy", () => { waitingTimeStep: 1 }); - const onUnhealthy = jest.fn(); - const onTimeout = jest.fn(); + const onUnhealthy = vi.fn(); + const onTimeout = vi.fn(); try { const { runs } = await waitUntilHealthy.wait({ @@ -169,8 +169,8 @@ describe("wait until healthy", () => { waitUntilHealthy.abort(); - const onUnhealthy = jest.fn(); - const onTimeout = jest.fn(); + const onUnhealthy = vi.fn(); + const onTimeout = vi.fn(); try { const { runs } = await waitUntilHealthy.wait({ @@ -201,7 +201,7 @@ describe("wait until healthy", () => { waitingTimeStep: 3 }); - const onUnhealthy = jest.fn(); + const onUnhealthy = vi.fn(); try { const { runs } = await waitUntilHealthy.wait({ diff --git a/packages/api-elasticsearch/__tests__/where.test.ts b/packages/api-elasticsearch/__tests__/where.test.ts index 0477e29dce8..614bb9442c9 100644 --- a/packages/api-elasticsearch/__tests__/where.test.ts +++ b/packages/api-elasticsearch/__tests__/where.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { parseWhereKey, ParseWhereKeyResult } from "~/where"; describe("where", () => { @@ -46,18 +47,15 @@ describe("where", () => { ] ]; - test.each(whereKeys)( - "parse should result in field and operator values - %s", - (key, expected) => { - const result = parseWhereKey(key as unknown as string); + it.each(whereKeys)("parse should result in field and operator values - %s", (key, expected) => { + const result = parseWhereKey(key as unknown as string); - expect(result).toEqual(expected); - } - ); + expect(result).toEqual(expected); + }); const malformedWhereKeys: string[][] = [["_a"], ["_"], ["__"], ["a_"]]; - test.each(malformedWhereKeys)( + it.each(malformedWhereKeys)( `should throw error when malformed key is passed "%s"`, (key: string) => { expect(() => { diff --git a/packages/api-elasticsearch/jest.config.js b/packages/api-elasticsearch/jest.config.js deleted file mode 100644 index ea14f40dfd9..00000000000 --- a/packages/api-elasticsearch/jest.config.js +++ /dev/null @@ -1,8 +0,0 @@ -const base = require("../../jest.config.base"); -const { getElasticsearchIndexPrefix } = require("@webiny/api-elasticsearch"); - -const prefix = getElasticsearchIndexPrefix(); - -process.env.ELASTIC_SEARCH_INDEX_PREFIX = `${prefix}api-elasticsearch-`; - -module.exports = base({ path: __dirname }); diff --git a/packages/api-elasticsearch/src/normalize.ts b/packages/api-elasticsearch/src/normalize.ts index 211cdcc2db7..1945984e8df 100644 --- a/packages/api-elasticsearch/src/normalize.ts +++ b/packages/api-elasticsearch/src/normalize.ts @@ -5,7 +5,7 @@ const specialCharactersToRemove = [`\\?`]; -const specialCharacterToSpace = ["-"]; +const specialCharacterToSpace = ["-", "\\\\"]; const specialCharacters = [ "\\\\", diff --git a/packages/api-elasticsearch/vitest.config.ts b/packages/api-elasticsearch/vitest.config.ts new file mode 100644 index 00000000000..bb4c9279b9d --- /dev/null +++ b/packages/api-elasticsearch/vitest.config.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname }); +}; diff --git a/packages/api-headless-cms-ddb-es/__tests__/api/entryValuesModifier.test.ts b/packages/api-headless-cms-ddb-es/__tests__/api/entryValuesModifier.test.ts index 69ea18f7a9a..b8d9e5a4517 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/api/entryValuesModifier.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/api/entryValuesModifier.test.ts @@ -4,7 +4,7 @@ * * For example, if you want to send just a title of an article into an Elasticsearch index, you can use this plugin to do so. */ - +import { describe, expect, it } from "vitest"; import { useHandler } from "~tests/graphql/handler"; import { createMockPlugins } from "~tests/converters/mocks"; import { createEntryRawData } from "~tests/converters/mocks/data"; diff --git a/packages/api-headless-cms-ddb-es/__tests__/api/missingIndex.test.ts b/packages/api-headless-cms-ddb-es/__tests__/api/missingIndex.test.ts index 9d84710dd95..4ba8c8282cc 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/api/missingIndex.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/api/missingIndex.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useHandler } from "~tests/graphql/handler"; import { createMockPlugins } from "~tests/converters/mocks"; import { createGlobalModifierPlugin } from "~tests/api/mocks/plugins"; diff --git a/packages/api-headless-cms-ddb-es/__tests__/api/mocks/result.ts b/packages/api-headless-cms-ddb-es/__tests__/api/mocks/result.ts index dbe1fc0f8b7..29751a09ae7 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/api/mocks/result.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/api/mocks/result.ts @@ -1,3 +1,5 @@ +import { expect } from "vitest"; + export const createExpectedGetResult = () => { return { values: { diff --git a/packages/api-headless-cms-ddb-es/__tests__/context/useHandler.ts b/packages/api-headless-cms-ddb-es/__tests__/context/useHandler.ts index e7c70f76528..01a358d68a7 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/context/useHandler.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/context/useHandler.ts @@ -3,7 +3,7 @@ import { createRawEventHandler, createRawHandler } from "@webiny/handler-aws"; import { CmsContext } from "~/types"; import { defaultIdentity } from "./tenancySecurity"; import { LambdaContext } from "@webiny/handler-aws/types"; -import { getElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch"; +import { getElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch/index.js"; interface CmsHandlerEvent { path: string; diff --git a/packages/api-headless-cms-ddb-es/__tests__/converters/convertersDisabled.test.ts b/packages/api-headless-cms-ddb-es/__tests__/converters/convertersDisabled.test.ts index 93f9410afa5..cac5aa30cfd 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/converters/convertersDisabled.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/converters/convertersDisabled.test.ts @@ -1,3 +1,4 @@ +import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { SearchBody } from "@webiny/api-elasticsearch/types"; import { useHandler } from "~tests/graphql/handler"; import { createMockPlugins } from "./mocks"; diff --git a/packages/api-headless-cms-ddb-es/__tests__/converters/convertersEnabled.test.ts b/packages/api-headless-cms-ddb-es/__tests__/converters/convertersEnabled.test.ts index 99b8a2eb663..b3568bce51f 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/converters/convertersEnabled.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/converters/convertersEnabled.test.ts @@ -1,3 +1,4 @@ +import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { SearchBody } from "@webiny/api-elasticsearch/types"; import { useHandler } from "~tests/graphql/handler"; import { createMockPlugins } from "./mocks"; @@ -7,9 +8,6 @@ import { CmsEntry, CmsModel } from "@webiny/api-headless-cms/types"; import { get } from "@webiny/db-dynamodb"; import { createPartitionKey } from "~/operations/entry/keys"; import lodashMerge from "lodash/merge"; -import { jest } from "@jest/globals"; - -jest.retryTimes(0); describe("storage field path converters enabled", () => { const { elasticsearch, entryEntity } = useHandler(); diff --git a/packages/api-headless-cms-ddb-es/__tests__/elasticsearchIndex.test.ts b/packages/api-headless-cms-ddb-es/__tests__/elasticsearchIndex.test.ts index d6bbddd1e5a..22e9f2daa9d 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/elasticsearchIndex.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/elasticsearchIndex.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { configurations } from "~/configurations"; import { CmsModel } from "@webiny/api-headless-cms/types"; import { getElasticsearchIndexPrefix } from "@webiny/api-elasticsearch"; diff --git a/packages/api-headless-cms-ddb-es/__tests__/entryIndexing.test.ts b/packages/api-headless-cms-ddb-es/__tests__/entryIndexing.test.ts index f1940bf84ec..5cd5b0710f7 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/entryIndexing.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/entryIndexing.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { PluginsContainer } from "@webiny/plugins"; import indexingPlugins from "~/elasticsearch/indexing"; import { createGraphQLFields } from "@webiny/api-headless-cms"; @@ -147,7 +148,7 @@ const mockIndexedEntry: Partial & Record = { const plugins = new PluginsContainer([...indexingPlugins(), ...createGraphQLFields()]); describe("entryIndexing", () => { - test("should prepare entry for indexing", () => { + it("should prepare entry for indexing", () => { const entryToIndex = prepareEntryToIndex({ entry: mockInputEntry as CmsEntry, storageEntry: mockInputEntry as CmsEntry, @@ -158,7 +159,7 @@ describe("entryIndexing", () => { expect(entryToIndex).toEqual(mockIndexedEntry); }); - test("should extract original entry from indexed data", () => { + it("should extract original entry from indexed data", () => { const [entryFromIndex] = extractEntriesFromIndex({ model: mockModel as unknown as CmsModel, plugins, diff --git a/packages/api-headless-cms-ddb-es/__tests__/filtering.test.ts b/packages/api-headless-cms-ddb-es/__tests__/filtering.test.ts index f33346d27da..37ced765a6d 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/filtering.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/filtering.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsEntryListWhere } from "@webiny/api-headless-cms/types"; import { ElasticsearchBoolQueryConfig } from "@webiny/api-elasticsearch/types"; import { createPluginsContainer, createQuery } from "./filtering/mocks"; diff --git a/packages/api-headless-cms-ddb-es/__tests__/filtering/between.test.ts b/packages/api-headless-cms-ddb-es/__tests__/filtering/between.test.ts index eb9a890e5a7..13d2dcf3334 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/filtering/between.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/filtering/between.test.ts @@ -1,6 +1,7 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsEntryListWhere } from "@webiny/api-headless-cms/types"; import { ElasticsearchBoolQueryConfig } from "@webiny/api-elasticsearch/types"; -import { createQuery, Query, createPluginsContainer } from "./mocks"; +import { createPluginsContainer, createQuery, Query } from "./mocks"; import { createExecFiltering, CreateExecFilteringResponse } from "./mocks/filtering"; describe("between filter", () => { diff --git a/packages/api-headless-cms-ddb-es/__tests__/filtering/contains.test.ts b/packages/api-headless-cms-ddb-es/__tests__/filtering/contains.test.ts index 8630e69ee7a..cb0af8fd212 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/filtering/contains.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/filtering/contains.test.ts @@ -1,6 +1,7 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsEntryListWhere } from "@webiny/api-headless-cms/types"; import { ElasticsearchBoolQueryConfig } from "@webiny/api-elasticsearch/types"; -import { createQuery, Query, createPluginsContainer } from "./mocks"; +import { createPluginsContainer, createQuery, Query } from "./mocks"; import { normalizeValue } from "@webiny/api-elasticsearch"; import { createExecFiltering, CreateExecFilteringResponse } from "./mocks/filtering"; diff --git a/packages/api-headless-cms-ddb-es/__tests__/filtering/eq.test.ts b/packages/api-headless-cms-ddb-es/__tests__/filtering/eq.test.ts index 5c1d1b91f80..cb82466dd4e 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/filtering/eq.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/filtering/eq.test.ts @@ -1,7 +1,8 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsEntryListWhere } from "@webiny/api-headless-cms/types"; import { CreateExecFilteringResponse } from "~/operations/entry/elasticsearch/filtering"; import { ElasticsearchBoolQueryConfig } from "@webiny/api-elasticsearch/types"; -import { createQuery, Query, createPluginsContainer } from "./mocks"; +import { createPluginsContainer, createQuery, Query } from "./mocks"; import { createExecFiltering } from "./mocks/filtering"; describe("equals filter", () => { diff --git a/packages/api-headless-cms-ddb-es/__tests__/filtering/gt.test.ts b/packages/api-headless-cms-ddb-es/__tests__/filtering/gt.test.ts index a4bd14f0407..1b2632aa5ec 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/filtering/gt.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/filtering/gt.test.ts @@ -1,6 +1,7 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsEntryListWhere } from "@webiny/api-headless-cms/types"; import { ElasticsearchBoolQueryConfig } from "@webiny/api-elasticsearch/types"; -import { createQuery, Query, createPluginsContainer } from "./mocks"; +import { createPluginsContainer, createQuery, Query } from "./mocks"; import { CreateExecFilteringResponse } from "~/operations/entry/elasticsearch/filtering"; import { createExecFiltering } from "./mocks/filtering"; diff --git a/packages/api-headless-cms-ddb-es/__tests__/filtering/gte.test.ts b/packages/api-headless-cms-ddb-es/__tests__/filtering/gte.test.ts index 0e1f5296f3f..195ddb5e1a5 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/filtering/gte.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/filtering/gte.test.ts @@ -1,6 +1,7 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsEntryListWhere } from "@webiny/api-headless-cms/types"; import { ElasticsearchBoolQueryConfig } from "@webiny/api-elasticsearch/types"; -import { createQuery, Query, createPluginsContainer } from "./mocks"; +import { createPluginsContainer, createQuery, Query } from "./mocks"; import { CreateExecFilteringResponse } from "~/operations/entry/elasticsearch/filtering"; import { createExecFiltering } from "./mocks/filtering"; diff --git a/packages/api-headless-cms-ddb-es/__tests__/filtering/in.test.ts b/packages/api-headless-cms-ddb-es/__tests__/filtering/in.test.ts index 6280734eeba..64065186544 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/filtering/in.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/filtering/in.test.ts @@ -1,6 +1,7 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsEntryListWhere } from "@webiny/api-headless-cms/types"; import { ElasticsearchBoolQueryConfig } from "@webiny/api-elasticsearch/types"; -import { createQuery, Query, createPluginsContainer } from "./mocks"; +import { createPluginsContainer, createQuery, Query } from "./mocks"; import { CreateExecFilteringResponse } from "~/operations/entry/elasticsearch/filtering"; import { createExecFiltering } from "./mocks/filtering"; diff --git a/packages/api-headless-cms-ddb-es/__tests__/filtering/lt.test.ts b/packages/api-headless-cms-ddb-es/__tests__/filtering/lt.test.ts index 52fb2728e6b..e7f59aa80f3 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/filtering/lt.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/filtering/lt.test.ts @@ -1,6 +1,7 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsEntryListWhere } from "@webiny/api-headless-cms/types"; import { ElasticsearchBoolQueryConfig } from "@webiny/api-elasticsearch/types"; -import { createQuery, Query, createPluginsContainer } from "./mocks"; +import { createPluginsContainer, createQuery, Query } from "./mocks"; import { CreateExecFilteringResponse } from "~/operations/entry/elasticsearch/filtering"; import { createExecFiltering } from "./mocks/filtering"; diff --git a/packages/api-headless-cms-ddb-es/__tests__/filtering/lte.test.ts b/packages/api-headless-cms-ddb-es/__tests__/filtering/lte.test.ts index aaac174d12d..baf8d9adcf1 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/filtering/lte.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/filtering/lte.test.ts @@ -1,7 +1,8 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsEntryListWhere } from "@webiny/api-headless-cms/types"; import { CreateExecFilteringResponse } from "~/operations/entry/elasticsearch/filtering"; import { ElasticsearchBoolQueryConfig } from "@webiny/api-elasticsearch/types"; -import { createQuery, Query, createPluginsContainer } from "./mocks"; +import { createPluginsContainer, createQuery, Query } from "./mocks"; import { createExecFiltering } from "./mocks/filtering"; describe("lesser than or equal filter", () => { diff --git a/packages/api-headless-cms-ddb-es/__tests__/filtering/not_between.test.ts b/packages/api-headless-cms-ddb-es/__tests__/filtering/not_between.test.ts index d88bf352eaf..da5e66bab84 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/filtering/not_between.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/filtering/not_between.test.ts @@ -1,6 +1,7 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsEntryListWhere } from "@webiny/api-headless-cms/types"; import { ElasticsearchBoolQueryConfig } from "@webiny/api-elasticsearch/types"; -import { createQuery, Query, createPluginsContainer } from "./mocks"; +import { createPluginsContainer, createQuery, Query } from "./mocks"; import { createExecFiltering, CreateExecFilteringResponse } from "./mocks/filtering"; describe("not_between filter", () => { diff --git a/packages/api-headless-cms-ddb-es/__tests__/filtering/not_contains.test.ts b/packages/api-headless-cms-ddb-es/__tests__/filtering/not_contains.test.ts index f1087b64bd6..c7468d9d104 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/filtering/not_contains.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/filtering/not_contains.test.ts @@ -1,7 +1,8 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsEntryListWhere } from "@webiny/api-headless-cms/types"; import { CreateExecFilteringResponse } from "~/operations/entry/elasticsearch/filtering"; import { ElasticsearchBoolQueryConfig } from "@webiny/api-elasticsearch/types"; -import { createQuery, Query, createPluginsContainer } from "./mocks"; +import { createPluginsContainer, createQuery, Query } from "./mocks"; import { normalizeValue } from "@webiny/api-elasticsearch"; import { createExecFiltering } from "./mocks/filtering"; diff --git a/packages/api-headless-cms-ddb-es/__tests__/filtering/not_eq.test.ts b/packages/api-headless-cms-ddb-es/__tests__/filtering/not_eq.test.ts index 6d812555798..400c97f8e4e 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/filtering/not_eq.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/filtering/not_eq.test.ts @@ -1,6 +1,7 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsEntryListWhere } from "@webiny/api-headless-cms/types"; import { ElasticsearchBoolQueryConfig } from "@webiny/api-elasticsearch/types"; -import { createQuery, Query, createPluginsContainer } from "./mocks"; +import { createPluginsContainer, createQuery, Query } from "./mocks"; import { CreateExecFilteringResponse } from "~/operations/entry/elasticsearch/filtering"; import { createExecFiltering } from "./mocks/filtering"; diff --git a/packages/api-headless-cms-ddb-es/__tests__/filtering/not_in.test.ts b/packages/api-headless-cms-ddb-es/__tests__/filtering/not_in.test.ts index f8b6c7f9cef..f3eeba82446 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/filtering/not_in.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/filtering/not_in.test.ts @@ -1,6 +1,7 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsEntryListWhere } from "@webiny/api-headless-cms/types"; import { ElasticsearchBoolQueryConfig } from "@webiny/api-elasticsearch/types"; -import { createQuery, Query, createPluginsContainer } from "./mocks"; +import { createPluginsContainer, createQuery, Query } from "./mocks"; import { createExecFiltering, CreateExecFilteringResponse } from "./mocks/filtering"; describe("not_in filter", () => { diff --git a/packages/api-headless-cms-ddb-es/__tests__/filtering/not_startsWith.test.ts b/packages/api-headless-cms-ddb-es/__tests__/filtering/not_startsWith.test.ts index bdc58c55db0..a87f310da91 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/filtering/not_startsWith.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/filtering/not_startsWith.test.ts @@ -1,6 +1,7 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsEntryListWhere } from "@webiny/api-headless-cms/types"; import { ElasticsearchBoolQueryConfig } from "@webiny/api-elasticsearch/types"; -import { createQuery, Query, createPluginsContainer } from "./mocks"; +import { createPluginsContainer, createQuery, Query } from "./mocks"; import { createExecFiltering, CreateExecFilteringResponse } from "./mocks/filtering"; describe("not startsWith filter", () => { diff --git a/packages/api-headless-cms-ddb-es/__tests__/filtering/startsWith.test.ts b/packages/api-headless-cms-ddb-es/__tests__/filtering/startsWith.test.ts index e0e80f4a32a..0084bc883dd 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/filtering/startsWith.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/filtering/startsWith.test.ts @@ -1,6 +1,7 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { CmsEntryListWhere } from "@webiny/api-headless-cms/types"; import { ElasticsearchBoolQueryConfig } from "@webiny/api-elasticsearch/types"; -import { createQuery, Query, createPluginsContainer } from "./mocks"; +import { createPluginsContainer, createQuery, Query } from "./mocks"; import { createExecFiltering, CreateExecFilteringResponse } from "./mocks/filtering"; describe("startsWith filter", () => { diff --git a/packages/api-headless-cms-ddb-es/__tests__/graphql/handler.ts b/packages/api-headless-cms-ddb-es/__tests__/graphql/handler.ts index ed4937ebd97..0a0bc635f95 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/graphql/handler.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/graphql/handler.ts @@ -12,7 +12,7 @@ import { createIndexConfigurationPlugin } from "~tests/graphql/createIndexConfig import { getStorageOps } from "@webiny/project-utils/testing/environment"; import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; import { HeadlessCmsStorageOperations } from "@webiny/api-headless-cms/types"; -import { getElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch/getElasticsearchClient"; +import { getElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch/index.js"; import { createTable } from "~/definitions/table"; import { createEntryEntity } from "~/definitions/entry"; import { LambdaContext } from "@webiny/handler-aws/types"; diff --git a/packages/api-headless-cms-ddb-es/__tests__/graphql/index/create.test.ts b/packages/api-headless-cms-ddb-es/__tests__/graphql/index/create.test.ts index c05425f09c1..66bdbeb267e 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/graphql/index/create.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/graphql/index/create.test.ts @@ -1,3 +1,4 @@ +import { afterAll, describe, expect, it } from "vitest"; import { useHandler } from "~tests/graphql/handler"; import { CmsContext } from "~/types"; import { createCmsModel } from "@webiny/api-headless-cms"; diff --git a/packages/api-headless-cms-ddb-es/__tests__/plugins/CmsEntryElasticsearchValuesModifier.test.ts b/packages/api-headless-cms-ddb-es/__tests__/plugins/CmsEntryElasticsearchValuesModifier.test.ts index f28dbdbdf46..657c9c4919f 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/plugins/CmsEntryElasticsearchValuesModifier.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/plugins/CmsEntryElasticsearchValuesModifier.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createCmsEntryElasticsearchValuesModifier } from "~/plugins"; import { CmsEntry, CmsIdentity, CmsModel } from "@webiny/api-headless-cms/types"; @@ -51,7 +52,7 @@ const mockEntry: CmsEntry = { savedOn: new Date().toISOString(), modelId: mockModel.modelId, version: 1 -}; +} as CmsEntry; const getMockData = () => { return { @@ -76,6 +77,7 @@ describe("entry values modifier", () => { } ); + // @ts-expect-error values = await modifier.modify({ entry, model, @@ -101,6 +103,7 @@ describe("entry values modifier", () => { } ); + // @ts-expect-error values = await titleModifier.modify({ entry, model, @@ -123,6 +126,7 @@ describe("entry values modifier", () => { } ); + // @ts-expect-error values = await ageModifier.modify({ entry, model, diff --git a/packages/api-headless-cms-ddb-es/__tests__/plugins/dynamoDb/storage/longText.test.ts b/packages/api-headless-cms-ddb-es/__tests__/plugins/dynamoDb/storage/longText.test.ts index 16b12118186..03597782bdb 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/plugins/dynamoDb/storage/longText.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/plugins/dynamoDb/storage/longText.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createLongTextStorageTransformPlugin } from "~/dynamoDb/storage/longText"; import { FromStorageParams, StorageTransformPlugin } from "@webiny/api-headless-cms"; import { createStoragePluginsContainer } from "./plugins"; diff --git a/packages/api-headless-cms-ddb-es/__tests__/plugins/dynamoDb/storage/richText.test.ts b/packages/api-headless-cms-ddb-es/__tests__/plugins/dynamoDb/storage/richText.test.ts index e81f292a1e1..44621552e45 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/plugins/dynamoDb/storage/richText.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/plugins/dynamoDb/storage/richText.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { createRichTextStorageTransformPlugin } from "~/dynamoDb/storage/richText"; import { FromStorageParams, ToStorageParams } from "@webiny/api-headless-cms"; import { compress, getContextWithCompressor } from "~tests/mocks/compressor"; @@ -56,7 +57,7 @@ describe("richTextStoragePlugin", () => { context = getContextWithCompressor(); }); - test("toStorage should transform value for storage", async () => { + it("toStorage should transform value for storage", async () => { const plugin = createRichTextStorageTransformPlugin(); const result = await plugin.toStorage({ @@ -71,7 +72,7 @@ describe("richTextStoragePlugin", () => { }); }); - test("fromStorage should transform value for output", async () => { + it("fromStorage should transform value for output", async () => { const value = { compression: "gzip", value: expectedCompressedValue diff --git a/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/dateTimeIndexing.test.ts b/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/dateTimeIndexing.test.ts index d95a556eca6..7d28d03c9fd 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/dateTimeIndexing.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/dateTimeIndexing.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import dateTimeIndexing from "~/elasticsearch/indexing/dateTimeIndexing"; import { CmsModelFieldToElasticsearchPlugin } from "~/types"; import { diff --git a/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/defaultFieldIndexing.test.ts b/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/defaultFieldIndexing.test.ts index e9bf71c2589..293f9ee7b45 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/defaultFieldIndexing.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/defaultFieldIndexing.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import defaultFieldIndexPlugin from "~/elasticsearch/indexing/defaultFieldIndexing"; import { createGraphQLFields } from "@webiny/api-headless-cms"; import { CmsEntry, CmsModel, CmsModelFieldToGraphQLPlugin } from "@webiny/api-headless-cms/types"; @@ -65,7 +66,7 @@ const getFieldTypePlugin = (fieldType: string) => { }; describe("defaultFieldIndexPlugin", () => { - test("toIndex should return transformed objects", () => { + it("toIndex should return transformed objects", () => { const plugin = defaultFieldIndexPlugin() as Required; const result = mockModel.fields.reduce( @@ -96,7 +97,7 @@ describe("defaultFieldIndexPlugin", () => { expect(result).toEqual(mockIndexedEntry); }); - test("fromIndex should return transformed objects", () => { + it("fromIndex should return transformed objects", () => { const plugin = defaultFieldIndexPlugin() as Required; const result = mockModel.fields.reduce((entry: any, field) => { const value = plugin.fromIndex({ diff --git a/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/numberIndexing.test.ts b/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/numberIndexing.test.ts index 86edc782628..1a19fad2828 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/numberIndexing.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/numberIndexing.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import numberIndexing from "~/elasticsearch/indexing/numberIndexing"; import { CmsModelFieldToElasticsearchFromParams, @@ -24,7 +25,7 @@ describe("numberIndexing", () => { ["15.4300023", "15.4300021"] ] ]; - test.each(numbers)("toIndex should transform %j to %j", (num: any, expected: any) => { + it.each(numbers)("toIndex should transform %j to %j", (num: any, expected: any) => { const field: any = { storageId: "number" }; @@ -52,7 +53,7 @@ describe("numberIndexing", () => { [15.4300023, 15.4300021] ] ]; - test.each(strings)("fromIndex should transform %j back to %j", (str: any, expected: any) => { + it.each(strings)("fromIndex should transform %j back to %j", (str: any, expected: any) => { const field: any = { storageId: "number" }; diff --git a/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/objectIndexing.test.ts b/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/objectIndexing.test.ts index 6468d2079b7..045211170a2 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/objectIndexing.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/objectIndexing.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createGraphQLFields } from "@webiny/api-headless-cms"; import defaultIndexingPlugin from "~/elasticsearch/indexing/defaultFieldIndexing"; import objectIndexing from "~/elasticsearch/indexing/objectIndexing"; @@ -171,7 +172,7 @@ const expectedRawValue = { }; describe("objectIndexing", () => { - test("toIndex should recursively transform an object", () => { + it("toIndex should recursively transform an object", () => { const plugin = objectIndexing() as Required; const result = plugin.toIndex({ value: input, @@ -187,7 +188,7 @@ describe("objectIndexing", () => { expect(result.rawValue).toEqual(expectedRawValue); }); - test("fromIndex should recursively transform an object", () => { + it("fromIndex should recursively transform an object", () => { const plugin = objectIndexing() as Required; const result = plugin.fromIndex({ value: expectedValue, diff --git a/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/richTextIndexing.test.ts b/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/richTextIndexing.test.ts index f58ddbc683b..751ab5cc0b5 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/richTextIndexing.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/indexing/richTextIndexing.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import richTextIndexingPlugin from "~/elasticsearch/indexing/richTextIndexing"; import { CmsModelField, CmsModelFieldToGraphQLPlugin } from "@webiny/api-headless-cms/types"; import { PluginsContainer } from "@webiny/plugins"; @@ -40,7 +41,7 @@ const getFieldIndexPlugin = () => { }; describe("richTextIndexing", () => { - test("toIndex should return transformed objects", () => { + it("toIndex should return transformed objects", () => { const plugin = richTextIndexingPlugin() as Required; const result = plugin.toIndex({ @@ -59,7 +60,7 @@ describe("richTextIndexing", () => { }); }); - test("fromIndex should return transformed objects", () => { + it("fromIndex should return transformed objects", () => { const plugin = richTextIndexingPlugin() as Required; const result = plugin.fromIndex({ value: undefined, diff --git a/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/search/timeSearch.test.ts b/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/search/timeSearch.test.ts index bc66d01ce8d..7ab5f24a90f 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/search/timeSearch.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearch/search/timeSearch.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createTimeSearchPlugin } from "~/elasticsearch/search/timeSearch"; import { TransformCallableParams } from "~/plugins"; @@ -21,7 +22,7 @@ describe("timeSearch", () => { ["13:45:55", 49555], ["23:59:59", 86399] ]; - test.each(correctValues)("should transform value correctly", (value, expected) => { + it.each(correctValues)("should transform value correctly", (value, expected) => { const result = plugin.transform({ field: timeField, value diff --git a/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearchSortModifier.test.ts b/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearchSortModifier.test.ts index ebc86d212f8..69c1e5bf6f0 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearchSortModifier.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/plugins/elasticsearchSortModifier.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { Sort } from "@webiny/api-elasticsearch/types"; import { CmsEntryElasticsearchSortModifierPlugin } from "~/plugins"; import { CmsModel } from "@webiny/api-headless-cms/types"; @@ -11,6 +12,7 @@ describe("Elasticsearch sort modifier plugin", () => { if (typeof sort !== "object") { return; } + // @ts-expect-error sort["newField"] = { order: "asc" }; @@ -46,8 +48,10 @@ describe("Elasticsearch sort modifier plugin", () => { } for (const key in sort) { + // @ts-expect-error delete sort[key]; } + // @ts-expect-error sort["_script"] = { type: "number", script: { diff --git a/packages/api-headless-cms-ddb-es/__tests__/tasks/createIndexTask.test.ts b/packages/api-headless-cms-ddb-es/__tests__/tasks/createIndexTask.test.ts index 55abcf3ce9f..931c6be8cbf 100644 --- a/packages/api-headless-cms-ddb-es/__tests__/tasks/createIndexTask.test.ts +++ b/packages/api-headless-cms-ddb-es/__tests__/tasks/createIndexTask.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useHandler } from "~tests/context/useHandler"; import { createMockModels } from "./mocks/models"; import { CreateElasticsearchIndexTaskPlugin } from "@webiny/api-elasticsearch-tasks"; diff --git a/packages/api-headless-cms-ddb-es/jest.setup.js b/packages/api-headless-cms-ddb-es/jest.setup.js deleted file mode 100644 index 049095053ae..00000000000 --- a/packages/api-headless-cms-ddb-es/jest.setup.js +++ /dev/null @@ -1,11 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-headless-cms-ddb-es/package.json b/packages/api-headless-cms-ddb-es/package.json index 8a243af62ed..800c6074f63 100644 --- a/packages/api-headless-cms-ddb-es/package.json +++ b/packages/api-headless-cms-ddb-es/package.json @@ -56,7 +56,6 @@ "@webiny/handler-graphql": "0.0.0", "@webiny/project-utils": "0.0.0", "@webiny/tasks": "0.0.0", - "jest": "^29.7.0", "jest-dynalite": "^3.6.1", "prettier": "^2.8.8", "rimraf": "^6.0.1", diff --git a/packages/api-headless-cms-ddb-es/vitest.setup.ts b/packages/api-headless-cms-ddb-es/vitest.setup.ts new file mode 100644 index 00000000000..3302506843c --- /dev/null +++ b/packages/api-headless-cms-ddb-es/vitest.setup.ts @@ -0,0 +1,13 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ path: import.meta.dirname, presets }); +}; diff --git a/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/createExpressions.test.ts b/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/createExpressions.test.ts index b3716d08042..4f3f1e7f696 100644 --- a/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/createExpressions.test.ts +++ b/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/createExpressions.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { createExpressions, Expression } from "~/operations/entry/filtering/createExpressions"; import { PluginsContainer } from "@webiny/plugins"; import { Field } from "~/operations/entry/filtering/types"; diff --git a/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/createFields.test.ts b/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/createFields.test.ts index 7d11c120121..569334142c9 100644 --- a/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/createFields.test.ts +++ b/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/createFields.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { createFields } from "~/operations/entry/filtering/createFields"; import { PluginsContainer } from "@webiny/plugins"; import { CmsModel } from "@webiny/api-headless-cms/types"; diff --git a/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/createFilters.test.ts b/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/createFilters.test.ts index 18b74cd9b44..f8b3f238825 100644 --- a/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/createFilters.test.ts +++ b/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/createFilters.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { createExpressions, Expression } from "~/operations/entry/filtering/createExpressions"; import { PluginsContainer } from "@webiny/plugins"; import { CmsModel } from "@webiny/api-headless-cms/types"; diff --git a/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/filter.test.ts b/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/filter.test.ts index e279200003b..7f049c6e67e 100644 --- a/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/filter.test.ts +++ b/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/filter.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { createEntries } from "./mocks/entry.model"; import { createExpressions, Expression } from "~/operations/entry/filtering/createExpressions"; import { PluginsContainer } from "@webiny/plugins"; diff --git a/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/getValue.test.ts b/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/getValue.test.ts index 69b9713da9a..3de33fc135f 100644 --- a/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/getValue.test.ts +++ b/packages/api-headless-cms-ddb/__tests__/operations/entry/filtering/getValue.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { getValue } from "~/operations/entry/filtering/getValue"; import { createEntry } from "./mocks/entry.noModel"; diff --git a/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/path/plainObject.test.ts b/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/path/plainObject.test.ts index 47b5b6f1b6e..d289d0bd37a 100644 --- a/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/path/plainObject.test.ts +++ b/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/path/plainObject.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { CmsModelField } from "@webiny/api-headless-cms/types"; import { createPlainObjectPathPlugin } from "~/dynamoDb/path/plainObject"; diff --git a/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/storage/longText.test.ts b/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/storage/longText.test.ts index 16b12118186..03597782bdb 100644 --- a/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/storage/longText.test.ts +++ b/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/storage/longText.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createLongTextStorageTransformPlugin } from "~/dynamoDb/storage/longText"; import { FromStorageParams, StorageTransformPlugin } from "@webiny/api-headless-cms"; import { createStoragePluginsContainer } from "./plugins"; diff --git a/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/storage/richText.test.ts b/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/storage/richText.test.ts index 2452d84bfe7..7db0306c0fa 100644 --- a/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/storage/richText.test.ts +++ b/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/storage/richText.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { createRichTextStorageTransformPlugin } from "~/dynamoDb/storage/richText"; import { FromStorageParams, ToStorageParams } from "@webiny/api-headless-cms"; import { Context } from "@webiny/api/types"; @@ -54,7 +55,7 @@ describe("richTextStoragePlugin", () => { context = getContextWithCompressor(); }); - test("toStorage should transform value for storage", async () => { + it("toStorage should transform value for storage", async () => { const plugin = createRichTextStorageTransformPlugin(); const result = await plugin.toStorage({ @@ -69,7 +70,7 @@ describe("richTextStoragePlugin", () => { }); }); - test("fromStorage should transform value for output", async () => { + it("fromStorage should transform value for output", async () => { const value = { compression: "gzip", value: expectedCompressedValue diff --git a/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/transformValue/datetime.test.ts b/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/transformValue/datetime.test.ts index 1c4463cf51c..25cca8144a5 100644 --- a/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/transformValue/datetime.test.ts +++ b/packages/api-headless-cms-ddb/__tests__/plugins/dynamoDb/transformValue/datetime.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createDatetimeTransformValuePlugin } from "~/dynamoDb/transformValue/datetime"; import { CmsModelField } from "@webiny/api-headless-cms/types"; @@ -22,7 +23,7 @@ describe("dynamodb transform datetime", () => { ["13:57.481", "time", 50220481], ["13:57:22.581", "time", 50242581] ]; - test.each(correctValues)( + it.each(correctValues)( "should transform date or time into the milliseconds - %s", (value: Date | string, fieldType: string, expected: number) => { const plugin = createDatetimeTransformValuePlugin(); @@ -48,7 +49,7 @@ describe("dynamodb transform datetime", () => { [true] ]; - test.each(incorrectTimeValues)( + it.each(incorrectTimeValues)( "should throw an error when trying to transform time field but value is not a string or a number", value => { expect.assertions(1); diff --git a/packages/api-headless-cms-ddb/jest.config.js b/packages/api-headless-cms-ddb/jest.config.js deleted file mode 100644 index 77431ed6900..00000000000 --- a/packages/api-headless-cms-ddb/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import base from "../../jest.config.base.js"; - -export default async () => { - return base({ path: import.meta.dirname }); -}; diff --git a/packages/api-headless-cms-ddb/package.json b/packages/api-headless-cms-ddb/package.json index ae4a33981cf..37455bf049f 100644 --- a/packages/api-headless-cms-ddb/package.json +++ b/packages/api-headless-cms-ddb/package.json @@ -39,7 +39,6 @@ "@webiny/build-tools": "0.0.0", "@webiny/plugins": "0.0.0", "@webiny/project-utils": "0.0.0", - "jest": "^29.7.0", "jest-dynalite": "^3.6.1", "typescript": "5.3.3" }, diff --git a/packages/api-headless-cms-ddb/vitest.setup.ts b/packages/api-headless-cms-ddb/vitest.setup.ts new file mode 100644 index 00000000000..bb4c9279b9d --- /dev/null +++ b/packages/api-headless-cms-ddb/vitest.setup.ts @@ -0,0 +1,5 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + return createTestConfig({ path: import.meta.dirname }); +}; diff --git a/packages/project-utils/package.json b/packages/project-utils/package.json index 481c63fad89..03ec31e1e52 100644 --- a/packages/project-utils/package.json +++ b/packages/project-utils/package.json @@ -24,6 +24,7 @@ "load-json-file": "6.2.0", "pino": "^8.21.0", "pino-pretty": "^9.4.0", + "vitest": "^3.2.4", "yargs": "^17.7.2" }, "peerDependencies": { diff --git a/packages/project-utils/testing/elasticsearch/getElasticsearchClient.ts b/packages/project-utils/testing/elasticsearch/getElasticsearchClient.ts index f3c40045b4c..6368658f86d 100644 --- a/packages/project-utils/testing/elasticsearch/getElasticsearchClient.ts +++ b/packages/project-utils/testing/elasticsearch/getElasticsearchClient.ts @@ -1,3 +1,4 @@ +import { expect } from "vitest"; import path from "path"; import { ContextPlugin } from "@webiny/api"; import elasticsearchClientContextPlugin, { diff --git a/tsconfig.build.json b/tsconfig.build.json index 2c330cf49f1..8e6705997b9 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -1,6 +1,7 @@ { "compilerOptions": { "target": "esnext", + "skipLibCheck": true, "allowJs": true, "forceConsistentCasingInFileNames": true, "allowSyntheticDefaultImports": true, diff --git a/yarn.lock b/yarn.lock index 502e4a325fe..30ae66cec11 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14326,7 +14326,6 @@ __metadata: "@webiny/tasks": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" dataloader: "npm:^2.2.2" - jest: "npm:^29.7.0" jest-dynalite: "npm:^3.6.1" lodash: "npm:^4.17.21" prettier: "npm:^2.8.8" @@ -14351,7 +14350,6 @@ __metadata: "@webiny/utils": "npm:0.0.0" dataloader: "npm:^2.2.2" dot-prop: "npm:^6.0.1" - jest: "npm:^29.7.0" jest-dynalite: "npm:^3.6.1" lodash: "npm:^4.17.21" typescript: "npm:5.3.3" @@ -17146,6 +17144,7 @@ __metadata: url: "npm:^0.11.4" url-loader: "npm:4.1.1" utf-8-validate: "npm:>=5.0.2" + vitest: "npm:^3.2.4" vm-browserify: "npm:^1.1.2" webpack: "npm:^5.97.0" webpack-dev-server: "npm:^4.15.2" From 7049d5d9e2bc0ef63c2417af6988501d545a1bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Zori=C4=87?= Date: Mon, 8 Sep 2025 14:36:44 +0200 Subject: [PATCH 06/13] test(api-elasticsearch-tasks): convert to vitest --- .../__tests__/settings/indexManager.test.ts | 1 + .../createIndexes/createIndexesTaskRunner.test.ts | 1 + .../ElasticsearchToDynamoDbSynchronization.test.ts | 1 + .../dataSynchronizationTask.test.ts | 1 + .../__tests__/tasks/reindexing/reindexing.test.ts | 1 + .../reindexing/reindexingTaskDefinition.test.ts | 1 + .../tasks/reindexing/reindexingTaskRunner.test.ts | 11 ++++++++--- packages/api-elasticsearch-tasks/jest.setup.js | 12 ------------ packages/api-elasticsearch-tasks/vitest.setup.ts | 14 ++++++++++++++ 9 files changed, 28 insertions(+), 15 deletions(-) delete mode 100644 packages/api-elasticsearch-tasks/jest.setup.js create mode 100644 packages/api-elasticsearch-tasks/vitest.setup.ts diff --git a/packages/api-elasticsearch-tasks/__tests__/settings/indexManager.test.ts b/packages/api-elasticsearch-tasks/__tests__/settings/indexManager.test.ts index 554ccaafd4e..d5a084ee79f 100644 --- a/packages/api-elasticsearch-tasks/__tests__/settings/indexManager.test.ts +++ b/packages/api-elasticsearch-tasks/__tests__/settings/indexManager.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { IndexManager } from "~/settings"; import { createElasticsearchClientMock, indexSettings } from "~tests/mocks/elasticsearch"; diff --git a/packages/api-elasticsearch-tasks/__tests__/tasks/createIndexes/createIndexesTaskRunner.test.ts b/packages/api-elasticsearch-tasks/__tests__/tasks/createIndexes/createIndexesTaskRunner.test.ts index 2f06298e0bb..b4ae156e3dd 100644 --- a/packages/api-elasticsearch-tasks/__tests__/tasks/createIndexes/createIndexesTaskRunner.test.ts +++ b/packages/api-elasticsearch-tasks/__tests__/tasks/createIndexes/createIndexesTaskRunner.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { Manager } from "~/tasks/Manager"; import { createContextMock } from "~tests/mocks/context"; import { createTaskManagerStoreMock } from "~tests/mocks/store"; diff --git a/packages/api-elasticsearch-tasks/__tests__/tasks/dataSynchronization/ElasticsearchToDynamoDbSynchronization.test.ts b/packages/api-elasticsearch-tasks/__tests__/tasks/dataSynchronization/ElasticsearchToDynamoDbSynchronization.test.ts index ad54873fc86..dafbe4fe770 100644 --- a/packages/api-elasticsearch-tasks/__tests__/tasks/dataSynchronization/ElasticsearchToDynamoDbSynchronization.test.ts +++ b/packages/api-elasticsearch-tasks/__tests__/tasks/dataSynchronization/ElasticsearchToDynamoDbSynchronization.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { ElasticsearchToDynamoDbSynchronization } from "~/tasks/dataSynchronization/elasticsearch/ElasticsearchToDynamoDbSynchronization"; import { useHandler } from "~tests/helpers/useHandler"; import { createManagers } from "./managers"; diff --git a/packages/api-elasticsearch-tasks/__tests__/tasks/dataSynchronization/dataSynchronizationTask.test.ts b/packages/api-elasticsearch-tasks/__tests__/tasks/dataSynchronization/dataSynchronizationTask.test.ts index 0709c6650f7..e010bdfc94a 100644 --- a/packages/api-elasticsearch-tasks/__tests__/tasks/dataSynchronization/dataSynchronizationTask.test.ts +++ b/packages/api-elasticsearch-tasks/__tests__/tasks/dataSynchronization/dataSynchronizationTask.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createDataSynchronization, DATA_SYNCHRONIZATION_TASK } from "~/tasks"; import { TaskDefinitionPlugin, TaskResponseStatus } from "@webiny/tasks"; import { createRunner } from "@webiny/project-utils/testing/tasks"; diff --git a/packages/api-elasticsearch-tasks/__tests__/tasks/reindexing/reindexing.test.ts b/packages/api-elasticsearch-tasks/__tests__/tasks/reindexing/reindexing.test.ts index 30bea2927ff..6adbc1783c6 100644 --- a/packages/api-elasticsearch-tasks/__tests__/tasks/reindexing/reindexing.test.ts +++ b/packages/api-elasticsearch-tasks/__tests__/tasks/reindexing/reindexing.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; /** * Tests in this file will use real data and Elasticsearch instance. */ diff --git a/packages/api-elasticsearch-tasks/__tests__/tasks/reindexing/reindexingTaskDefinition.test.ts b/packages/api-elasticsearch-tasks/__tests__/tasks/reindexing/reindexingTaskDefinition.test.ts index fb4b43fb6a5..5efd47fff92 100644 --- a/packages/api-elasticsearch-tasks/__tests__/tasks/reindexing/reindexingTaskDefinition.test.ts +++ b/packages/api-elasticsearch-tasks/__tests__/tasks/reindexing/reindexingTaskDefinition.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { createElasticsearchReindexingTask } from "~/tasks"; describe("reindexing task definition", () => { diff --git a/packages/api-elasticsearch-tasks/__tests__/tasks/reindexing/reindexingTaskRunner.test.ts b/packages/api-elasticsearch-tasks/__tests__/tasks/reindexing/reindexingTaskRunner.test.ts index d615fc3f181..e247393ddeb 100644 --- a/packages/api-elasticsearch-tasks/__tests__/tasks/reindexing/reindexingTaskRunner.test.ts +++ b/packages/api-elasticsearch-tasks/__tests__/tasks/reindexing/reindexingTaskRunner.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { ReindexingTaskRunner } from "~/tasks/reindexing/ReindexingTaskRunner"; import { Manager } from "~/tasks/Manager"; import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; @@ -13,6 +14,7 @@ import { createTaskManagerStoreMock } from "~tests/mocks/store"; import { createContextMock } from "~tests/mocks/context"; import { createIndexManagerMock } from "~tests/mocks/indexManager"; import { createElasticsearchClientMock } from "~tests/mocks/elasticsearch"; +import { timerFactory } from "@webiny/handler-aws"; describe("reindexing task runner", () => { it("should run a task and receive a continue response", async () => { @@ -27,7 +29,8 @@ describe("reindexing task runner", () => { }, isAborted: () => { return false; - } + }, + timer: timerFactory() }); const indexManager = createIndexManagerMock(); const runner = new ReindexingTaskRunner(manager, indexManager); @@ -67,7 +70,8 @@ describe("reindexing task runner", () => { }, isAborted: () => { return true; - } + }, + timer: timerFactory() }); const indexManager = createIndexManagerMock(); const runner = new ReindexingTaskRunner(manager, indexManager); @@ -101,7 +105,8 @@ describe("reindexing task runner", () => { }, isAborted: () => { return false; - } + }, + timer: timerFactory() }); const indexManager = createIndexManagerMock(); const runner = new ReindexingTaskRunner(manager, indexManager); diff --git a/packages/api-elasticsearch-tasks/jest.setup.js b/packages/api-elasticsearch-tasks/jest.setup.js deleted file mode 100644 index 9654163ae0e..00000000000 --- a/packages/api-elasticsearch-tasks/jest.setup.js +++ /dev/null @@ -1,12 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-page-builder", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-elasticsearch-tasks/vitest.setup.ts b/packages/api-elasticsearch-tasks/vitest.setup.ts new file mode 100644 index 00000000000..4db71cf2a4d --- /dev/null +++ b/packages/api-elasticsearch-tasks/vitest.setup.ts @@ -0,0 +1,14 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-page-builder", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ path: import.meta.dirname, presets }); +}; From 876695242bc39000acdacbd69f9dc801f4335b75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Zori=C4=87?= Date: Mon, 8 Sep 2025 14:36:58 +0200 Subject: [PATCH 07/13] test(api-headless-cms-bulk-actions): convert to vitest --- .../__tests__/tasks/createBulkAction.test.ts | 6 +++--- .../api-headless-cms-bulk-actions/jest.setup.js | 12 ------------ .../api-headless-cms-bulk-actions/vitest.setup.ts | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 15 deletions(-) delete mode 100644 packages/api-headless-cms-bulk-actions/jest.setup.js create mode 100644 packages/api-headless-cms-bulk-actions/vitest.setup.ts diff --git a/packages/api-headless-cms-bulk-actions/__tests__/tasks/createBulkAction.test.ts b/packages/api-headless-cms-bulk-actions/__tests__/tasks/createBulkAction.test.ts index cad4d6e17d8..3cd6440f7cd 100644 --- a/packages/api-headless-cms-bulk-actions/__tests__/tasks/createBulkAction.test.ts +++ b/packages/api-headless-cms-bulk-actions/__tests__/tasks/createBulkAction.test.ts @@ -1,4 +1,4 @@ -import { jest } from "@jest/globals"; +import { describe, it, expect, beforeEach, vi } from "vitest"; import { IntrospectionField, IntrospectionInterfaceType } from "graphql"; import { useGraphQlHandler } from "~tests/context/useGraphQLHandler"; import { createBulkAction } from "~/plugins"; @@ -75,8 +75,8 @@ describe("createBulkAction", () => { }); it("should update the ENUMS when a new bulk action is created, only for the provided `modelIds`", async () => { - const dataLoader = jest.fn(); - const dataProcessor = jest.fn(); + const dataLoader = vi.fn(); + const dataProcessor = vi.fn(); const { introspect } = useGraphQlHandler({ plugins: [ diff --git a/packages/api-headless-cms-bulk-actions/jest.setup.js b/packages/api-headless-cms-bulk-actions/jest.setup.js deleted file mode 100644 index 07ca953f954..00000000000 --- a/packages/api-headless-cms-bulk-actions/jest.setup.js +++ /dev/null @@ -1,12 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-admin-users", "storage-operations"], - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-headless-cms-bulk-actions/vitest.setup.ts b/packages/api-headless-cms-bulk-actions/vitest.setup.ts new file mode 100644 index 00000000000..d24f61430fc --- /dev/null +++ b/packages/api-headless-cms-bulk-actions/vitest.setup.ts @@ -0,0 +1,14 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-admin-users", "storage-operations"], + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ path: import.meta.dirname, presets }); +}; From 46190eb354f74dcaeaa1f44a385daea75ff5a74b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Zori=C4=87?= Date: Mon, 8 Sep 2025 14:37:06 +0200 Subject: [PATCH 08/13] test(api-headless-cms-aco): convert to vitest --- packages/api-file-manager-aco/vitest.setup.ts | 15 +++++++++++++++ .../__tests__/entries.hooks.test.ts | 1 + .../__tests__/folder.extensions.test.ts | 1 + packages/api-headless-cms-aco/jest.setup.js | 13 ------------- packages/api-headless-cms-aco/vitest.setup.ts | 15 +++++++++++++++ 5 files changed, 32 insertions(+), 13 deletions(-) create mode 100644 packages/api-file-manager-aco/vitest.setup.ts delete mode 100644 packages/api-headless-cms-aco/jest.setup.js create mode 100644 packages/api-headless-cms-aco/vitest.setup.ts diff --git a/packages/api-file-manager-aco/vitest.setup.ts b/packages/api-file-manager-aco/vitest.setup.ts new file mode 100644 index 00000000000..b996a75130c --- /dev/null +++ b/packages/api-file-manager-aco/vitest.setup.ts @@ -0,0 +1,15 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-admin-users", "storage-operations"], + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-page-builder", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ path: import.meta.dirname, presets }); +}; diff --git a/packages/api-headless-cms-aco/__tests__/entries.hooks.test.ts b/packages/api-headless-cms-aco/__tests__/entries.hooks.test.ts index 13395af7da5..bec29114fcf 100644 --- a/packages/api-headless-cms-aco/__tests__/entries.hooks.test.ts +++ b/packages/api-headless-cms-aco/__tests__/entries.hooks.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; import { assignCmsLifecycleEvents, tracker } from "./mocks/lifecycle.mock"; import { ROOT_FOLDER } from "@webiny/api-headless-cms/constants"; diff --git a/packages/api-headless-cms-aco/__tests__/folder.extensions.test.ts b/packages/api-headless-cms-aco/__tests__/folder.extensions.test.ts index 783391b28c8..4ec00fa2f08 100644 --- a/packages/api-headless-cms-aco/__tests__/folder.extensions.test.ts +++ b/packages/api-headless-cms-aco/__tests__/folder.extensions.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useGraphQlHandler } from "./utils/useGraphQlHandler"; import { createCmsFolderModelModifier } from "~/plugins"; import { folderMocks } from "~tests/mocks/folder.mock"; diff --git a/packages/api-headless-cms-aco/jest.setup.js b/packages/api-headless-cms-aco/jest.setup.js deleted file mode 100644 index 4ddf6ca63eb..00000000000 --- a/packages/api-headless-cms-aco/jest.setup.js +++ /dev/null @@ -1,13 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-admin-users", "storage-operations"], - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-page-builder", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-headless-cms-aco/vitest.setup.ts b/packages/api-headless-cms-aco/vitest.setup.ts new file mode 100644 index 00000000000..b996a75130c --- /dev/null +++ b/packages/api-headless-cms-aco/vitest.setup.ts @@ -0,0 +1,15 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-admin-users", "storage-operations"], + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-page-builder", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ path: import.meta.dirname, presets }); +}; From f3bfc3e115ab8e2c8da6a922f68d95c3020fa6a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Zori=C4=87?= Date: Tue, 9 Sep 2025 08:35:12 +0200 Subject: [PATCH 09/13] fix(api-elasticsearch): get es client --- .../__tests__/utils/waitUntilHealthy.test.ts | 10 +++++----- .../testing/elasticsearch/getElasticsearchClient.ts | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts b/packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts index 7f37290c2f2..7b59d1f2e97 100644 --- a/packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts +++ b/packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts @@ -1,9 +1,9 @@ import { describe, expect, it, vi } from "vitest"; -import { createWaitUntilHealthy } from "~/utils/waitUntilHealthy"; -import { createElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch/createClient"; -import { ElasticsearchCatClusterHealthStatus } from "~/operations/types"; -import { UnhealthyClusterError } from "~/utils/waitUntilHealthy/UnhealthyClusterError"; -import { WaitingHealthyClusterAbortedError } from "~/utils/waitUntilHealthy/WaitingHealthyClusterAbortedError"; +import { createWaitUntilHealthy } from "~/utils/waitUntilHealthy/index.js"; +import { createElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch/createClient.js"; +import { ElasticsearchCatClusterHealthStatus } from "~/operations/types.js"; +import { UnhealthyClusterError } from "~/utils/waitUntilHealthy/UnhealthyClusterError.js"; +import { WaitingHealthyClusterAbortedError } from "~/utils/waitUntilHealthy/WaitingHealthyClusterAbortedError.js"; describe("wait until healthy", () => { const client = createElasticsearchClient(); diff --git a/packages/project-utils/testing/elasticsearch/getElasticsearchClient.ts b/packages/project-utils/testing/elasticsearch/getElasticsearchClient.ts index 6368658f86d..bfa04ec85c1 100644 --- a/packages/project-utils/testing/elasticsearch/getElasticsearchClient.ts +++ b/packages/project-utils/testing/elasticsearch/getElasticsearchClient.ts @@ -49,11 +49,11 @@ interface OnBeforeEach { } export class ElasticsearchClientConfig { - public elasticsearchClient: ElasticsearchClient; - public plugins: PluginCollection; + public readonly elasticsearchClient: ElasticsearchClient; + public readonly plugins: PluginCollection; private onBeforeEach: { name: string; cb: OnBeforeEach }[] = []; - constructor(prefix: string) { + public constructor(prefix: string) { if (prefix !== "") { // Prefix will only be handled once, for the first processed storage operations. const indexPrefix = getElasticsearchIndexPrefix(); @@ -65,7 +65,7 @@ export class ElasticsearchClientConfig { logger.debug(`ES index prefix = "%s"`, getElasticsearchIndexPrefix()); const documentClient = getDocumentClient(); - this.elasticsearchClient = createElasticsearchClient() as ElasticsearchClient; + this.elasticsearchClient = createElasticsearchClient(); const elasticsearchClientContext = elasticsearchClientContextPlugin( this.elasticsearchClient ); From 04b8ca2aafded55fc8b98ec235e8f1a457845fa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Zori=C4=87?= Date: Tue, 9 Sep 2025 10:49:24 +0200 Subject: [PATCH 10/13] fix(project-utils): use env var for storage ops choice --- package.json | 3 +++ packages/project-utils/testing/presets/index.js | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 6c60134226c..d426d3cfeaf 100644 --- a/package.json +++ b/package.json @@ -168,6 +168,9 @@ "setup-env-files": "node scripts/setupEnvFiles", "setup-cypress": "node scripts/setupCypress", "test": "vitest --config testing/vitest.config.ts --run", + "test:ddb": "WEBINY_STORAGE=ddb vitest --config testing/vitest.config.ts --run", + "test:es": "WEBINY_STORAGE=ddb-es,ddb vitest --config testing/vitest.config.ts --run", + "test:os": "WEBINY_STORAGE=ddb-es,ddb vitest --config testing/vitest.config.ts --run", "test:unit": "cross-env TEST_TYPE=unit yarn test", "test:integration": "cross-env TEST_TYPE=integration yarn test", "test:e2e": "cross-env TEST_TYPE=e2e yarn test", diff --git a/packages/project-utils/testing/presets/index.js b/packages/project-utils/testing/presets/index.js index c126c15bbd8..521ec6c8eff 100644 --- a/packages/project-utils/testing/presets/index.js +++ b/packages/project-utils/testing/presets/index.js @@ -6,7 +6,10 @@ import { hideBin } from "yargs/helpers"; import { PackageJson } from "../../utils/PackageJson.js"; const getAllPackages = (targetKeywords) => { - const { storage = "ddb" } = yargs(hideBin(process.argv)); + + const envVarStorage = process.env.WEBINY_STORAGE || "ddb"; + const { storage = envVarStorage} = yargs(hideBin(process.argv)); + if (!storage) { throw Error(`Missing required --storage parameter!`); From 1c40f7eaad680d6963af9f24850c04ce70c60682 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Zori=C4=87?= Date: Tue, 9 Sep 2025 11:02:37 +0200 Subject: [PATCH 11/13] fix(api-headless-cms-es-tasks): tests --- .../MockDataManager/calculateAmounts.test.ts | 124 +++--------------- .../MockDataManager/calculateSeconds.test.ts | 1 + .../tasks/mockDataCreatorTask.test.ts | 6 +- .../tasks/mockDataManagerTask.test.ts | 1 + .../api-headless-cms-es-tasks/jest.setup.js | 12 -- .../api-headless-cms-es-tasks/vitest.setup.ts | 14 ++ .../testing/elasticsearch/createClient.js | 4 +- .../testing/helpers/elasticIndexManager.js | 2 +- packages/project-utils/testing/mockApiLog.js | 2 +- 9 files changed, 39 insertions(+), 127 deletions(-) delete mode 100644 packages/api-headless-cms-es-tasks/jest.setup.js create mode 100644 packages/api-headless-cms-es-tasks/vitest.setup.ts diff --git a/packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateAmounts.test.ts b/packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateAmounts.test.ts index dc6a7147f0a..464e44b13dc 100644 --- a/packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateAmounts.test.ts +++ b/packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateAmounts.test.ts @@ -1,7 +1,8 @@ +import { describe, expect, it } from "vitest"; import { calculateAmounts } from "~/tasks/MockDataManager/calculateAmounts"; describe("calculateAmounts", () => { - it.skip("should properly calculate the amount of tasks and records - 50", async () => { + it("should properly calculate the amount of tasks and records - 50", async () => { const values = calculateAmounts(50); expect(values).toEqual({ @@ -9,50 +10,10 @@ describe("calculateAmounts", () => { amountOfRecords: 50 }); }); - it.skip("should properly calculate the amount of tasks and records - 100", async () => { - const values = calculateAmounts(100); - expect(values).toEqual({ - amountOfTasks: 1, - amountOfRecords: 100 - }); - }); - it.skip("should properly calculate the amount of tasks and records - 249", async () => { - const values = calculateAmounts(249); - - expect(values).toEqual({ - amountOfTasks: 1, - amountOfRecords: 249 - }); - }); - it.skip("should properly calculate the amount of tasks and records - 251", async () => { - const values = calculateAmounts(251); - - expect(values).toEqual({ - amountOfTasks: 1, - amountOfRecords: 251 - }); - }); + - it.skip("should properly calculate the amount of tasks and records - 500", async () => { - const values = calculateAmounts(500); - - expect(values).toEqual({ - amountOfTasks: 1, - amountOfRecords: 500 - }); - }); - - it.skip("should properly calculate the amount of tasks and records - 999", async () => { - const values = calculateAmounts(999); - - expect(values).toEqual({ - amountOfTasks: 1, - amountOfRecords: 999 - }); - }); - - it.skip("should properly calculate the amount of tasks and records - 9999", async () => { + it("should properly calculate the amount of tasks and records - 9999", async () => { const values = calculateAmounts(9999); expect(values).toEqual({ @@ -61,7 +22,7 @@ describe("calculateAmounts", () => { }); }); - it.skip("should properly calculate the amount of tasks and records - 10001", async () => { + it("should properly calculate the amount of tasks and records - 10001", async () => { const values = calculateAmounts(10001); expect(values).toEqual({ @@ -70,7 +31,7 @@ describe("calculateAmounts", () => { }); }); - it.skip("should properly calculate the amount of tasks and records - 25001", async () => { + it("should properly calculate the amount of tasks and records - 25001", async () => { const values = calculateAmounts(25001); expect(values).toEqual({ @@ -78,78 +39,23 @@ describe("calculateAmounts", () => { amountOfRecords: 5000 }); }); - - it.skip("should properly calculate the amount of tasks and records - 250000", async () => { - const values = calculateAmounts(250000); - + + it("should properly calculate the amount of tasks and records - 99999", async () => { + const values = calculateAmounts(99999); + expect(values).toEqual({ - amountOfTasks: 10, - amountOfRecords: 25000 - }); - }); - - it.skip("should properly calculate the amount of tasks and records - 990000", async () => { - const values = calculateAmounts(990000); - - expect(values).toEqual({ - amountOfTasks: 50, - amountOfRecords: 19800 - }); - }); - - it.skip("should properly calculate the amount of tasks and records - 2900000", async () => { - const values = calculateAmounts(2900000); - - expect(values).toEqual({ - amountOfTasks: 100, - amountOfRecords: 29000 - }); - }); - - it.skip("should properly calculate the amount of tasks and records - 3100000", async () => { - const values = calculateAmounts(3100000); - - expect(values).toEqual({ - amountOfTasks: 100, - amountOfRecords: 31000 - }); - }); - - it.skip("should properly calculate the amount of tasks and records - 5100000", async () => { - const values = calculateAmounts(5100000); - - expect(values).toEqual({ - amountOfTasks: 200, - amountOfRecords: 25500 - }); - }); - - it.skip("should properly calculate the amount of tasks and records - 10000000", async () => { - const values = calculateAmounts(10000000); - - expect(values).toEqual({ - amountOfTasks: 200, - amountOfRecords: 50000 + amountOfTasks: 5, + amountOfRecords: 20000 }); }); - it.skip("should properly calculate the amount of tasks and records - 10000001", async () => { - expect.assertions(1); - - try { - calculateAmounts(10000001); - } catch (ex) { - expect(ex.message).toBe(`No valid value found - input value is too large: 10000001.`); - } - }); - - it.skip("should properly calculate the amount of tasks and records - 50000000", async () => { + it("should fail to calculate because value is too large - 100001", async () => { expect.assertions(1); try { - calculateAmounts(50000000); + calculateAmounts(100001); } catch (ex) { - expect(ex.message).toBe(`No valid value found - input value is too large: 50000000.`); + expect(ex.message).toBe(`No valid value found - input value is too large: 100001.`); } }); }); diff --git a/packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateSeconds.test.ts b/packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateSeconds.test.ts index a053f162cae..29429da527d 100644 --- a/packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateSeconds.test.ts +++ b/packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateSeconds.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { calculateSeconds } from "~/tasks/MockDataManager/calculateSeconds"; describe("calculate seconds to wait for task based on amount of records", () => { diff --git a/packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataCreatorTask.test.ts b/packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataCreatorTask.test.ts index a50fe8fa1c3..e79249d3116 100644 --- a/packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataCreatorTask.test.ts +++ b/packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataCreatorTask.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it, vi } from "vitest"; import { useHandler } from "~tests/context/useHandler"; import { createRunner } from "@webiny/project-utils/testing/tasks"; import { Context } from "~/types"; @@ -13,9 +14,10 @@ import { } from "~/tasks/MockDataManager/createModelAndGroup"; import { CARS_MODEL_ID } from "~/tasks/MockDataManager/constants"; import { disableIndexing, enableIndexing } from "~/utils"; -import { jest } from "@jest/globals"; -jest.setTimeout(120000); +vi.setConfig({ + testTimeout: 120_000, +}) describe("mock data creator task", () => { it("should create a mock data creator task", async () => { diff --git a/packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataManagerTask.test.ts b/packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataManagerTask.test.ts index 1748d555b84..d513e67f097 100644 --- a/packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataManagerTask.test.ts +++ b/packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataManagerTask.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { MOCK_DATA_MANAGER_TASK_ID, createMockDataManagerTask diff --git a/packages/api-headless-cms-es-tasks/jest.setup.js b/packages/api-headless-cms-es-tasks/jest.setup.js deleted file mode 100644 index 07ca953f954..00000000000 --- a/packages/api-headless-cms-es-tasks/jest.setup.js +++ /dev/null @@ -1,12 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-admin-users", "storage-operations"], - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-headless-cms-es-tasks/vitest.setup.ts b/packages/api-headless-cms-es-tasks/vitest.setup.ts new file mode 100644 index 00000000000..d24f61430fc --- /dev/null +++ b/packages/api-headless-cms-es-tasks/vitest.setup.ts @@ -0,0 +1,14 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-admin-users", "storage-operations"], + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ path: import.meta.dirname, presets }); +}; diff --git a/packages/project-utils/testing/elasticsearch/createClient.js b/packages/project-utils/testing/elasticsearch/createClient.js index bdeefab1281..deafe42c53c 100644 --- a/packages/project-utils/testing/elasticsearch/createClient.js +++ b/packages/project-utils/testing/elasticsearch/createClient.js @@ -1,5 +1,5 @@ -const { logger } = require("@webiny/project-utils/testing/logger"); -const { createElasticsearchClient } = require("@webiny/api-elasticsearch"); +import { logger } from "@webiny/project-utils/testing/logger"; +import { createElasticsearchClient } from "@webiny/api-elasticsearch"; const ELASTICSEARCH_PORT = process.env.ELASTICSEARCH_PORT || 9200; diff --git a/packages/project-utils/testing/helpers/elasticIndexManager.js b/packages/project-utils/testing/helpers/elasticIndexManager.js index 74e81329f05..841b92a82d3 100644 --- a/packages/project-utils/testing/helpers/elasticIndexManager.js +++ b/packages/project-utils/testing/helpers/elasticIndexManager.js @@ -1,4 +1,4 @@ -const { logger } = require("../logger"); +import { logger } from "../logger"; module.exports.elasticIndexManager = ({ global, client, onBeforeEach }) => { const clearEsIndices = async () => { diff --git a/packages/project-utils/testing/mockApiLog.js b/packages/project-utils/testing/mockApiLog.js index e9aeb2cac37..4c892bf7845 100644 --- a/packages/project-utils/testing/mockApiLog.js +++ b/packages/project-utils/testing/mockApiLog.js @@ -1,4 +1,4 @@ -const { ContextPlugin } = require("@webiny/api"); +import { ContextPlugin } from "@webiny/api"; export const createMockApiLog = () => { const logging = { From 0a66f0de5941525e24fec454b317978b176a5935 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Zori=C4=87?= Date: Tue, 9 Sep 2025 11:37:32 +0200 Subject: [PATCH 12/13] fix(api-headless-cms-import-export): tests --- .../crud/useCases/validateImportFromUrl.test.ts | 1 + .../__tests__/crud/utils/parseImportUrlData.ts | 1 + .../__tests__/graphql/exportContentEntries.test.ts | 1 + .../__tests__/graphql/importFromUrl.test.ts | 1 + .../graphql/validateImportFromUrl.test.ts | 1 + .../__tests__/tasks/exportContentEntries.test.ts | 4 ++-- .../importFromUrlContentEntriesCombined.test.ts | 1 + .../tasks/importFromUrlController.test.ts | 8 +++++--- .../__tests__/tasks/utils/archiver.test.ts | 1 + .../__tests__/tasks/utils/cmsAssetsZipper.test.ts | 1 + .../utils/cmsAssetsZipper/pointerStore.test.ts | 1 + .../__tests__/tasks/utils/cmsEntryZipper.test.ts | 1 + .../__tests__/tasks/utils/entryAssets.test.ts | 1 + .../tasks/utils/entryAssetsResolver.test.ts | 1 + .../tasks/utils/externalFileFetcher.test.ts | 14 +++++++------- .../__tests__/tasks/utils/fileFetcher.test.ts | 1 + .../tasks/utils/helpers/getBackOffSeconds.test.ts | 4 +++- .../tasks/utils/helpers/getBucket.test.ts | 1 + .../utils/helpers/getImportExportFileType.test.ts | 1 + .../tasks/utils/helpers/matchKeyOrAlias.test.ts | 1 + .../__tests__/tasks/utils/multipartUpload.test.ts | 1 + .../tasks/utils/multipartUploadFactory.test.ts | 1 + .../__tests__/tasks/utils/sizeSegments.test.ts | 3 ++- .../__tests__/tasks/utils/uniqueResolver.test.ts | 1 + .../__tests__/tasks/utils/upload.test.ts | 1 + .../__tests__/tasks/utils/urlSigner.test.ts | 9 +++++---- .../__tests__/tasks/utils/zipper.test.ts | 1 + .../__tests__/tasks/validateImportFromUrl.test.ts | 4 ++-- .../api-headless-cms-import-export/jest.setup.js | 12 ------------ .../api-headless-cms-import-export/vitest.setup.ts | 14 ++++++++++++++ 30 files changed, 61 insertions(+), 32 deletions(-) delete mode 100644 packages/api-headless-cms-import-export/jest.setup.js create mode 100644 packages/api-headless-cms-import-export/vitest.setup.ts diff --git a/packages/api-headless-cms-import-export/__tests__/crud/useCases/validateImportFromUrl.test.ts b/packages/api-headless-cms-import-export/__tests__/crud/useCases/validateImportFromUrl.test.ts index a1fcda874c0..560db9dcb07 100644 --- a/packages/api-headless-cms-import-export/__tests__/crud/useCases/validateImportFromUrl.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/crud/useCases/validateImportFromUrl.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it, vi } from "vitest"; import { ValidateImportFromUrlUseCase } from "~/crud/useCases/validateImportFromUrl"; import { categoryModel } from "~tests/helpers/models"; import { Context } from "~/types"; diff --git a/packages/api-headless-cms-import-export/__tests__/crud/utils/parseImportUrlData.ts b/packages/api-headless-cms-import-export/__tests__/crud/utils/parseImportUrlData.ts index e08f5c023a8..cf860e1d773 100644 --- a/packages/api-headless-cms-import-export/__tests__/crud/utils/parseImportUrlData.ts +++ b/packages/api-headless-cms-import-export/__tests__/crud/utils/parseImportUrlData.ts @@ -1,3 +1,4 @@ +import { describe, expect, it, vi } from "vitest"; import { parseImportUrlData } from "~/crud/utils/parseImportUrlData"; describe("parseImportUrlData", () => { diff --git a/packages/api-headless-cms-import-export/__tests__/graphql/exportContentEntries.test.ts b/packages/api-headless-cms-import-export/__tests__/graphql/exportContentEntries.test.ts index 449b8f91036..de87319dfa7 100644 --- a/packages/api-headless-cms-import-export/__tests__/graphql/exportContentEntries.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/graphql/exportContentEntries.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it, vi } from "vitest"; import { useHandler } from "~tests/helpers/useHandler"; import { AUTHOR_MODEL_ID } from "~tests/mocks/model"; diff --git a/packages/api-headless-cms-import-export/__tests__/graphql/importFromUrl.test.ts b/packages/api-headless-cms-import-export/__tests__/graphql/importFromUrl.test.ts index a8a464be128..ad4e8933bd0 100644 --- a/packages/api-headless-cms-import-export/__tests__/graphql/importFromUrl.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/graphql/importFromUrl.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it, vi } from "vitest"; import { useHandler } from "~tests/helpers/useHandler"; import { createValidateImportFromUrlTask } from "~/tasks"; import { TaskDataStatus } from "@webiny/tasks"; diff --git a/packages/api-headless-cms-import-export/__tests__/graphql/validateImportFromUrl.test.ts b/packages/api-headless-cms-import-export/__tests__/graphql/validateImportFromUrl.test.ts index 98b6eada9f9..ded1c9033d3 100644 --- a/packages/api-headless-cms-import-export/__tests__/graphql/validateImportFromUrl.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/graphql/validateImportFromUrl.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it, vi } from "vitest"; import { useHandler } from "~tests/helpers/useHandler"; import { TaskDataStatus } from "@webiny/tasks"; import { categoryModel } from "~tests/helpers/models"; diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/exportContentEntries.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/exportContentEntries.test.ts index 020a2e67340..0bc82cf97bc 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/exportContentEntries.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/exportContentEntries.test.ts @@ -1,10 +1,10 @@ -import { jest } from "@jest/globals"; +import { describe, expect, it, vi } from "vitest"; import { createRunner } from "@webiny/project-utils/testing/tasks"; import { useHandler } from "~tests/helpers/useHandler"; import { createExportContentEntriesTask } from "~/tasks"; import type { ITaskRunParams } from "@webiny/tasks"; -jest.mock("~/tasks/domain/createExportContentEntries", () => { +vi.mock("~/tasks/domain/createExportContentEntries", () => { return { createExportContentEntries: () => { return { diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/importFromUrlContentEntries/importFromUrlContentEntriesCombined.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/importFromUrlContentEntries/importFromUrlContentEntriesCombined.test.ts index 7ee9bdca888..498ff153dce 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/importFromUrlContentEntries/importFromUrlContentEntriesCombined.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/importFromUrlContentEntries/importFromUrlContentEntriesCombined.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { createDownloadFileFromUrl } from "~/tasks/domain/downloadFileFromUrl/index"; import { CompleteMultipartUploadCommand, diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/importFromUrlController.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/importFromUrlController.test.ts index d0278eef4ec..ed664e1e720 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/importFromUrlController.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/importFromUrlController.test.ts @@ -1,4 +1,4 @@ -import { jest } from "@jest/globals"; +import { beforeEach, describe, expect, it, vi } from "vitest"; import { createImportFromUrlControllerTask } from "~/tasks"; import { createRunner } from "@webiny/project-utils/testing/tasks"; import { CmsImportExportFileType, Context, ICmsImportExportValidatedFile } from "~/types"; @@ -12,7 +12,9 @@ import { import { categoryModel } from "~tests/helpers/models"; import { NonEmptyArray } from "@webiny/api/types"; -jest.setTimeout(60000); +vi.setConfig({ + testTimeout: 60_000 +}); describe("import from url controller", () => { let context: Context; @@ -191,7 +193,7 @@ describe("import from url controller", () => { name: "Import from URL Controller" }); - console.warn = jest.fn(); + console.warn = vi.fn(); const runner = createRunner({ context, diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/archiver.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/archiver.test.ts index 068cca5f67a..19d9499498f 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/archiver.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/archiver.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; // @ts-expect-error import BaseArchiver from "archiver/lib/core"; import { createArchiver } from "~/tasks/utils/archiver"; diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/cmsAssetsZipper.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/cmsAssetsZipper.test.ts index bd2d02c123f..bc1703d1325 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/cmsAssetsZipper.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/cmsAssetsZipper.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { createCmsAssetsZipper } from "~tests/mocks/createCmsAssetsZipper"; import { createEntryAssets } from "~tests/mocks/createEntryAssets"; import { useHandler } from "~tests/helpers/useHandler"; diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/cmsAssetsZipper/pointerStore.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/cmsAssetsZipper/pointerStore.test.ts index 47f6bab2492..f8ff38a280b 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/cmsAssetsZipper/pointerStore.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/cmsAssetsZipper/pointerStore.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { PointerStore } from "~/tasks/utils/cmsAssetsZipper/PointerStore"; describe("pointer store", () => { diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/cmsEntryZipper.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/cmsEntryZipper.test.ts index b9f7487f44c..759988175da 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/cmsEntryZipper.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/cmsEntryZipper.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import AdmZip from "adm-zip"; import { createCmsEntryZipper } from "~tests/mocks/createCmsEntryZipper"; import { fetchItems, images } from "./mocks/cmsEntryZipperItems"; diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/entryAssets.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/entryAssets.test.ts index 82dcc6fe293..246e3d81700 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/entryAssets.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/entryAssets.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { useHandler } from "~tests/helpers/useHandler"; import type { CmsEntry } from "@webiny/api-headless-cms/types"; import type { IContentEntryTraverser } from "@webiny/api-headless-cms"; diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/entryAssetsResolver.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/entryAssetsResolver.test.ts index 087589ca43a..8570b08eeb0 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/entryAssetsResolver.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/entryAssetsResolver.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { useHandler } from "~tests/helpers/useHandler"; import type { Context } from "~/types"; import { createImages } from "~tests/mocks/images"; diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/externalFileFetcher.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/externalFileFetcher.test.ts index f2c79388b2d..93e76de2820 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/externalFileFetcher.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/externalFileFetcher.test.ts @@ -1,4 +1,4 @@ -import { jest } from "@jest/globals"; +import { describe, expect, it, vi } from "vitest"; import { ExternalFileFetcher } from "~/tasks/utils/externalFileFetcher"; import type { GenericRecord } from "@webiny/api/types"; @@ -12,13 +12,13 @@ const createFetcherResponse = (params: Partial): Response => { ok: true, status: 200, statusText: "OK", - clone: jest.fn(), + clone: vi.fn(), redirected: false, - arrayBuffer: jest.fn(), - blob: jest.fn(), - formData: jest.fn(), - json: jest.fn(), - text: jest.fn(), + arrayBuffer: vi.fn(), + blob: vi.fn(), + formData: vi.fn(), + json: vi.fn(), + text: vi.fn(), ...params }; }; diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/fileFetcher.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/fileFetcher.test.ts index d9ed34b3393..d92bb71a41a 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/fileFetcher.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/fileFetcher.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { FileFetcher } from "~/tasks/utils/fileFetcher"; import { GetObjectCommand, ListObjectsCommand, S3Client } from "@webiny/aws-sdk/client-s3"; import { createS3Client } from "~/tasks/utils/helpers/s3Client"; diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/getBackOffSeconds.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/getBackOffSeconds.test.ts index 5aa98da0cf4..631493ef151 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/getBackOffSeconds.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/getBackOffSeconds.test.ts @@ -1,4 +1,6 @@ -import { getBackOffSeconds, min, max } from "~/tasks/utils/helpers/getBackOffSeconds"; +import { describe, expect, it } from "vitest"; +import { getBackOffSeconds, max, min } from "~/tasks/utils/helpers/getBackOffSeconds"; + describe("get back off seconds", () => { const values: [number, number][] = [ diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/getBucket.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/getBucket.test.ts index 401dfc1633c..b16c3807cc4 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/getBucket.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/getBucket.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { getBucket } from "~/tasks/utils/helpers/getBucket"; describe("get bucket", () => { diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/getImportExportFileType.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/getImportExportFileType.test.ts index 162450ad87a..4b923a30f30 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/getImportExportFileType.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/getImportExportFileType.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { getImportExportFileType } from "~/tasks/utils/helpers/getImportExportFileType"; import { CmsImportExportFileType } from "~/types"; diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/matchKeyOrAlias.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/matchKeyOrAlias.test.ts index 07cf38d0ca5..156e5efa1c0 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/matchKeyOrAlias.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/helpers/matchKeyOrAlias.test.ts @@ -1,3 +1,4 @@ +import { beforeEach, describe, expect, it } from "vitest"; import { matchKeyOrAlias } from "~/tasks/utils/helpers/matchKeyOrAlias"; import { GenericRecord } from "@webiny/api/types"; diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/multipartUpload.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/multipartUpload.test.ts index 163a0937397..6b0cdb23e52 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/multipartUpload.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/multipartUpload.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it, vi, beforeEach } from "vitest"; import { createMultipartUpload, IMultipartUploadHandler, diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/multipartUploadFactory.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/multipartUploadFactory.test.ts index fe6dcccadfb..be68aa437d7 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/multipartUploadFactory.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/multipartUploadFactory.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it, vi, beforeEach } from "vitest"; import { MultipartUploadHandler, MultipartUploadFactory } from "~/tasks/utils/upload"; import { createS3Client } from "~/tasks/utils/helpers/s3Client"; import { getBucket } from "~/tasks/utils/helpers/getBucket"; diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/sizeSegments.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/sizeSegments.test.ts index a40d44b077f..888e32e2589 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/sizeSegments.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/sizeSegments.test.ts @@ -1,9 +1,10 @@ +import { describe, expect, it } from "vitest"; import { createSizeSegments } from "~/tasks/utils/helpers/sizeSegments"; import bytes from "bytes"; describe("file segments", () => { it("should create file segments - 10MB / 1MB", async () => { - const oneMb = bytes.parse("1MB"); + const oneMb = bytes.parse("1MB") as number; const segments = createSizeSegments(10000000, oneMb); diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/uniqueResolver.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/uniqueResolver.test.ts index 34d8a6bf1f0..0667185019a 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/uniqueResolver.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/uniqueResolver.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it, vi } from "vitest"; import { UniqueResolver } from "~/tasks/utils/uniqueResolver/UniqueResolver"; import { assets, IMockAsset } from "~tests/mocks/assets"; diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/upload.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/upload.test.ts index 54cf7737121..5e83884d0ce 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/upload.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/upload.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it, vi } from "vitest"; import { createPassThrough } from "~tests/mocks/createPassThrough"; import { mockClient } from "aws-sdk-client-mock"; import { diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/urlSigner.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/urlSigner.test.ts index a1059a9ed96..075f002ef25 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/urlSigner.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/urlSigner.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it, beforeEach } from "vitest"; import { UrlSigner } from "~/tasks/utils/urlSigner"; import { GetObjectCommand, @@ -30,9 +31,9 @@ describe("url signer", () => { }); expect(result).toEqual({ bucket: getBucket(), - expiresOn: expect.toBeDateString(), + expiresOn: expect.toBeDate(), key: "a-key.zip", - url: expect.toBeString() + url: expect.any(String) }); }); @@ -52,9 +53,9 @@ describe("url signer", () => { }); expect(result).toEqual({ bucket: getBucket(), - expiresOn: expect.toBeDateString(), + expiresOn: expect.toBeDate(), key: "a-key.zip", - url: expect.toBeString() + url: expect.any(String) }); expect(result.url).toContain("x-id=GetObject"); diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/utils/zipper.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/utils/zipper.test.ts index 381641925a3..d9b4e708d99 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/utils/zipper.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/utils/zipper.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it, vi } from "vitest"; import { Zipper } from "~/tasks/utils/zipper"; import { Upload } from "~/tasks/utils/upload"; import { createPassThrough } from "~tests/mocks/createPassThrough"; diff --git a/packages/api-headless-cms-import-export/__tests__/tasks/validateImportFromUrl.test.ts b/packages/api-headless-cms-import-export/__tests__/tasks/validateImportFromUrl.test.ts index d46fa4073fc..90460c17149 100644 --- a/packages/api-headless-cms-import-export/__tests__/tasks/validateImportFromUrl.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/tasks/validateImportFromUrl.test.ts @@ -1,4 +1,4 @@ -import { jest } from "@jest/globals"; +import { beforeEach, describe, expect, it, vi } from "vitest"; import { createRunner } from "@webiny/project-utils/testing/tasks"; import { useHandler } from "~tests/helpers/useHandler"; import { CmsImportExportFileType, Context, ICmsImportExportFile } from "~/types"; @@ -9,7 +9,7 @@ import { IValidateImportFromUrlInput } from "~/tasks/domain/abstractions/Validat import { HeadObjectCommand, S3Client } from "@webiny/aws-sdk/client-s3"; import { mockClient } from "aws-sdk-client-mock"; -jest.mock("~/tasks/utils/externalFileFetcher", () => { +vi.mock("~/tasks/utils/externalFileFetcher", () => { return { ExternalFileFetcher: function () { return { diff --git a/packages/api-headless-cms-import-export/jest.setup.js b/packages/api-headless-cms-import-export/jest.setup.js deleted file mode 100644 index f0ad2654ddf..00000000000 --- a/packages/api-headless-cms-import-export/jest.setup.js +++ /dev/null @@ -1,12 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-file-manager", "storage-operations"], - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = { - ...base({ path: __dirname }, presets) -}; diff --git a/packages/api-headless-cms-import-export/vitest.setup.ts b/packages/api-headless-cms-import-export/vitest.setup.ts new file mode 100644 index 00000000000..7254c27c959 --- /dev/null +++ b/packages/api-headless-cms-import-export/vitest.setup.ts @@ -0,0 +1,14 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-file-manager", "storage-operations"], + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ path: import.meta.dirname, presets }); +}; From 1bb80c05b78f013352950627bf694f1bfcd9bd8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Zori=C4=87?= Date: Tue, 9 Sep 2025 11:41:27 +0200 Subject: [PATCH 13/13] fix(api-headless-cms-tasks): tests --- .../crud/useCases/validateImportFromUrl.test.ts | 2 +- .../__tests__/crud/utils/parseImportUrlData.ts | 2 +- .../tasks/deleteModel/graphql/crud.test.ts | 1 + packages/api-headless-cms-tasks/jest.setup.js | 10 ---------- packages/api-headless-cms-tasks/vitest.setup.ts | 14 ++++++++++++++ 5 files changed, 17 insertions(+), 12 deletions(-) delete mode 100644 packages/api-headless-cms-tasks/jest.setup.js create mode 100644 packages/api-headless-cms-tasks/vitest.setup.ts diff --git a/packages/api-headless-cms-import-export/__tests__/crud/useCases/validateImportFromUrl.test.ts b/packages/api-headless-cms-import-export/__tests__/crud/useCases/validateImportFromUrl.test.ts index 560db9dcb07..a13a485b75d 100644 --- a/packages/api-headless-cms-import-export/__tests__/crud/useCases/validateImportFromUrl.test.ts +++ b/packages/api-headless-cms-import-export/__tests__/crud/useCases/validateImportFromUrl.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it, vi } from "vitest"; +import { beforeEach, describe, expect, it } from "vitest"; import { ValidateImportFromUrlUseCase } from "~/crud/useCases/validateImportFromUrl"; import { categoryModel } from "~tests/helpers/models"; import { Context } from "~/types"; diff --git a/packages/api-headless-cms-import-export/__tests__/crud/utils/parseImportUrlData.ts b/packages/api-headless-cms-import-export/__tests__/crud/utils/parseImportUrlData.ts index cf860e1d773..381be71fe29 100644 --- a/packages/api-headless-cms-import-export/__tests__/crud/utils/parseImportUrlData.ts +++ b/packages/api-headless-cms-import-export/__tests__/crud/utils/parseImportUrlData.ts @@ -1,4 +1,4 @@ -import { describe, expect, it, vi } from "vitest"; +import { describe, expect, it } from "vitest"; import { parseImportUrlData } from "~/crud/utils/parseImportUrlData"; describe("parseImportUrlData", () => { diff --git a/packages/api-headless-cms-tasks/__tests__/tasks/deleteModel/graphql/crud.test.ts b/packages/api-headless-cms-tasks/__tests__/tasks/deleteModel/graphql/crud.test.ts index ddfb1460c7e..f6af838bc41 100644 --- a/packages/api-headless-cms-tasks/__tests__/tasks/deleteModel/graphql/crud.test.ts +++ b/packages/api-headless-cms-tasks/__tests__/tasks/deleteModel/graphql/crud.test.ts @@ -1,3 +1,4 @@ +import { describe, expect, it } from "vitest"; import { useHandler } from "~tests/context/useHandler"; import { createStoreKey } from "~/tasks/deleteModel/helpers/store"; import { IStoreValue } from "~/tasks/deleteModel/types"; diff --git a/packages/api-headless-cms-tasks/jest.setup.js b/packages/api-headless-cms-tasks/jest.setup.js deleted file mode 100644 index 67759accf7d..00000000000 --- a/packages/api-headless-cms-tasks/jest.setup.js +++ /dev/null @@ -1,10 +0,0 @@ -const base = require("../../jest.config.base"); -const presets = require("@webiny/project-utils/testing/presets")( - ["@webiny/api-admin-users", "storage-operations"], - ["@webiny/api-headless-cms", "storage-operations"], - ["@webiny/api-i18n", "storage-operations"], - ["@webiny/api-security", "storage-operations"], - ["@webiny/api-tenancy", "storage-operations"] -); - -module.exports = base({ path: __dirname }, presets); diff --git a/packages/api-headless-cms-tasks/vitest.setup.ts b/packages/api-headless-cms-tasks/vitest.setup.ts new file mode 100644 index 00000000000..d24f61430fc --- /dev/null +++ b/packages/api-headless-cms-tasks/vitest.setup.ts @@ -0,0 +1,14 @@ +import { createTestConfig } from "../../testing"; + +export default async () => { + const { getPresets } = await import("@webiny/project-utils/testing/presets/index.js"); + const presets = await getPresets( + ["@webiny/api-admin-users", "storage-operations"], + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] + ); + + return createTestConfig({ path: import.meta.dirname, presets }); +};