From 957b1a5a16ddf679cc2327759cd5637865385067 Mon Sep 17 00:00:00 2001 From: Christian Badura <93912698+cbadura@users.noreply.github.com> Date: Mon, 12 Feb 2024 18:26:20 +0100 Subject: [PATCH] P002271-6069: Move workspace UI to github and connect BFF (#1) * connect to old setup * move generated, change prefix in config files * commit before breaking the app * fix: adjust everything but app folder * fix: adjust everything but api * fix: generate new api * fix: comment out theme and image svcs * fix: fix detail and create api usage * change api as far as possible * fix: change api further * fix: get rid of all visible errors except for children * fix: align api again * fix: change modules for translations * fix: fix crud * fix: get edit props to work * fix: get change import files * fix: navigate to menu * fix: try fixing getmenuitems * fix: improve import --------- Co-authored-by: Christian Badura --- .browserslistrc | 18 + .commitlintrc.json | 9 + .dockerignore | 41 + .editorconfig | 15 + .eslintrc.json | 79 + .github/changelog.yaml | 13 + .github/dependabot.yml | 8 + .github/workflows/build-branch.yml | 15 + .github/workflows/build-pr.yml | 9 + .github/workflows/build-release.yml | 9 + .github/workflows/build.yml | 21 + .github/workflows/create-fix-branch.yml | 8 + .github/workflows/create-release.yml | 7 + .github/workflows/documentation.yml | 17 + .github/workflows/sonar-pr.yml | 12 + .gitignore | 47 + .husky/commit-msg | 4 + .husky/pre-commit | 7 + .prettierignore | 20 + .prettierrc.json | 23 + CHANGELOG.md | 1 + Dockerfile | 16 + angular.json | 132 + apigen.yaml | 4 + babel.config.json | 3 + helm/Chart.yaml | 17 + helm/values.yaml | 94 + karma.conf.js | 66 + nginx/locations.conf | 5 + openapitools.json | 7 + package-lock.json | 27931 ++++++++++++++++ package.json | 141 + postcss.config.js | 3 + proxy.conf.js | 32 + sonar-local-project.properties | 25 + src/_mixins.scss | 21 + src/app/app.component.html | 1 + src/app/app.component.spec.ts | 26 + src/app/app.component.ts | 8 + src/app/app.module.ts | 35 + src/app/model/menu-string-const.ts | 9 + src/app/onecx-workspace-remote.module.ts | 22 + src/app/services/menu-state.service.spec.ts | 29 + src/app/services/menu-state.service.ts | 35 + src/app/services/menu-tree.service.spec.ts | 198 + src/app/services/menu-tree.service.ts | 116 + src/app/shared/generated/.gitignore | 4 + .../generated/.openapi-generator-ignore | 23 + .../shared/generated/.openapi-generator/FILES | 59 + .../generated/.openapi-generator/VERSION | 1 + src/app/shared/generated/README.md | 226 + src/app/shared/generated/api.module.ts | 30 + src/app/shared/generated/api/api.ts | 7 + .../shared/generated/api/menuItem.service.ts | 751 + .../shared/generated/api/product.service.ts | 394 + .../shared/generated/api/workspace.service.ts | 722 + src/app/shared/generated/configuration.ts | 166 + src/app/shared/generated/encoder.ts | 20 + src/app/shared/generated/index.ts | 6 + .../generated/model/createMenuItemRequest.ts | 18 + .../generated/model/createMenuItemResponse.ts | 18 + .../generated/model/createProductRequest.ts | 20 + .../generated/model/createUpdateMenuItem.ts | 34 + .../model/createUpdateMicrofrontend.ts | 18 + .../model/createUpdateProductResponse.ts | 18 + ...createWorkspaceMenuItemStructrueRequest.ts | 18 + .../generated/model/createWorkspaceRequest.ts | 18 + .../model/createWorkspaceResponse.ts | 18 + .../generated/model/eximMenuStructure.ts | 18 + src/app/shared/generated/model/eximScope.ts | 19 + .../shared/generated/model/eximSubjectLink.ts | 18 + .../shared/generated/model/eximWorkspace.ts | 34 + .../generated/model/eximWorkspaceAddress.ts | 21 + .../generated/model/eximWorkspaceMenuItem.ts | 33 + .../model/exportWorkspacesRequest.ts | 18 + .../generated/model/getMenuItemResponse.ts | 18 + .../generated/model/getMenuItemsResponse.ts | 18 + .../getWorkspaceMenuItemStructureResponse.ts | 18 + .../generated/model/getWorkspaceResponse.ts | 18 + .../generated/model/importMenuResponse.ts | 24 + .../generated/model/importResponseStatus.ts | 20 + .../model/importWorkspaceResponse.ts | 23 + src/app/shared/generated/model/menuItem.ts | 40 + .../shared/generated/model/menuSnapshot.ts | 23 + .../shared/generated/model/microfrontend.ts | 19 + src/app/shared/generated/model/models.ts | 44 + .../shared/generated/model/pagingResponse.ts | 20 + .../generated/model/patchMenuItemsRequest.ts | 18 + .../generated/model/patchMenuItemsResponse.ts | 18 + .../model/problemDetailInvalidParam.ts | 18 + .../generated/model/problemDetailParam.ts | 18 + .../generated/model/problemDetailResponse.ts | 22 + src/app/shared/generated/model/product.ts | 26 + src/app/shared/generated/model/scope.ts | 19 + .../model/searchWorkspacesRequest.ts | 26 + .../model/searchWorkspacesResponse.ts | 22 + src/app/shared/generated/model/subjectLink.ts | 18 + .../generated/model/updateProductRequest.ts | 20 + .../generated/model/updateWorkspaceRequest.ts | 18 + .../generated/model/validationConstraint.ts | 18 + src/app/shared/generated/model/workspace.ts | 38 + .../generated/model/workspaceAbstract.ts | 21 + .../generated/model/workspaceAddress.ts | 21 + .../generated/model/workspaceSnapshot.ts | 23 + src/app/shared/generated/param.ts | 69 + src/app/shared/generated/variables.ts | 9 + .../image-container.component.html | 58 + .../image-container.component.scss | 46 + .../image-container.component.ts | 32 + src/app/shared/label.resolver.spec.ts | 43 + src/app/shared/label.resolver.ts | 30 + src/app/shared/shared.module.spec.ts | 46 + src/app/shared/shared.module.ts | 178 + .../theme-color-box.component.html | 41 + .../theme-color-box.component.scss | 19 + .../theme-color-box.component.spec.ts | 40 + .../theme-color-box.component.ts | 23 + src/app/shared/utils.spec.ts | 113 + src/app/shared/utils.ts | 200 + src/app/test/mocks/auth-mock.service.ts | 27 + src/app/types/index.d.ts | 1 + .../workspace/workspace-create/logo-state.ts | 7 + .../workspace-create.component.html | 164 + .../workspace-create.component.spec.ts | 74 + .../workspace-create.component.ts | 164 + .../workspace-detail/menu/iconservice.ts | 13 + .../menu/menu-tree/menu-tree.component.html | 45 + .../menu/menu-tree/menu-tree.component.scss | 36 + .../menu-tree/menu-tree.component.spec.ts | 197 + .../menu/menu-tree/menu-tree.component.ts | 145 + .../workspace-detail/menu/menu.component.html | 650 + .../workspace-detail/menu/menu.component.scss | 182 + .../menu/menu.component.spec.ts | 864 + .../workspace-detail/menu/menu.component.ts | 866 + .../workspace-detail/menu/menu.module.ts | 53 + .../mfe-registrations.component.html | 300 + .../mfe-registrations.component.scss | 19 + .../mfe-registrations.component.ts | 246 + .../workspace-contact.component.html | 110 + .../workspace-contact.component.scss | 3 + .../workspace-contact.component.spec.ts | 193 + .../workspace-contact.component.ts | 94 + .../workspace-detail.component.html | 140 + .../workspace-detail.component.scss | 11 + .../workspace-detail.component.spec.ts | 402 + .../workspace-detail.component.ts | 449 + .../workspace-detail.module.ts | 75 + .../workspace-images/logo/logo.component.html | 52 + .../workspace-images/logo/logo.component.scss | 14 + .../workspace-images/logo/logo.component.ts | 28 + .../workspace-images.component.html | 91 + .../workspace-images.component.scss | 45 + .../workspace-images.component.ts | 162 + .../workspace-intern.component.html | 65 + .../workspace-intern.component.spec.ts | 48 + .../workspace-intern.component.ts | 15 + .../workspace-props.component.html | 221 + .../workspace-props.component.scss | 23 + .../workspace-props.component.spec.ts | 191 + .../workspace-props.component.ts | 193 + .../workspace-roles.component.html | 74 + .../workspace-roles.component.scss | 20 + .../workspace-roles.component.spec.ts | 132 + .../workspace-roles.component.ts | 87 + .../workspace-subjects.component.html | 47 + .../workspace-subjects.component.scss | 24 + .../workspace-subjects.component.ts | 108 + .../choose-file/choose-file.component.html | 27 + .../choose-file/choose-file.component.scss | 17 + .../choose-file/choose-file.component.spec.ts | 289 + .../choose-file/choose-file.component.ts | 152 + .../confirm/confirm.component.html | 76 + .../confirm/confirm.component.scss | 0 .../confirm/confirm.component.spec.ts | 131 + .../confirm/confirm.component.ts | 80 + .../preview/preview.component.html | 112 + .../preview/preview.component.scss | 13 + .../preview/preview.component.spec.ts | 175 + .../preview/preview.component.ts | 168 + .../workspace-import.component.html | 94 + .../workspace-import.component.scss | 16 + .../workspace-import.component.spec.ts | 396 + .../workspace-import.component.ts | 226 + .../workspace-search.component.html | 155 + .../workspace-search.component.scss | 38 + .../workspace-search.component.spec.ts | 215 + .../workspace-search.component.ts | 187 + src/app/workspace/workspace.module.ts | 89 + src/assets/api/workspace-bff-api.yaml | 1252 + src/assets/env.json | 7 + src/assets/i18n/de.json | 614 + src/assets/i18n/en.json | 614 + src/assets/silent-check-sso.html | 11 + src/bootstrap.ts | 13 + src/environments/environment.prod.ts | 5 + src/environments/environment.ts | 13 + src/favicon.ico | Bin 0 -> 15086 bytes src/index.html | 13 + src/main.ts | 1 + src/polyfills.ts | 52 + src/styles.scss | 8 + src/test-setup.ts | 1 + src/test.ts | 8 + tsconfig.app.json | 13 + tsconfig.json | 46 + tsconfig.spec.json | 15 + webpack.config.js | 52 + webpack.prod.config.js | 1 + 208 files changed, 46270 insertions(+) create mode 100644 .browserslistrc create mode 100644 .commitlintrc.json create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .eslintrc.json create mode 100644 .github/changelog.yaml create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/build-branch.yml create mode 100644 .github/workflows/build-pr.yml create mode 100644 .github/workflows/build-release.yml create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/create-fix-branch.yml create mode 100644 .github/workflows/create-release.yml create mode 100644 .github/workflows/documentation.yml create mode 100644 .github/workflows/sonar-pr.yml create mode 100644 .gitignore create mode 100755 .husky/commit-msg create mode 100755 .husky/pre-commit create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 CHANGELOG.md create mode 100644 Dockerfile create mode 100644 angular.json create mode 100644 apigen.yaml create mode 100644 babel.config.json create mode 100644 helm/Chart.yaml create mode 100644 helm/values.yaml create mode 100644 karma.conf.js create mode 100644 nginx/locations.conf create mode 100644 openapitools.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 proxy.conf.js create mode 100644 sonar-local-project.properties create mode 100644 src/_mixins.scss create mode 100644 src/app/app.component.html create mode 100644 src/app/app.component.spec.ts create mode 100644 src/app/app.component.ts create mode 100644 src/app/app.module.ts create mode 100644 src/app/model/menu-string-const.ts create mode 100644 src/app/onecx-workspace-remote.module.ts create mode 100644 src/app/services/menu-state.service.spec.ts create mode 100644 src/app/services/menu-state.service.ts create mode 100644 src/app/services/menu-tree.service.spec.ts create mode 100644 src/app/services/menu-tree.service.ts create mode 100644 src/app/shared/generated/.gitignore create mode 100644 src/app/shared/generated/.openapi-generator-ignore create mode 100644 src/app/shared/generated/.openapi-generator/FILES create mode 100644 src/app/shared/generated/.openapi-generator/VERSION create mode 100644 src/app/shared/generated/README.md create mode 100644 src/app/shared/generated/api.module.ts create mode 100644 src/app/shared/generated/api/api.ts create mode 100644 src/app/shared/generated/api/menuItem.service.ts create mode 100644 src/app/shared/generated/api/product.service.ts create mode 100644 src/app/shared/generated/api/workspace.service.ts create mode 100644 src/app/shared/generated/configuration.ts create mode 100644 src/app/shared/generated/encoder.ts create mode 100644 src/app/shared/generated/index.ts create mode 100644 src/app/shared/generated/model/createMenuItemRequest.ts create mode 100644 src/app/shared/generated/model/createMenuItemResponse.ts create mode 100644 src/app/shared/generated/model/createProductRequest.ts create mode 100644 src/app/shared/generated/model/createUpdateMenuItem.ts create mode 100644 src/app/shared/generated/model/createUpdateMicrofrontend.ts create mode 100644 src/app/shared/generated/model/createUpdateProductResponse.ts create mode 100644 src/app/shared/generated/model/createWorkspaceMenuItemStructrueRequest.ts create mode 100644 src/app/shared/generated/model/createWorkspaceRequest.ts create mode 100644 src/app/shared/generated/model/createWorkspaceResponse.ts create mode 100644 src/app/shared/generated/model/eximMenuStructure.ts create mode 100644 src/app/shared/generated/model/eximScope.ts create mode 100644 src/app/shared/generated/model/eximSubjectLink.ts create mode 100644 src/app/shared/generated/model/eximWorkspace.ts create mode 100644 src/app/shared/generated/model/eximWorkspaceAddress.ts create mode 100644 src/app/shared/generated/model/eximWorkspaceMenuItem.ts create mode 100644 src/app/shared/generated/model/exportWorkspacesRequest.ts create mode 100644 src/app/shared/generated/model/getMenuItemResponse.ts create mode 100644 src/app/shared/generated/model/getMenuItemsResponse.ts create mode 100644 src/app/shared/generated/model/getWorkspaceMenuItemStructureResponse.ts create mode 100644 src/app/shared/generated/model/getWorkspaceResponse.ts create mode 100644 src/app/shared/generated/model/importMenuResponse.ts create mode 100644 src/app/shared/generated/model/importResponseStatus.ts create mode 100644 src/app/shared/generated/model/importWorkspaceResponse.ts create mode 100644 src/app/shared/generated/model/menuItem.ts create mode 100644 src/app/shared/generated/model/menuSnapshot.ts create mode 100644 src/app/shared/generated/model/microfrontend.ts create mode 100644 src/app/shared/generated/model/models.ts create mode 100644 src/app/shared/generated/model/pagingResponse.ts create mode 100644 src/app/shared/generated/model/patchMenuItemsRequest.ts create mode 100644 src/app/shared/generated/model/patchMenuItemsResponse.ts create mode 100644 src/app/shared/generated/model/problemDetailInvalidParam.ts create mode 100644 src/app/shared/generated/model/problemDetailParam.ts create mode 100644 src/app/shared/generated/model/problemDetailResponse.ts create mode 100644 src/app/shared/generated/model/product.ts create mode 100644 src/app/shared/generated/model/scope.ts create mode 100644 src/app/shared/generated/model/searchWorkspacesRequest.ts create mode 100644 src/app/shared/generated/model/searchWorkspacesResponse.ts create mode 100644 src/app/shared/generated/model/subjectLink.ts create mode 100644 src/app/shared/generated/model/updateProductRequest.ts create mode 100644 src/app/shared/generated/model/updateWorkspaceRequest.ts create mode 100644 src/app/shared/generated/model/validationConstraint.ts create mode 100644 src/app/shared/generated/model/workspace.ts create mode 100644 src/app/shared/generated/model/workspaceAbstract.ts create mode 100644 src/app/shared/generated/model/workspaceAddress.ts create mode 100644 src/app/shared/generated/model/workspaceSnapshot.ts create mode 100644 src/app/shared/generated/param.ts create mode 100644 src/app/shared/generated/variables.ts create mode 100644 src/app/shared/image-container/image-container.component.html create mode 100644 src/app/shared/image-container/image-container.component.scss create mode 100644 src/app/shared/image-container/image-container.component.ts create mode 100644 src/app/shared/label.resolver.spec.ts create mode 100644 src/app/shared/label.resolver.ts create mode 100644 src/app/shared/shared.module.spec.ts create mode 100644 src/app/shared/shared.module.ts create mode 100644 src/app/shared/theme-color-box/theme-color-box.component.html create mode 100644 src/app/shared/theme-color-box/theme-color-box.component.scss create mode 100644 src/app/shared/theme-color-box/theme-color-box.component.spec.ts create mode 100644 src/app/shared/theme-color-box/theme-color-box.component.ts create mode 100644 src/app/shared/utils.spec.ts create mode 100644 src/app/shared/utils.ts create mode 100644 src/app/test/mocks/auth-mock.service.ts create mode 100644 src/app/types/index.d.ts create mode 100644 src/app/workspace/workspace-create/logo-state.ts create mode 100644 src/app/workspace/workspace-create/workspace-create.component.html create mode 100644 src/app/workspace/workspace-create/workspace-create.component.spec.ts create mode 100644 src/app/workspace/workspace-create/workspace-create.component.ts create mode 100644 src/app/workspace/workspace-detail/menu/iconservice.ts create mode 100644 src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.html create mode 100644 src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.scss create mode 100644 src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.spec.ts create mode 100644 src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.ts create mode 100644 src/app/workspace/workspace-detail/menu/menu.component.html create mode 100644 src/app/workspace/workspace-detail/menu/menu.component.scss create mode 100644 src/app/workspace/workspace-detail/menu/menu.component.spec.ts create mode 100644 src/app/workspace/workspace-detail/menu/menu.component.ts create mode 100644 src/app/workspace/workspace-detail/menu/menu.module.ts create mode 100644 src/app/workspace/workspace-detail/mfe-registrations/mfe-registrations.component.html create mode 100644 src/app/workspace/workspace-detail/mfe-registrations/mfe-registrations.component.scss create mode 100644 src/app/workspace/workspace-detail/mfe-registrations/mfe-registrations.component.ts create mode 100644 src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.html create mode 100644 src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.scss create mode 100644 src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.spec.ts create mode 100644 src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.ts create mode 100644 src/app/workspace/workspace-detail/workspace-detail.component.html create mode 100644 src/app/workspace/workspace-detail/workspace-detail.component.scss create mode 100644 src/app/workspace/workspace-detail/workspace-detail.component.spec.ts create mode 100644 src/app/workspace/workspace-detail/workspace-detail.component.ts create mode 100644 src/app/workspace/workspace-detail/workspace-detail.module.ts create mode 100644 src/app/workspace/workspace-detail/workspace-images/logo/logo.component.html create mode 100644 src/app/workspace/workspace-detail/workspace-images/logo/logo.component.scss create mode 100644 src/app/workspace/workspace-detail/workspace-images/logo/logo.component.ts create mode 100644 src/app/workspace/workspace-detail/workspace-images/workspace-images.component.html create mode 100644 src/app/workspace/workspace-detail/workspace-images/workspace-images.component.scss create mode 100644 src/app/workspace/workspace-detail/workspace-images/workspace-images.component.ts create mode 100644 src/app/workspace/workspace-detail/workspace-intern/workspace-intern.component.html create mode 100644 src/app/workspace/workspace-detail/workspace-intern/workspace-intern.component.spec.ts create mode 100644 src/app/workspace/workspace-detail/workspace-intern/workspace-intern.component.ts create mode 100644 src/app/workspace/workspace-detail/workspace-props/workspace-props.component.html create mode 100644 src/app/workspace/workspace-detail/workspace-props/workspace-props.component.scss create mode 100644 src/app/workspace/workspace-detail/workspace-props/workspace-props.component.spec.ts create mode 100644 src/app/workspace/workspace-detail/workspace-props/workspace-props.component.ts create mode 100644 src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.html create mode 100644 src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.scss create mode 100644 src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.spec.ts create mode 100644 src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.ts create mode 100644 src/app/workspace/workspace-detail/workspace-subjects/workspace-subjects.component.html create mode 100644 src/app/workspace/workspace-detail/workspace-subjects/workspace-subjects.component.scss create mode 100644 src/app/workspace/workspace-detail/workspace-subjects/workspace-subjects.component.ts create mode 100644 src/app/workspace/workspace-import/choose-file/choose-file.component.html create mode 100644 src/app/workspace/workspace-import/choose-file/choose-file.component.scss create mode 100644 src/app/workspace/workspace-import/choose-file/choose-file.component.spec.ts create mode 100644 src/app/workspace/workspace-import/choose-file/choose-file.component.ts create mode 100644 src/app/workspace/workspace-import/confirm/confirm.component.html create mode 100644 src/app/workspace/workspace-import/confirm/confirm.component.scss create mode 100644 src/app/workspace/workspace-import/confirm/confirm.component.spec.ts create mode 100644 src/app/workspace/workspace-import/confirm/confirm.component.ts create mode 100644 src/app/workspace/workspace-import/preview/preview.component.html create mode 100644 src/app/workspace/workspace-import/preview/preview.component.scss create mode 100644 src/app/workspace/workspace-import/preview/preview.component.spec.ts create mode 100644 src/app/workspace/workspace-import/preview/preview.component.ts create mode 100644 src/app/workspace/workspace-import/workspace-import.component.html create mode 100644 src/app/workspace/workspace-import/workspace-import.component.scss create mode 100644 src/app/workspace/workspace-import/workspace-import.component.spec.ts create mode 100644 src/app/workspace/workspace-import/workspace-import.component.ts create mode 100644 src/app/workspace/workspace-search/workspace-search.component.html create mode 100644 src/app/workspace/workspace-search/workspace-search.component.scss create mode 100644 src/app/workspace/workspace-search/workspace-search.component.spec.ts create mode 100644 src/app/workspace/workspace-search/workspace-search.component.ts create mode 100644 src/app/workspace/workspace.module.ts create mode 100644 src/assets/api/workspace-bff-api.yaml create mode 100644 src/assets/env.json create mode 100644 src/assets/i18n/de.json create mode 100644 src/assets/i18n/en.json create mode 100644 src/assets/silent-check-sso.html create mode 100644 src/bootstrap.ts create mode 100644 src/environments/environment.prod.ts create mode 100644 src/environments/environment.ts create mode 100644 src/favicon.ico create mode 100644 src/index.html create mode 100644 src/main.ts create mode 100644 src/polyfills.ts create mode 100644 src/styles.scss create mode 100644 src/test-setup.ts create mode 100644 src/test.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.spec.json create mode 100644 webpack.config.js create mode 100644 webpack.prod.config.js diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 00000000..0ccadaf3 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,18 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# For the full list of supported browsers by the Angular framework, please see: +# https://angular.io/guide/browser-support + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +last 1 Chrome version +last 1 Firefox version +last 2 Edge major versions +last 2 Safari major versions +last 2 iOS major versions +Firefox ESR +not IE 9-10 # Angular support for IE 9-10 has been deprecated and will be removed as of Angular v11. To opt-in, remove the 'not' prefix on this line. +not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. diff --git a/.commitlintrc.json b/.commitlintrc.json new file mode 100644 index 00000000..837ad189 --- /dev/null +++ b/.commitlintrc.json @@ -0,0 +1,9 @@ +{ + "extends": ["@commitlint/config-conventional"], + "rules": { + "type-case": [2, "always", ["lowerCase"]], + "type-enum": [2, "always", ["build", "ci", "docs", "feat", "fix", "perf", "refactor", "revert", "style", "ticket"]], + "subject-min-length": [2, "always", [5]], + "subject-max-length": [2, "always", [200]] + } +} diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..09d50418 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,41 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/tmp +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +.sass-cache +.gitlab* +.scannerwork +connect.lock +reports +typings +*.log + +# e2e +/e2e/*.js +/e2e/*.map + +# System Files +.DS_Store +Thumbs.db \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..022da71b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..aef10d88 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,79 @@ +{ + "root": true, + "ignorePatterns": [ + ".angular/**", + ".husky/**", + ".github/**", + ".scannerwork/**", + "reports/**", + "dist/**", + "helm/**", + "node_modules/**", + "src/app/shared/generated/**", + "src/app/api/*", + "src/app/model/*", + "src/**/*.ico", + "src/**/*.svg" + ], + "overrides": [ + { + "files": ["*.ts", "*.js"], + "env": { "es6": true }, + "globals": { + "__dirname": true + }, + "parserOptions": { + "ecmaVersion": "latest", + "project": "**/tsconfig.json", + "tsconfigRootDir": "", + "createDefaultProgram": true + }, + "extends": [ + "plugin:@angular-eslint/recommended", + "plugin:@angular-eslint/template/process-inline-templates", + "plugin:prettier/recommended" + ], + "rules": { + "semi": ["error", "never"], + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "app", + "style": "camelCase" + } + ], + "@angular-eslint/component-selector": [ + "warn", + { + "type": "element", + "prefix": "app", + "style": "kebab-case" + } + ], + "prettier/prettier": [ + "error", + { + "singleQuote": true + } + ], + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": ["error", { "vars": "all", "args": "none" }] + } + }, + { + "files": ["*.html"], + "excludedFiles": ["*inline-template-*.component.html"], + "extends": ["plugin:@angular-eslint/template/recommended", "plugin:prettier/recommended"], + "rules": { + "prettier/prettier": [ + "error", + { + "singleQuote": true, + "parser": "angular" + } + ] + } + } + ] +} diff --git a/.github/changelog.yaml b/.github/changelog.yaml new file mode 100644 index 00000000..0a5526ed --- /dev/null +++ b/.github/changelog.yaml @@ -0,0 +1,13 @@ +sections: + - title: Major changes + labels: + - "release/super-feature" + - title: Complete changelog + labels: + - "bug" + - "enhancement" + - "dependencies" +template: | + {{ range $section := .Sections }}{{ if $section.Items }}### {{ $section.GetTitle }}{{ range $item := $section.Items }} + * [#{{ $item.GetID }}]({{ $item.GetURL }}) - {{ $item.GetTitle }}{{ end }}{{ end }} + {{ end }} \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..98d89540 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,8 @@ +version: 2 +updates: + - package-ecosystem: npm + directory: "/" + schedule: + interval: daily + labels: + - dependencies \ No newline at end of file diff --git a/.github/workflows/build-branch.yml b/.github/workflows/build-branch.yml new file mode 100644 index 00000000..cf379176 --- /dev/null +++ b/.github/workflows/build-branch.yml @@ -0,0 +1,15 @@ +name: Build Feature Branch + +on: + workflow_dispatch: + push: + branches: + - '**' + - '!main' + - '!fix/[0-9]+.[0-9]+.x' + +jobs: + branch: + uses: onecx/ci-angular/.github/workflows/build-branch.yml@v1 + secrets: inherit + \ No newline at end of file diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml new file mode 100644 index 00000000..efd014df --- /dev/null +++ b/.github/workflows/build-pr.yml @@ -0,0 +1,9 @@ +name: Build Pull Request + +on: + pull_request: + +jobs: + pr: + uses: onecx/ci-angular/.github/workflows/build-pr.yml@v1 + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml new file mode 100644 index 00000000..1cc1df5d --- /dev/null +++ b/.github/workflows/build-release.yml @@ -0,0 +1,9 @@ +name: Build Release +on: + push: + tags: + - '**' +jobs: + release: + uses: onecx/ci-angular/.github/workflows/build-release.yml@v1 + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..ab8abcff --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,21 @@ +name: Build + +on: + workflow_dispatch: + push: + branches: + - 'main' + - 'fix/[0-9]+.[0-9]+.x' + paths-ignore: + - '.gitignore' + - 'CODEOWNERS' + - 'LICENSE' + - '*.md' + - '*.adoc' + - '*.txt' + - '.all-contributorsrc' + +jobs: + build: + uses: onecx/ci-angular/.github/workflows/build.yml@v1 + secrets: inherit diff --git a/.github/workflows/create-fix-branch.yml b/.github/workflows/create-fix-branch.yml new file mode 100644 index 00000000..ac4122e3 --- /dev/null +++ b/.github/workflows/create-fix-branch.yml @@ -0,0 +1,8 @@ +name: Create Fix Branch +on: + workflow_dispatch: +jobs: + fix: + uses: onecx/ci-common/.github/workflows/create-fix-branch.yml@v1 + secrets: inherit + \ No newline at end of file diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml new file mode 100644 index 00000000..c97eb424 --- /dev/null +++ b/.github/workflows/create-release.yml @@ -0,0 +1,7 @@ +name: Create Release Version +on: + workflow_dispatch: +jobs: + release: + uses: onecx/ci-common/.github/workflows/create-release.yml@v1 + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml new file mode 100644 index 00000000..da0b7640 --- /dev/null +++ b/.github/workflows/documentation.yml @@ -0,0 +1,17 @@ +name: Update documentation +on: + push: + branches: [ main ] + paths: + - 'docs/**' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Trigger website update + uses: peter-evans/repository-dispatch@v1 + with: + token: ${{ secrets.CI_PAT }} + repository: onecx/docs + event-type: dispatch-build-website diff --git a/.github/workflows/sonar-pr.yml b/.github/workflows/sonar-pr.yml new file mode 100644 index 00000000..9ad56b19 --- /dev/null +++ b/.github/workflows/sonar-pr.yml @@ -0,0 +1,12 @@ +name: Sonar Pull Request + +on: + workflow_run: + workflows: ["Build Pull Request"] + types: + - completed + +jobs: + pr: + uses: onecx/ci-angular/.github/workflows/angular-pr-sonar.yml@v1 + secrets: inherit \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..bf766ecf --- /dev/null +++ b/.gitignore @@ -0,0 +1,47 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +.angular/cache +.sass-cache +.gitlab* +.scannerwork +connect.lock +reports +typings +*.log +*.sh + +# System Files +.DS_Store +Thumbs.db diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 00000000..e8511eae --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no-install commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000..c96ff6e2 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,7 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +echo "[Husky] Running lint check:" +npm run lint +echo "[Husky] Running prettier check:" +npx prettier -c . diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..5a7360fb --- /dev/null +++ b/.prettierignore @@ -0,0 +1,20 @@ +.angular/** +.husky/** +.docusaurus/ +.github/** +.scannerwork/ +.prettierignore +.browserslistrc +dist/** +helm/** +nginx/** +reports/** +node_modules +CHANGELOG.md +README.md +Dockerfile +*.log +*.sh +src/app/shared/generated/** +src/app/api/* +src/app/model/* diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 00000000..62bbae89 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,23 @@ +{ + "trailingComma": "none", + "tabWidth": 2, + "useTabs": false, + "semi": false, + "singleQuote": true, + "bracketSpacing": true, + "printWidth": 120, + "overrides": [ + { + "files": "*.component.html", + "options": { + "parser": "angular" + } + }, + { + "files": "*.html", + "options": { + "parser": "html" + } + } + ] +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..825c32f0 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1 @@ +# Changelog diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..f24bcd6f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,16 @@ +FROM harbor.1000kit.org/1000kit/spa-base:v1 + +# Copy locations config +COPY nginx/locations.conf $DIR_LOCATION/locations.conf +# Copy application build +COPY dist/onecx-workspace-ui/ $DIR_HTML + +#Optional extend list of application environments +#ENV CONFIG_ENV_LIST BFF_URL,APP_BASE_HREF + +# Application environments default values +ENV BFF_URL http://onecx-workspace-management-bff:8080/ +ENV APP_BASE_HREF / + +RUN chmod 775 -R $DIR_HTML/assets +USER 1001 diff --git a/angular.json b/angular.json new file mode 100644 index 00000000..174f4b21 --- /dev/null +++ b/angular.json @@ -0,0 +1,132 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "onecx-workspace-ui": { + "projectType": "application", + "schematics": {}, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "ngx-build-plus:browser", + "options": { + "preserveSymlinks": true, + "outputPath": "dist/onecx-workspace-ui", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "aot": true, + "assets": [ + "src/favicon.ico", + "src/assets", + { + "glob": "**/*", + "input": "node_modules/@onecx/portal-integration-angular/assets/", + "output": "/onecx-portal-lib/assets/" + } + ], + "styles": [ + "node_modules/primeicons/primeicons.css", + "node_modules/primeng/resources/primeng.min.css", + "node_modules/@onecx/portal-integration-angular/assets/output.css", + "src/styles.scss" + ], + "scripts": [], + "extraWebpackConfig": "webpack.config.js", + "commonChunk": false + }, + "configurations": { + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + }, + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "3mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "outputHashing": "all", + "extraWebpackConfig": "webpack.prod.config.js" + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "ngx-build-plus:dev-server", + "options": { + "browserTarget": "onecx-workspace-ui:build", + "port": 4200, + "publicHost": "http://localhost:4200", + "extraWebpackConfig": "webpack.config.js", + "proxyConfig": "proxy.conf.js" + }, + "configurations": { + "development": { + "browserTarget": "onecx-workspace-ui:build:development" + }, + "production": { + "browserTarget": "onecx-workspace-ui:build:production", + "extraWebpackConfig": "webpack.prod.config.js" + } + } + }, + "extract-i18n": { + "builder": "ngx-build-plus:extract-i18n", + "options": { + "browserTarget": "onecx-workspace-ui:build", + "extraWebpackConfig": "webpack.config.js" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": ["src/favicon.ico", "src/assets"], + "styles": ["src/styles.scss"], + "scripts": [], + "codeCoverageExclude": [ + "**/*.module.ts", + "src/app/test/**", + "src/app/environments/**", + "src/app/shared/generated/**" + ] + } + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": ["**/*.ts", "**/*.js", "**/*.html"] + } + } + } + } + }, + "cli": { + "analytics": false + } +} diff --git a/apigen.yaml b/apigen.yaml new file mode 100644 index 00000000..7c3dc31d --- /dev/null +++ b/apigen.yaml @@ -0,0 +1,4 @@ +serviceSuffix: APIService +stringEnums: true +useSingleRequestParameter: true +providedIn: 'any' diff --git a/babel.config.json b/babel.config.json new file mode 100644 index 00000000..065aee77 --- /dev/null +++ b/babel.config.json @@ -0,0 +1,3 @@ +{ + "babelrcRoots": ["*"] +} diff --git a/helm/Chart.yaml b/helm/Chart.yaml new file mode 100644 index 00000000..e1e3f08e --- /dev/null +++ b/helm/Chart.yaml @@ -0,0 +1,17 @@ +apiVersion: v2 +name: onecx-workspace-ui +version: 0.0.0 +description: OneCX Workspace UI +home: https://github.com/onecx/onecx-workspace-ui +keywords: + - workspace +sources: + - https://github.com/onecx/onecx-workspace-ui +maintainers: + - name: OneCX Developer Team + email: tkit_dev@1000kit.org +dependencies: + - name: helm-angular-app + version: ^0 + repository: oci://ghcr.io/onecx/charts + alias: app diff --git a/helm/values.yaml b/helm/values.yaml new file mode 100644 index 00000000..44ddcc52 --- /dev/null +++ b/helm/values.yaml @@ -0,0 +1,94 @@ +app: + name: ui + image: + repository: 'onecx/onecx-workspace-ui' + routing: + enabled: true + path: /mfe/workspace/ + + operator: + # Microfrontend + microfrontend: + enabled: true + spec: + exposedModule: "./WorkspaceMgmtModule" + description: "OneCX Workspace Mgmt" + note: "OneCX Workspace Mgmt module auto import via MF operator" + # Permission + permission: + enabled: true + spec: + permissions: + WORKSPACE: + CREATE: Create workspace + EDIT: Edit workspace + DELETE: Delete workspace + SAVE: Update and save workspace + IMPORT: Import workspace + EXPORT: Export workspace + VIEW: View mode for workspace + SEARCH: Search workspace + WORKSPACE_TENANT: + VIEW: View workspace tenant + EDIT: View workspace tenant + WORKSPACE_PROPS: + VIEW: View workspace props + WORKSPACE_CONTACT: + VIEW: View workspace contact + WORKSPACE_INTERNAL: + VIEW: View workspace internal + WORKSPACE_ROLES: + VIEW: View workspace roles + WORKSPACE_PRODUCTS: + VIEW: View workspace products + WORKSPACE_IMAGES: + VIEW: View workspace images + WORKSPACE_MFE: + REGISTER: Register app module + DEREGISTER: Deregister app module + WORKSPACE_IMAGE: + EDIT: Edit workspace images + DELETE: Delete workspace images + WORKSPACE_ROLE: + EDIT: Edit workspace images + DELETE: Delete workspace images + MENU: + CREATE: Create menu + EDIT: Edit menu + VIEW: View menu + SAVE: Save menu + COPY: Copy menu + DELETE: Delete menu + IMPORT: Import menu + EXPORT: Export menu + SEARCH: Search menu page + DRAG_DROP: Drag & drop menu tree + MENU_TENANT: + VIEW: View menu tenant + + # Keycloak + keycloak: + enabled: true + client: |- + { + "clientId": "onecx-workspace-ui", + "enabled": true, + "description": "Keycloak client for onecx-workspace-ui", + "redirectUris": ["*"], + "webOrigins": ["*"], + "publicClient": true, + "protocol": "openid-connect" + } + roles: |- + [ + { + "name": "onecx-workspace-admin", + "description": "OneCX Workspace admin" + }, + { + "name": "onecx-workspace-user", + "description": "OneCX Workspace user" + } + ] + +# PIPE Config diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 00000000..cf52e1e3 --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,66 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + logLevel: config.LOG_INFO, + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-chrome-launcher'), + require('karma-coverage'), + require('karma-jasmine'), + require('karma-jasmine-html-reporter'), + require('karma-sonarqube-unit-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + jasmine: { + // you can add configuration options for Jasmine here + // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html + // for example, you can disable the random execution with `random: false` + // or set a specific seed with `seed: 4321` + random: false + }, + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + jasmineHtmlReporter: { + suppressAll: true // removes the duplicated traces + }, + sonarqubeReporter: { + basePath: 'src/app', // test files folder + filePattern: '**/*.spec.ts', // test files glob pattern + encoding: 'utf-8', // test files encoding + outputFolder: 'sonar', // report destination + legacyMode: false, // report for Sonarqube < 6.2 (disabled) + reportName: 'sonarqube_report.xml' + }, + sonarQubeUnitReporter: { + sonarQubeVersion: 'LATEST', + outputFile: 'reports/sonarqube_report.xml', + testPaths: ['./src/app'], + testFilePattern: '**/*.spec.ts', + useBrowserName: false + }, + coverageReporter: { + includeAllSources: true, + dir: 'reports', + subdir: 'coverage', // common name instaed browser-specific + reporters: [{ type: 'text-summary' }, { type: 'lcov' }] + }, + reporters: ['progress', 'kjhtml', 'coverage', 'sonarqubeUnit'], + preprocessors: { 'src/**/*.js': ['coverage'] }, + port: 9876, + colors: true, + autoWatch: true, + singleRun: false, + restartOnFileChange: true, + browsers: ['HeadlessChrome'], + customLaunchers: { + HeadlessChrome: { + base: 'ChromeHeadless', + flags: ['--no-sandbox'] + } + } + }) +} diff --git a/nginx/locations.conf b/nginx/locations.conf new file mode 100644 index 00000000..659e09d1 --- /dev/null +++ b/nginx/locations.conf @@ -0,0 +1,5 @@ +location @@APP_BASE_HREFportal-api/ { + proxy_pass @@BFF_URL; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $remote_addr; +} diff --git a/openapitools.json b/openapitools.json new file mode 100644 index 00000000..e73b9758 --- /dev/null +++ b/openapitools.json @@ -0,0 +1,7 @@ +{ + "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", + "spaces": 2, + "generator-cli": { + "version": "7.2.0" + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..3c71496d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,27931 @@ +{ + "name": "onecx-workspace-ui", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "onecx-workspace-ui", + "version": "0.0.0", + "license": "Apache-2.0", + "dependencies": { + "@angular-architects/module-federation": "15.0.0", + "@angular/animations": "15.2.7", + "@angular/cdk": "^15.2.7", + "@angular/common": "15.2.7", + "@angular/compiler": "15.2.7", + "@angular/core": "15.2.7", + "@angular/forms": "15.2.7", + "@angular/platform-browser": "15.2.7", + "@angular/platform-browser-dynamic": "15.2.7", + "@angular/router": "15.2.7", + "@ngneat/error-tailor": "^2.2.0", + "@ngneat/falso": "^6.4.0", + "@ngx-translate/core": "^14.0.0", + "@ngx-translate/http-loader": "^7.0.0", + "@onecx/accelerator": "^3.7.1", + "@onecx/integration-interface": "^3.7.1", + "@onecx/keycloak-auth": "^3.7.1", + "@onecx/portal-integration-angular": "^3.7.1", + "@onecx/portal-layout-styles": "^3.7.1", + "file-saver": "^2.0.5", + "i18n-iso-countries": "^7.6.0", + "ngx-color": "^8.0.3", + "primeflex": "^3.3.1", + "primeicons": "^6.0.1", + "primeng": "15.2.1", + "rxjs": "7.8.1", + "tslib": "^2.5.0", + "zod": "^3.22.1", + "zone.js": "~0.12.0" + }, + "devDependencies": { + "@angular-devkit/build-angular": "15.2.6", + "@angular-devkit/core": "15.2.6", + "@angular-devkit/schematics": "15.2.6", + "@angular-eslint/builder": "15.2.1", + "@angular-eslint/eslint-plugin": "15.2.1", + "@angular-eslint/eslint-plugin-template": "15.2.1", + "@angular-eslint/schematics": "15.2.1", + "@angular-eslint/template-parser": "15.2.1", + "@angular/cli": "~15.2.0", + "@angular/compiler-cli": "15.2.7", + "@angular/language-service": "15.2.7", + "@commitlint/cli": "^17.6.3", + "@commitlint/config-conventional": "^17.6.3", + "@docusaurus/module-type-aliases": "~2.4.0", + "@jscutlery/semver": "^2.30.1", + "@openapitools/openapi-generator-cli": "^2.6.0", + "@schematics/angular": "15.2.6", + "@storybook/addon-essentials": "7.0.4", + "@storybook/angular": "7.0.4", + "@storybook/core-server": "7.0.4 ", + "@svgr/webpack": "^7.0.0", + "@swc-node/register": "^1.6.5", + "@swc/cli": "~0.1.63", + "@swc/core": "^1.3.56", + "@swc/helpers": "0.5.1", + "@types/jasmine": "~3.10.0", + "@types/node": "18.16.3", + "@typescript-eslint/eslint-plugin": "5.48.2", + "@typescript-eslint/parser": "5.48.2", + "autoprefixer": "10.4.14", + "chromatic": "^6.17.4", + "css-loader": "^6.7.3", + "cypress": "^12.11.0", + "eslint": "^8.33.0", + "eslint-config-prettier": "8.8.0", + "eslint-plugin-cypress": "^2.13.3", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-jsx-a11y": "6.7.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-storybook": "^0.6.12", + "husky": "^8.0.3", + "jasmine-core": "~4.0.0", + "jasmine-spec-reporter": "^7.0.0", + "jsonc-eslint-parser": "^2.2.0", + "karma": "^6.4.2", + "karma-chrome-launcher": "^3.2.0", + "karma-coverage": "^2.2.0", + "karma-jasmine": "^5.1.0", + "karma-jasmine-html-reporter": "^2.0.0", + "karma-sonarqube-unit-reporter": "^0.0.23", + "msw": "^1.2.1", + "msw-storybook-addon": "^1.8.0", + "ng-packagr": "15.2.2", + "ngx-build-plus": "^14.0.0", + "ngx-translate-testing": "^6.1.0", + "postcss": "8.4.23", + "postcss-import": "~15.1.0", + "postcss-preset-env": "~9.3.0", + "postcss-url": "~10.1.3", + "prettier": "^2.8.8", + "sonarqube-scanner": "^3.3.0", + "style-loader": "^3.3.2", + "stylus": "^0.59.0", + "stylus-loader": "^7.1.0", + "tailwindcss": "3.3.2", + "ts-node": "10.9.1", + "typescript": "4.9.5", + "url-loader": "^4.1.1", + "webpack": "^5.82.0", + "webpack-merge": "^5.8.0", + "winston": "^3.8.2" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-architects/module-federation": { + "version": "15.0.0", + "license": "MIT", + "dependencies": { + "@angular-architects/module-federation-runtime": "15.0.0", + "callsite": "^1.0.0", + "node-fetch": "^2.6.7", + "semver": "^7.3.5", + "word-wrap": "^1.2.3" + }, + "peerDependencies": { + "@angular/common": ">=15.0.0", + "@angular/core": ">=15.0.0", + "@angular/platform-browser-dynamic": ">=15.0.0", + "rxjs": ">=6.6.3" + } + }, + "node_modules/@angular-architects/module-federation-runtime": { + "version": "15.0.0", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": ">=15.0.0", + "@angular/core": ">=15.0.0", + "@angular/platform-browser-dynamic": ">=15.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1502.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "15.2.10", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { + "version": "15.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "6.6.7", + "source-map": "0.7.4" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/architect/node_modules/rxjs": { + "version": "6.6.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/architect/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/@angular-devkit/build-angular": { + "version": "15.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.2.0", + "@angular-devkit/architect": "0.1502.6", + "@angular-devkit/build-webpack": "0.1502.6", + "@angular-devkit/core": "15.2.6", + "@babel/core": "7.20.12", + "@babel/generator": "7.20.14", + "@babel/helper-annotate-as-pure": "7.18.6", + "@babel/helper-split-export-declaration": "7.18.6", + "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.20.7", + "@babel/plugin-transform-runtime": "7.19.6", + "@babel/preset-env": "7.20.2", + "@babel/runtime": "7.20.13", + "@babel/template": "7.20.7", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "15.2.6", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.13", + "babel-loader": "9.1.2", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "4.21.5", + "cacache": "17.0.4", + "chokidar": "3.5.3", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.16", + "css-loader": "6.7.3", + "esbuild-wasm": "0.17.8", + "glob": "8.1.0", + "https-proxy-agent": "5.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.3", + "less-loader": "11.1.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.1", + "magic-string": "0.29.0", + "mini-css-extract-plugin": "2.7.2", + "open": "8.4.1", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "piscina": "3.2.0", + "postcss": "8.4.21", + "postcss-loader": "7.0.2", + "resolve-url-loader": "5.0.0", + "rxjs": "6.6.7", + "sass": "1.58.1", + "sass-loader": "13.2.0", + "semver": "7.3.8", + "source-map-loader": "4.0.1", + "source-map-support": "0.5.21", + "terser": "5.16.3", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.5.0", + "webpack": "5.76.1", + "webpack-dev-middleware": "6.0.1", + "webpack-dev-server": "4.11.1", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.17.8" + }, + "peerDependencies": { + "@angular/compiler-cli": "^15.0.0", + "@angular/localize": "^15.0.0", + "@angular/platform-server": "^15.0.0", + "@angular/service-worker": "^15.0.0", + "karma": "^6.3.0", + "ng-packagr": "^15.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=4.8.2 <5.0" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { + "version": "0.1502.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "15.2.6", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { + "version": "7.20.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@types/estree": { + "version": "0.0.51", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/autoprefixer": { + "version": "10.4.13", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/css-loader": { + "version": "6.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/es-module-lexer": { + "version": "0.9.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss": { + "version": "8.4.21", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { + "version": "6.6.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/semver": { + "version": "7.3.8", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/tslib": { + "version": "2.5.0", + "dev": true, + "license": "0BSD" + }, + "node_modules/@angular-devkit/build-angular/node_modules/webpack": { + "version": "5.76.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/webpack-merge": { + "version": "5.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1502.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.1502.6", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { + "version": "0.1502.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "15.2.6", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "6.6.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/@angular-devkit/core": { + "version": "15.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "6.6.7", + "source-map": "0.7.4" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "6.6.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/core/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/@angular-devkit/schematics": { + "version": "15.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "15.2.6", + "jsonc-parser": "3.2.0", + "magic-string": "0.29.0", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "6.6.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/@angular-eslint/builder": { + "version": "15.2.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "15.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "15.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/utils": "15.2.1", + "@typescript-eslint/utils": "5.48.2" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "15.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "15.2.1", + "@angular-eslint/utils": "15.2.1", + "@typescript-eslint/type-utils": "5.48.2", + "@typescript-eslint/utils": "5.48.2", + "aria-query": "5.1.3", + "axobject-query": "3.1.1" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/schematics": { + "version": "15.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/eslint-plugin": "15.2.1", + "@angular-eslint/eslint-plugin-template": "15.2.1", + "ignore": "5.2.4", + "strip-json-comments": "3.1.1", + "tmp": "0.2.1" + }, + "peerDependencies": { + "@angular/cli": ">= 15.0.0 < 16.0.0" + } + }, + "node_modules/@angular-eslint/template-parser": { + "version": "15.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "15.2.1", + "eslint-scope": "^7.0.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/utils": { + "version": "15.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "15.2.1", + "@typescript-eslint/utils": "5.48.2" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular/animations": { + "version": "15.2.7", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "15.2.7" + } + }, + "node_modules/@angular/cdk": { + "version": "15.2.9", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "parse5": "^7.1.2" + }, + "peerDependencies": { + "@angular/common": "^15.0.0 || ^16.0.0", + "@angular/core": "^15.0.0 || ^16.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cli": { + "version": "15.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.1502.10", + "@angular-devkit/core": "15.2.10", + "@angular-devkit/schematics": "15.2.10", + "@schematics/angular": "15.2.10", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.3", + "ini": "3.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "npm-package-arg": "10.1.0", + "npm-pick-manifest": "8.0.1", + "open": "8.4.1", + "ora": "5.4.1", + "pacote": "15.1.0", + "resolve": "1.22.1", + "semver": "7.5.3", + "symbol-observable": "4.0.0", + "yargs": "17.6.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/@angular-devkit/core": { + "version": "15.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "6.6.7", + "source-map": "0.7.4" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular/cli/node_modules/@angular-devkit/schematics": { + "version": "15.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "15.2.10", + "jsonc-parser": "3.2.0", + "magic-string": "0.29.0", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/@schematics/angular": { + "version": "15.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "15.2.10", + "@angular-devkit/schematics": "15.2.10", + "jsonc-parser": "3.2.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular/cli/node_modules/rxjs": { + "version": "6.6.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular/cli/node_modules/semver": { + "version": "7.5.3", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular/cli/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/@angular/cli/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@angular/common": { + "version": "15.2.7", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "15.2.7", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "15.2.7", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "15.2.7" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "15.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "7.19.3", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.27.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/main-ngcc.js" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/compiler": "15.2.7", + "typescript": ">=4.8.2 <5.0" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.19.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.3", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/compiler-cli/node_modules/magic-string": { + "version": "0.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/core": { + "version": "15.2.7", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.11.4 || ~0.12.0 || ~0.13.0" + } + }, + "node_modules/@angular/forms": { + "version": "15.2.7", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "15.2.7", + "@angular/core": "15.2.7", + "@angular/platform-browser": "15.2.7", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/language-service": { + "version": "15.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "15.2.7", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/animations": "15.2.7", + "@angular/common": "15.2.7", + "@angular/core": "15.2.7" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "15.2.7", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "15.2.7", + "@angular/compiler": "15.2.7", + "@angular/core": "15.2.7", + "@angular/platform-browser": "15.2.7" + } + }, + "node_modules/@angular/router": { + "version": "15.2.7", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "15.2.7", + "@angular/core": "15.2.7", + "@angular/platform-browser": "15.2.7", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.10.1", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@aw-web-design/x-default-browser": { + "version": "1.4.88", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser-id": "3.0.0" + }, + "bin": { + "x-default-browser": "bin/x-default-browser.js" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/@babel/generator": { + "version": "7.23.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/template": { + "version": "7.22.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/browserslist": { + "version": "4.22.2", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/template": { + "version": "7.22.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { + "version": "7.22.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.22.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { + "version": "7.22.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-flow": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.19.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.23.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.20.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-flow": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-flow-strip-types": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register": { + "version": "7.23.7", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.6", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register/node_modules/find-cache-dir": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/make-dir": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/register/node_modules/p-locate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/register/node_modules/pify": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/pkg-dir": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.20.13", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.23.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@commitlint/cli": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/format": "^17.8.1", + "@commitlint/lint": "^17.8.1", + "@commitlint/load": "^17.8.1", + "@commitlint/read": "^17.8.1", + "@commitlint/types": "^17.8.1", + "execa": "^5.0.0", + "lodash.isfunction": "^3.0.9", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-changelog-conventionalcommits": "^6.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^17.8.1", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/ensure": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^17.8.1", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/format": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^17.8.1", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/format/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/format/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/format/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/format/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^17.8.1", + "semver": "7.5.4" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/lint": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/is-ignored": "^17.8.1", + "@commitlint/parse": "^17.8.1", + "@commitlint/rules": "^17.8.1", + "@commitlint/types": "^17.8.1" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^17.8.1", + "@commitlint/execute-rule": "^17.8.1", + "@commitlint/resolve-extends": "^17.8.1", + "@commitlint/types": "^17.8.1", + "@types/node": "20.5.1", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4 || ^5.2.2" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load/node_modules/@types/node": { + "version": "20.5.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@commitlint/load/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/load/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/load/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/message": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/parse": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^17.8.1", + "conventional-changelog-angular": "^6.0.0", + "conventional-commits-parser": "^4.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/read": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/top-level": "^17.8.1", + "@commitlint/types": "^17.8.1", + "fs-extra": "^11.0.0", + "git-raw-commits": "^2.0.11", + "minimist": "^1.2.6" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^17.8.1", + "@commitlint/types": "^17.8.1", + "import-fresh": "^3.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/rules": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/ensure": "^17.8.1", + "@commitlint/message": "^17.8.1", + "@commitlint/to-lines": "^17.8.1", + "@commitlint/types": "^17.8.1", + "execa": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/top-level": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/types": { + "version": "17.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/types/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/types/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/types/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/types/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "1.0.7", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-4.0.0.tgz", + "integrity": "sha512-wjyXB22/h2OvxAr3jldPB7R7kjTUEzopvjitS8jWtyd8fN6xJ8vy1HnHu0ZNfEkqpBJgQ76Q+sBDshWcMvTa/w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "1.1.6", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.5.1.tgz", + "integrity": "sha512-x+SajGB2paGrTjPOUorGi8iCztF008YMKXTn+XzGVDBEIVJ/W1121pPerpneJYGOe1m6zWLPLnzOPaznmQxKFw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/color-helpers": "^4.0.0", + "@csstools/css-calc": "^1.1.6" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "2.5.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^2.2.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "2.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "2.1.7", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-4.0.2.tgz", + "integrity": "sha512-PqM+jvg5T2tB4FHX+akrMGNWAygLupD4FNUjcv4PSvtVuWZ6ISxuo37m4jFGU7Jg3rCfloGzKd0+xfr5Ec3vZQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-specificity": "^3.0.1", + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.9.tgz", + "integrity": "sha512-6Hbkw/4k73UH121l4LG+LNLKSvrfHqk3GHHH0A6/iFlD0xGmsWAr80Jd0VqXjfYbUTOGmJTOMMoxv3jvNxt1uw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.5.1", + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3", + "@csstools/postcss-progressive-custom-properties": "^3.0.3" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.9.tgz", + "integrity": "sha512-fs1SOWJ/44DQSsDeJP+rxAkP2MYkCg6K4ZB8qJwFku2EjurgCAPiPZJvC6w94T1hBBinJwuMfT9qvvvniXyVgw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.5.1", + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3", + "@csstools/postcss-progressive-custom-properties": "^3.0.3" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-1.0.3.tgz", + "integrity": "sha512-IfGtEg3eC4b8Nd/kPgO3SxgKb33YwhHVsL0eJ3UYihx6fzzAiZwNbWmVW9MZTQjZ5GacgKxa4iAHikGvpwuIjw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^1.1.6", + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-3.0.1.tgz", + "integrity": "sha512-D1lcG2sfotTq6yBEOMV3myFxJLT10F3DLYZJMbiny5YToqzHWodZen8WId3UTimm0mEHitXqAUNL5jdd6RzVdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-1.0.2.tgz", + "integrity": "sha512-zf9KHGM2PTuJEm4ZYg4DTmzCir38EbZBzlMPMbA4jbhLDqXHkqwnQ+Z5+UNrU8y6seVu5B4vzZmZarTFQwe+Ig==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.5.1", + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.9.tgz", + "integrity": "sha512-PSqR6QH7h3ggOl8TsoH73kbwYTKVQjAJauGg6nDKwaGfi5IL5StV//ehrv1C7HuPsHixMTc9YoAuuv1ocT20EQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.5.1", + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3", + "@csstools/postcss-progressive-custom-properties": "^3.0.3" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.8.tgz", + "integrity": "sha512-CRQEG372Hivmt17rm/Ho22hBQI9K/a6grzGQ21Zwc7dyspmyG0ibmPIW8hn15vJmXqWGeNq7S+L2b8/OrU7O5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.5.1", + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-3.0.3.tgz", + "integrity": "sha512-MpcmIL0/uMm/cFWh5V/9nbKKJ7jRr2qTYW5Q6zoE6HZ6uzOBJr2KRERv5/x8xzEBQ1MthDT7iP1EBp9luSQy7g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^3.0.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-1.0.1.tgz", + "integrity": "sha512-wtb+IbUIrIf8CrN6MLQuFR7nlU5C7PwuebfeEXfjthUha1+XZj2RVi+5k/lukToA24sZkYAiSJfHM8uG/UZIdg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-4.0.4.tgz", + "integrity": "sha512-vTVO/uZixpTVAOQt3qZRUFJ/K1L03OfNkeJ8sFNDVNdVy/zW0h1L5WT7HIPMDUkvSrxQkFaCCybTZkUP7UESlQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-specificity": "^3.0.1", + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-2.0.1.tgz", + "integrity": "sha512-SsrWUNaXKr+e/Uo4R/uIsqJYt3DaggIh/jyZdhy/q8fECoJSKsSMr7nObSLdvoULB69Zb6Bs+sefEIoMG/YfOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-1.0.1.tgz", + "integrity": "sha512-Kl4lAbMg0iyztEzDhZuQw8Sj9r2uqFDcU1IPl+AAt2nue8K/f1i7ElvKtXkjhIAmKiy5h2EY8Gt/Cqg0pYFDCw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-1.0.1.tgz", + "integrity": "sha512-+kHamNxAnX8ojPCtV8WPcUP3XcqMFBSDuBuvT6MHgq7oX4IQxLIXKx64t7g9LiuJzE7vd06Q9qUYR6bh4YnGpQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-2.0.1.tgz", + "integrity": "sha512-W5Gtwz7oIuFcKa5SmBjQ2uxr8ZoL7M2bkoIf0T1WeNqljMkBrfw1DDA8/J83k57NQ1kcweJEjkJ04pUkmyee3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-2.0.5.tgz", + "integrity": "sha512-2fjSamKN635DSW6fEoyNd2Bkpv3FVblUpgk5cpghIgPW1aDHZE2SYfZK5xQALvjMYZVjfqsD5EbXA7uDVBQVQA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-tokenizer": "^2.2.3" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "1.1.2", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^1.1.6", + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3", + "@csstools/media-query-list-parser": "^2.1.7" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-2.0.5.tgz", + "integrity": "sha512-XHMPasWYPWa9XaUHXU6Iq0RLfoAI+nvGTPj51hOizNsHaAyFiq2SL4JvF1DU8lM6B70+HVzKM09Isbyrr755Bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3", + "@csstools/media-query-list-parser": "^2.1.7" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-3.0.1.tgz", + "integrity": "sha512-bwwababZpWRm0ByHaWBxTsDGTMhZKmtUNl3Wt0Eom8AY7ORgXx5qF9SSk1vEFrCi+HOfJT6M6W5KPgzXuQNRwQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-3.0.2.tgz", + "integrity": "sha512-fCapyyT/dUdyPtrelQSIV+d5HqtTgnNP/BEG9IuhgXHt93Wc4CfC1bQ55GzKAjWrZbgakMQ7MLfCXEf3rlZJOw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.9.tgz", + "integrity": "sha512-l639gpcBfL3ogJe+og1M5FixQn8iGX8+29V7VtTSCUB37VzpzOC05URfde7INIdiJT65DkHzgdJ64/QeYggU8A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.5.1", + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3", + "@csstools/postcss-progressive-custom-properties": "^3.0.3" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-3.0.3.tgz", + "integrity": "sha512-WipTVh6JTMQfeIrzDV4wEPsV9NTzMK2jwXxyH6CGBktuWdivHnkioP/smp1x/0QDPQyx7NTS14RB+GV3zZZYEw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.9.tgz", + "integrity": "sha512-2UoaRd2iIuzUGtYgteN5fJ0s+OfCiV7PvCnw8MCh3om8+SeVinfG8D5sqBOvImxFVfrp6k60XF5RFlH6oc//fg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.5.1", + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3", + "@csstools/postcss-progressive-custom-properties": "^3.0.3" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-3.0.1.tgz", + "integrity": "sha512-3ZFonK2gfgqg29gUJ2w7xVw2wFJ1eNWVDONjbzGkm73gJHVCYK5fnCqlLr+N+KbEfv2XbWAO0AaOJCFB6Fer6A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-3.0.4.tgz", + "integrity": "sha512-gyNQ2YaOVXPqLR737XtReRPVu7DGKBr9JBDLoiH1T+N1ggV3r4HotRCOC1l6rxVC0zOuU1KiOzUn9Z5W838/rg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^1.1.6", + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-3.0.4.tgz", + "integrity": "sha512-yUZmbnUemgQmja7SpOZeU45+P49wNEgQguRdyTktFkZsHf7Gof+ZIYfvF6Cm+LsU1PwSupy4yUeEKKjX5+k6cQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/color-helpers": "^4.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-3.0.4.tgz", + "integrity": "sha512-qj4Cxth6c38iNYzfJJWAxt8jsLrZaMVmbfGDDLOlI2YJeZoC3A5Su6/Kr7oXaPFRuspUu+4EQHngOktqVHWfVg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^1.1.6", + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-3.0.1.tgz", + "integrity": "sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.1.tgz", + "integrity": "sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.13" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@cypress/request": { + "version": "2.88.12", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.10.3", + "safe-buffer": "^5.1.2", + "tough-cookie": "^4.1.3", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/request/node_modules/form-data": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@cypress/request/node_modules/qs": { + "version": "6.10.4", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "2.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "2.4.3", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/types": { + "version": "2.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.6.0", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.73.0", + "webpack-merge": "^5.8.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/types/node_modules/react-helmet-async": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.8", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fal-works/esbuild-plugin-global-externals": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hutson/parse-repository-url": { + "version": "3.0.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jscutlery/semver": { + "version": "2.30.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "conventional-changelog": "^3.1.25", + "conventional-recommended-bump": "^6.1.0", + "detect-indent": "6.1.0", + "inquirer": "8.2.5", + "rxjs": "7.8.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@nrwl/devkit": "^15.0.0" + } + }, + "node_modules/@jscutlery/semver/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jscutlery/semver/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jscutlery/semver/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jscutlery/semver/node_modules/inquirer": { + "version": "8.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@jscutlery/semver/node_modules/rxjs": { + "version": "7.8.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@jscutlery/semver/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "license": "MIT", + "peer": true + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@mdx-js/react": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0", + "@types/react": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "react": ">=16" + } + }, + "node_modules/@mole-inc/bin-wrapper": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bin-check": "^4.1.0", + "bin-version-check": "^5.0.0", + "content-disposition": "^0.5.4", + "ext-name": "^5.0.0", + "file-type": "^17.1.6", + "filenamify": "^5.0.2", + "got": "^11.8.5", + "os-filter-obj": "^2.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@mswjs/cookies": { + "version": "0.2.2", + "license": "MIT", + "dependencies": { + "@types/set-cookie-parser": "^2.4.0", + "set-cookie-parser": "^2.4.6" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@mswjs/interceptors": { + "version": "0.17.10", + "license": "MIT", + "dependencies": { + "@open-draft/until": "^1.0.3", + "@types/debug": "^4.1.7", + "@xmldom/xmldom": "^0.8.3", + "debug": "^4.3.3", + "headers-polyfill": "3.2.5", + "outvariant": "^1.2.1", + "strict-event-emitter": "^0.2.4", + "web-encoding": "^1.1.5" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@mswjs/interceptors/node_modules/strict-event-emitter": { + "version": "0.2.8", + "license": "MIT", + "dependencies": { + "events": "^3.3.0" + } + }, + "node_modules/@ndelangen/get-tarball": { + "version": "3.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "gunzip-maybe": "^1.4.2", + "pump": "^3.0.0", + "tar-fs": "^2.1.1" + } + }, + "node_modules/@nestjs/axios": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", + "axios": "^1.3.1", + "reflect-metadata": "^0.1.12", + "rxjs": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/@nestjs/common": { + "version": "10.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "iterare": "1.2.1", + "tslib": "2.6.2", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/core": { + "version": "10.3.0", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@nuxtjs/opencollective": "0.3.2", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "3.2.0", + "tslib": "2.6.2", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0", + "@nestjs/microservices": "^10.0.0", + "@nestjs/platform-express": "^10.0.0", + "@nestjs/websockets": "^10.0.0", + "reflect-metadata": "^0.1.12", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } + } + }, + "node_modules/@ngneat/error-tailor": { + "version": "2.2.2", + "license": "MIT", + "dependencies": { + "tslib": "2.3.1" + }, + "peerDependencies": { + "@angular/core": ">=13.0.0" + } + }, + "node_modules/@ngneat/error-tailor/node_modules/tslib": { + "version": "2.3.1", + "license": "0BSD" + }, + "node_modules/@ngneat/falso": { + "version": "6.4.0", + "license": "MIT", + "dependencies": { + "seedrandom": "3.0.5", + "uuid": "8.3.2" + } + }, + "node_modules/@ngneat/until-destroy": { + "version": "9.2.3", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/core": ">=13", + "rxjs": "^6.4.0 || ^7.0.0" + } + }, + "node_modules/@ngrx/effects": { + "version": "15.4.0", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/core": "^15.0.0", + "@ngrx/store": "15.4.0", + "rxjs": "^6.5.3 || ^7.5.0" + } + }, + "node_modules/@ngrx/router-store": { + "version": "15.4.0", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": "^15.0.0", + "@angular/core": "^15.0.0", + "@angular/router": "^15.0.0", + "@ngrx/store": "15.4.0", + "rxjs": "^6.5.3 || ^7.5.0" + } + }, + "node_modules/@ngrx/store": { + "version": "15.4.0", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/core": "^15.0.0", + "rxjs": "^6.5.3 || ^7.5.0" + } + }, + "node_modules/@ngtools/webpack": { + "version": "15.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^15.0.0", + "typescript": ">=4.8.2 <5.0", + "webpack": "^5.54.0" + } + }, + "node_modules/@ngx-translate/core": { + "version": "14.0.0", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/core": ">=13.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@ngx-translate/http-loader": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=13.0.0", + "@ngx-translate/core": ">=14.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nrwl/devkit": { + "version": "15.9.7", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.5.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 14.1 <= 16" + } + }, + "node_modules/@nrwl/tao": { + "version": "16.10.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "nx": "16.10.0", + "tslib": "^2.3.0" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nuxtjs/opencollective": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/@nuxtjs/opencollective/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@nuxtjs/opencollective/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nuxtjs/opencollective/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nuxtjs/opencollective/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "16.10.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "16.10.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@onecx/accelerator": { + "version": "3.9.0", + "peerDependencies": { + "rxjs": "7.8.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@onecx/integration-interface": { + "version": "3.9.0", + "peerDependencies": { + "@onecx/accelerator": "^3", + "rxjs": "7.8.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@onecx/keycloak-auth": { + "version": "3.9.0", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=15.2.7", + "@angular/core": ">=15.2.7", + "@onecx/portal-integration-angular": "~3", + "keycloak-angular": "^13.0.0", + "keycloak-js": "^18.0.0", + "rxjs": "~7.8.0" + } + }, + "node_modules/@onecx/portal-integration-angular": { + "version": "3.9.0", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular-architects/module-federation": "15.0.0", + "@angular/animations": "^15.2.7", + "@angular/cdk": "^15.2.7", + "@angular/common": "^15.2.7", + "@angular/core": "^15.2.7", + "@angular/forms": "^15.2.7", + "@angular/platform-browser": "^15.2.7", + "@angular/router": "^15.2.7", + "@ngneat/until-destroy": "^9.2.2", + "@ngrx/effects": "^15.4.0", + "@ngrx/router-store": "^15.4.0", + "@ngrx/store": "^15.4.0", + "@ngx-translate/core": "^14.0.0", + "@ngx-translate/http-loader": "^7.0.0", + "@onecx/integration-interface": "^3", + "chart.js": "^4.4.0", + "d3-scale-chromatic": "^3.0.0", + "fast-deep-equal": "^3.1.3", + "msw": "^1.3.2", + "primeng": "^15.2.1", + "rxjs": "~7.8.0", + "zod": "^3.22.1" + } + }, + "node_modules/@onecx/portal-layout-styles": { + "version": "3.9.0", + "peerDependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@open-draft/until": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/@openapitools/openapi-generator-cli": { + "version": "2.8.0", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@nestjs/axios": "3.0.1", + "@nestjs/common": "10.3.0", + "@nestjs/core": "10.3.0", + "@nuxtjs/opencollective": "0.3.2", + "axios": "1.6.5", + "chalk": "4.1.2", + "commander": "8.3.0", + "compare-versions": "4.1.4", + "concurrently": "6.5.1", + "console.table": "0.10.0", + "fs-extra": "10.1.0", + "glob": "7.2.3", + "inquirer": "8.2.5", + "lodash": "4.17.21", + "reflect-metadata": "0.1.13", + "rxjs": "7.8.0", + "tslib": "2.6.2" + }, + "bin": { + "openapi-generator-cli": "main.js" + }, + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/openapi_generator" + } + }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/commander": { + "version": "8.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/inquirer": { + "version": "8.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/reflect-metadata": { + "version": "0.1.13", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/rxjs": { + "version": "7.8.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.0.4", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.1", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@schematics/angular": { + "version": "15.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "15.2.6", + "@angular-devkit/schematics": "15.2.6", + "jsonc-parser": "3.2.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@sigstore/bundle": { + "version": "1.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "1.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { + "version": "11.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sigstore/sign/node_modules/minipass-fetch": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/@sigstore/sign/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@sigstore/tuf": { + "version": "1.0.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/addon-actions": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "7.0.4", + "@storybook/components": "7.0.4", + "@storybook/core-events": "7.0.4", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "7.0.4", + "@storybook/preview-api": "7.0.4", + "@storybook/theming": "7.0.4", + "@storybook/types": "7.0.4", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "polished": "^4.2.2", + "prop-types": "^15.7.2", + "react-inspector": "^6.0.0", + "telejson": "^7.0.3", + "ts-dedent": "^2.0.0", + "uuid-browser": "^3.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-backgrounds": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "7.0.4", + "@storybook/components": "7.0.4", + "@storybook/core-events": "7.0.4", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "7.0.4", + "@storybook/preview-api": "7.0.4", + "@storybook/theming": "7.0.4", + "@storybook/types": "7.0.4", + "memoizerific": "^1.11.3", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-controls": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/blocks": "7.0.4", + "@storybook/client-logger": "7.0.4", + "@storybook/components": "7.0.4", + "@storybook/core-common": "7.0.4", + "@storybook/manager-api": "7.0.4", + "@storybook/node-logger": "7.0.4", + "@storybook/preview-api": "7.0.4", + "@storybook/theming": "7.0.4", + "@storybook/types": "7.0.4", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-docs": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.20.2", + "@babel/plugin-transform-react-jsx": "^7.19.0", + "@jest/transform": "^29.3.1", + "@mdx-js/react": "^2.1.5", + "@storybook/blocks": "7.0.4", + "@storybook/client-logger": "7.0.4", + "@storybook/components": "7.0.4", + "@storybook/csf-plugin": "7.0.4", + "@storybook/csf-tools": "7.0.4", + "@storybook/global": "^5.0.0", + "@storybook/mdx2-csf": "^1.0.0", + "@storybook/node-logger": "7.0.4", + "@storybook/postinstall": "7.0.4", + "@storybook/preview-api": "7.0.4", + "@storybook/react-dom-shim": "7.0.4", + "@storybook/theming": "7.0.4", + "@storybook/types": "7.0.4", + "fs-extra": "^11.1.0", + "remark-external-links": "^8.0.0", + "remark-slug": "^6.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addon-essentials": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/addon-actions": "7.0.4", + "@storybook/addon-backgrounds": "7.0.4", + "@storybook/addon-controls": "7.0.4", + "@storybook/addon-docs": "7.0.4", + "@storybook/addon-highlight": "7.0.4", + "@storybook/addon-measure": "7.0.4", + "@storybook/addon-outline": "7.0.4", + "@storybook/addon-toolbars": "7.0.4", + "@storybook/addon-viewport": "7.0.4", + "@storybook/core-common": "7.0.4", + "@storybook/manager-api": "7.0.4", + "@storybook/node-logger": "7.0.4", + "@storybook/preview-api": "7.0.4", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addon-highlight": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/core-events": "7.0.4", + "@storybook/global": "^5.0.0", + "@storybook/preview-api": "7.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-measure": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "7.0.4", + "@storybook/components": "7.0.4", + "@storybook/core-events": "7.0.4", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "7.0.4", + "@storybook/preview-api": "7.0.4", + "@storybook/types": "7.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-outline": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "7.0.4", + "@storybook/components": "7.0.4", + "@storybook/core-events": "7.0.4", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "7.0.4", + "@storybook/preview-api": "7.0.4", + "@storybook/types": "7.0.4", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-toolbars": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "7.0.4", + "@storybook/components": "7.0.4", + "@storybook/manager-api": "7.0.4", + "@storybook/preview-api": "7.0.4", + "@storybook/theming": "7.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-viewport": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "7.0.4", + "@storybook/components": "7.0.4", + "@storybook/core-events": "7.0.4", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "7.0.4", + "@storybook/preview-api": "7.0.4", + "@storybook/theming": "7.0.4", + "memoizerific": "^1.11.3", + "prop-types": "^15.7.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addons": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/manager-api": "7.0.4", + "@storybook/preview-api": "7.0.4", + "@storybook/types": "7.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/angular": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/builder-webpack5": "7.0.4", + "@storybook/cli": "7.0.4", + "@storybook/client-logger": "7.0.4", + "@storybook/core-client": "7.0.4", + "@storybook/core-common": "7.0.4", + "@storybook/core-events": "7.0.4", + "@storybook/core-server": "7.0.4", + "@storybook/core-webpack": "7.0.4", + "@storybook/docs-tools": "7.0.4", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "7.0.4", + "@storybook/node-logger": "7.0.4", + "@storybook/preview-api": "7.0.4", + "@storybook/telemetry": "7.0.4", + "@storybook/types": "7.0.4", + "@types/node": "^16.0.0", + "@types/react": "^16.14.34", + "@types/react-dom": "^16.9.14", + "@types/semver": "^7.3.4", + "@types/webpack-env": "^1.18.0", + "find-up": "^5.0.0", + "read-pkg-up": "^7.0.1", + "semver": "^7.3.7", + "telejson": "^7.0.3", + "ts-dedent": "^2.0.0", + "tsconfig-paths-webpack-plugin": "^3.5.2", + "util-deprecate": "^1.0.2", + "webpack": "5" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@angular-devkit/architect": ">=0.1400.0 < 0.1600.0", + "@angular-devkit/build-angular": ">=14.1.0 < 16.0.0", + "@angular-devkit/core": ">=14.1.0 < 16.0.0", + "@angular/cli": ">=14.1.0 < 16.0.0", + "@angular/common": ">=14.1.0 < 16.0.0", + "@angular/compiler": ">=14.1.0 < 16.0.0", + "@angular/compiler-cli": ">=14.1.0 < 16.0.0", + "@angular/core": ">=14.1.0 < 16.0.0", + "@angular/forms": ">=14.1.0 < 16.0.0", + "@angular/platform-browser": ">=14.1.0 < 16.0.0", + "@angular/platform-browser-dynamic": ">=14.1.0 < 16.0.0", + "@babel/core": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "rxjs": "^6.0.0 || ^7.4.0", + "typescript": "^4.0.0", + "zone.js": "^0.8.29 || >= 0.9.0 < 1.0.0" + }, + "peerDependenciesMeta": { + "@angular/cli": { + "optional": true + } + } + }, + "node_modules/@storybook/angular/node_modules/@types/node": { + "version": "16.18.71", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/angular/node_modules/@types/react": { + "version": "16.14.56", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@storybook/api": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "7.0.4", + "@storybook/manager-api": "7.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/blocks": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/channels": "7.0.4", + "@storybook/client-logger": "7.0.4", + "@storybook/components": "7.0.4", + "@storybook/core-events": "7.0.4", + "@storybook/csf": "^0.1.0", + "@storybook/docs-tools": "7.0.4", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "7.0.4", + "@storybook/preview-api": "7.0.4", + "@storybook/theming": "7.0.4", + "@storybook/types": "7.0.4", + "@types/lodash": "^4.14.167", + "color-convert": "^2.0.1", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "markdown-to-jsx": "^7.1.8", + "memoizerific": "^1.11.3", + "polished": "^4.2.2", + "react-colorful": "^5.1.2", + "telejson": "^7.0.3", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/builder-manager": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@fal-works/esbuild-plugin-global-externals": "^2.1.2", + "@storybook/core-common": "7.0.4", + "@storybook/manager": "7.0.4", + "@storybook/node-logger": "7.0.4", + "@types/ejs": "^3.1.1", + "@types/find-cache-dir": "^3.2.1", + "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", + "browser-assert": "^1.2.1", + "ejs": "^3.1.8", + "esbuild": "^0.17.0", + "esbuild-plugin-alias": "^0.2.1", + "express": "^4.17.3", + "find-cache-dir": "^3.0.0", + "fs-extra": "^11.1.0", + "process": "^0.11.10", + "util": "^0.12.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-webpack5": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.10", + "@storybook/addons": "7.0.4", + "@storybook/api": "7.0.4", + "@storybook/channel-postmessage": "7.0.4", + "@storybook/channel-websocket": "7.0.4", + "@storybook/channels": "7.0.4", + "@storybook/client-api": "7.0.4", + "@storybook/client-logger": "7.0.4", + "@storybook/components": "7.0.4", + "@storybook/core-common": "7.0.4", + "@storybook/core-events": "7.0.4", + "@storybook/core-webpack": "7.0.4", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "7.0.4", + "@storybook/node-logger": "7.0.4", + "@storybook/preview": "7.0.4", + "@storybook/preview-api": "7.0.4", + "@storybook/router": "7.0.4", + "@storybook/store": "7.0.4", + "@storybook/theming": "7.0.4", + "@types/node": "^16.0.0", + "@types/semver": "^7.3.4", + "babel-loader": "^9.0.0", + "babel-plugin-named-exports-order": "^0.0.2", + "browser-assert": "^1.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.7.1", + "express": "^4.17.3", + "fork-ts-checker-webpack-plugin": "^7.2.8", + "fs-extra": "^11.1.0", + "html-webpack-plugin": "^5.5.0", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "semver": "^7.3.7", + "style-loader": "^3.3.1", + "terser-webpack-plugin": "^5.3.1", + "ts-dedent": "^2.0.0", + "util": "^0.12.4", + "util-deprecate": "^1.0.2", + "webpack": "5", + "webpack-dev-middleware": "^5.3.1", + "webpack-hot-middleware": "^2.25.1", + "webpack-virtual-modules": "^0.4.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/@types/node": { + "version": "16.18.71", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/builder-webpack5/node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@storybook/channel-postmessage": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/channels": "7.0.4", + "@storybook/client-logger": "7.0.4", + "@storybook/core-events": "7.0.4", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/channel-websocket": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/channels": "7.0.4", + "@storybook/client-logger": "7.0.4", + "@storybook/global": "^5.0.0", + "telejson": "^7.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/channels": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/cli": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.20.2", + "@babel/preset-env": "^7.20.2", + "@ndelangen/get-tarball": "^3.0.7", + "@storybook/codemod": "7.0.4", + "@storybook/core-common": "7.0.4", + "@storybook/core-server": "7.0.4", + "@storybook/csf-tools": "7.0.4", + "@storybook/node-logger": "7.0.4", + "@storybook/telemetry": "7.0.4", + "@storybook/types": "7.0.4", + "@types/semver": "^7.3.4", + "boxen": "^5.1.2", + "chalk": "^4.1.0", + "commander": "^6.2.1", + "cross-spawn": "^7.0.3", + "detect-indent": "^6.1.0", + "envinfo": "^7.7.3", + "execa": "^5.0.0", + "express": "^4.17.3", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "get-npm-tarball-url": "^2.0.3", + "get-port": "^5.1.1", + "giget": "^1.0.0", + "globby": "^11.0.2", + "jscodeshift": "^0.14.0", + "leven": "^3.1.0", + "prettier": "^2.8.0", + "prompts": "^2.4.0", + "puppeteer-core": "^2.1.1", + "read-pkg-up": "^7.0.1", + "semver": "^7.3.7", + "shelljs": "^0.8.5", + "simple-update-notifier": "^1.0.0", + "strip-json-comments": "^3.0.1", + "tempy": "^1.0.1", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "bin": { + "getstorybook": "bin/index.js", + "sb": "bin/index.js" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/cli/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@storybook/cli/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/cli/node_modules/commander": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@storybook/cli/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/cli/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/client-api": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "7.0.4", + "@storybook/preview-api": "7.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/client-logger": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/codemod": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "~7.21.0", + "@babel/preset-env": "~7.21.0", + "@babel/types": "~7.21.2", + "@storybook/csf": "^0.1.0", + "@storybook/csf-tools": "7.0.4", + "@storybook/node-logger": "7.0.4", + "@storybook/types": "7.0.4", + "cross-spawn": "^7.0.3", + "globby": "^11.0.2", + "jscodeshift": "^0.14.0", + "lodash": "^4.17.21", + "prettier": "^2.8.0", + "recast": "^0.23.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/codemod/node_modules/@babel/core": { + "version": "7.21.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.8", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@storybook/codemod/node_modules/@babel/generator": { + "version": "7.23.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@storybook/codemod/node_modules/@babel/generator/node_modules/@babel/types": { + "version": "7.23.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@storybook/codemod/node_modules/@babel/preset-env": { + "version": "7.21.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", + "@babel/plugin-proposal-async-generator-functions": "^7.20.7", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.21.0", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.21.0", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.21.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.21.5", + "@babel/plugin-transform-async-to-generator": "^7.20.7", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.21.0", + "@babel/plugin-transform-classes": "^7.21.0", + "@babel/plugin-transform-computed-properties": "^7.21.5", + "@babel/plugin-transform-destructuring": "^7.21.3", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.21.5", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.20.11", + "@babel/plugin-transform-modules-commonjs": "^7.21.5", + "@babel/plugin-transform-modules-systemjs": "^7.20.11", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.21.3", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.21.5", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.20.7", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.21.5", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.21.5", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@storybook/codemod/node_modules/@babel/types": { + "version": "7.21.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@storybook/codemod/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@storybook/codemod/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/components": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "7.0.4", + "@storybook/csf": "^0.1.0", + "@storybook/global": "^5.0.0", + "@storybook/theming": "7.0.4", + "@storybook/types": "7.0.4", + "memoizerific": "^1.11.3", + "use-resize-observer": "^9.1.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/core-client": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "7.0.4", + "@storybook/preview-api": "7.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-common": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/node-logger": "7.0.4", + "@storybook/types": "7.0.4", + "@types/node": "^16.0.0", + "@types/pretty-hrtime": "^1.0.0", + "chalk": "^4.1.0", + "esbuild": "^0.17.0", + "esbuild-register": "^3.4.0", + "file-system-cache": "^2.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^8.1.0", + "glob-promise": "^6.0.2", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-common/node_modules/@types/node": { + "version": "16.18.71", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/core-common/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@storybook/core-common/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/core-common/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-common/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-events": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-server": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@aw-web-design/x-default-browser": "1.4.88", + "@discoveryjs/json-ext": "^0.5.3", + "@storybook/builder-manager": "7.0.4", + "@storybook/core-common": "7.0.4", + "@storybook/core-events": "7.0.4", + "@storybook/csf": "^0.1.0", + "@storybook/csf-tools": "7.0.4", + "@storybook/docs-mdx": "^0.1.0", + "@storybook/global": "^5.0.0", + "@storybook/manager": "7.0.4", + "@storybook/node-logger": "7.0.4", + "@storybook/preview-api": "7.0.4", + "@storybook/telemetry": "7.0.4", + "@storybook/types": "7.0.4", + "@types/detect-port": "^1.3.0", + "@types/node": "^16.0.0", + "@types/node-fetch": "^2.5.7", + "@types/pretty-hrtime": "^1.0.0", + "@types/semver": "^7.3.4", + "better-opn": "^2.1.1", + "boxen": "^5.1.2", + "chalk": "^4.1.0", + "cli-table3": "^0.6.1", + "compression": "^1.7.4", + "detect-port": "^1.3.0", + "express": "^4.17.3", + "fs-extra": "^11.1.0", + "globby": "^11.0.2", + "ip": "^2.0.0", + "lodash": "^4.17.21", + "node-fetch": "^2.6.7", + "open": "^8.4.0", + "pretty-hrtime": "^1.0.3", + "prompts": "^2.4.0", + "read-pkg-up": "^7.0.1", + "semver": "^7.3.7", + "serve-favicon": "^2.5.0", + "telejson": "^7.0.3", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "watchpack": "^2.2.0", + "ws": "^8.2.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-server/node_modules/@types/node": { + "version": "16.18.71", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/core-server/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@storybook/core-server/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/core-server/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-server/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-webpack": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/core-common": "7.0.4", + "@storybook/node-logger": "7.0.4", + "@storybook/types": "7.0.4", + "@types/node": "^16.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-webpack/node_modules/@types/node": { + "version": "16.18.71", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/csf": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^2.19.0" + } + }, + "node_modules/@storybook/csf-plugin": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf-tools": "7.0.4", + "unplugin": "^0.10.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/csf-tools": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/generator": "~7.21.1", + "@babel/parser": "~7.21.2", + "@babel/traverse": "~7.21.2", + "@babel/types": "~7.21.2", + "@storybook/csf": "^0.1.0", + "@storybook/types": "7.0.4", + "fs-extra": "^11.1.0", + "recast": "^0.23.1", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/csf-tools/node_modules/@babel/generator": { + "version": "7.21.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@storybook/csf-tools/node_modules/@babel/parser": { + "version": "7.21.9", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@storybook/csf-tools/node_modules/@babel/traverse": { + "version": "7.21.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@storybook/csf-tools/node_modules/@babel/types": { + "version": "7.21.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@storybook/csf-tools/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@storybook/docs-mdx": { + "version": "0.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/docs-tools": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.10", + "@storybook/core-common": "7.0.4", + "@storybook/preview-api": "7.0.4", + "@storybook/types": "7.0.4", + "@types/doctrine": "^0.0.3", + "doctrine": "^3.0.0", + "lodash": "^4.17.21" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/global": { + "version": "5.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/manager": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/manager-api": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/channels": "7.0.4", + "@storybook/client-logger": "7.0.4", + "@storybook/core-events": "7.0.4", + "@storybook/csf": "^0.1.0", + "@storybook/global": "^5.0.0", + "@storybook/router": "7.0.4", + "@storybook/theming": "7.0.4", + "@storybook/types": "7.0.4", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "semver": "^7.3.7", + "store2": "^2.14.2", + "telejson": "^7.0.3", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/mdx2-csf": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/node-logger": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/npmlog": "^4.1.2", + "chalk": "^4.1.0", + "npmlog": "^5.0.1", + "pretty-hrtime": "^1.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/node-logger/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@storybook/node-logger/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/node-logger/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/node-logger/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/postinstall": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preview": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preview-api": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/channel-postmessage": "7.0.4", + "@storybook/channels": "7.0.4", + "@storybook/client-logger": "7.0.4", + "@storybook/core-events": "7.0.4", + "@storybook/csf": "^0.1.0", + "@storybook/global": "^5.0.0", + "@storybook/types": "7.0.4", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/react-dom-shim": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/router": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "7.0.4", + "memoizerific": "^1.11.3", + "qs": "^6.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/store": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "7.0.4", + "@storybook/preview-api": "7.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/telemetry": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "7.0.4", + "@storybook/core-common": "7.0.4", + "chalk": "^4.1.0", + "detect-package-manager": "^2.0.1", + "fetch-retry": "^5.0.2", + "fs-extra": "^11.1.0", + "isomorphic-unfetch": "^3.1.0", + "nanoid": "^3.3.1", + "read-pkg-up": "^7.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/telemetry/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@storybook/telemetry/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/telemetry/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/telemetry/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/theming": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@storybook/client-logger": "7.0.4", + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/types": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/channels": "7.0.4", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^7.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^7.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^7.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^7.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "^7.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "^7.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "^7.0.0", + "@svgr/babel-plugin-transform-svg-component": "^7.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "^7.0.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "^7.0.0", + "@svgr/hast-util-to-babel-ast": "^7.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "^7.0.0", + "@svgr/plugin-jsx": "^7.0.0", + "@svgr/plugin-svgo": "^7.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@swc-node/core": { + "version": "1.10.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@swc/core": ">= 1.3" + } + }, + "node_modules/@swc-node/register": { + "version": "1.6.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@swc-node/core": "^1.10.6", + "@swc-node/sourcemap-support": "^0.3.0", + "colorette": "^2.0.19", + "debug": "^4.3.4", + "pirates": "^4.0.5", + "tslib": "^2.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@swc/core": ">= 1.3", + "typescript": ">= 4.3" + } + }, + "node_modules/@swc-node/sourcemap-support": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map-support": "^0.5.21", + "tslib": "^2.5.0" + } + }, + "node_modules/@swc/cli": { + "version": "0.1.63", + "dev": true, + "license": "MIT", + "dependencies": { + "@mole-inc/bin-wrapper": "^8.0.1", + "commander": "^7.1.0", + "fast-glob": "^3.2.5", + "semver": "^7.3.8", + "slash": "3.0.0", + "source-map": "^0.7.3" + }, + "bin": { + "spack": "bin/spack.js", + "swc": "bin/swc.js", + "swcx": "bin/swcx.js" + }, + "engines": { + "node": ">= 12.13" + }, + "peerDependencies": { + "@swc/core": "^1.2.66", + "chokidar": "^3.5.1" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@swc/cli/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@swc/core": { + "version": "1.3.104", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.1", + "@swc/types": "^0.1.5" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.3.104", + "@swc/core-darwin-x64": "1.3.104", + "@swc/core-linux-arm-gnueabihf": "1.3.104", + "@swc/core-linux-arm64-gnu": "1.3.104", + "@swc/core-linux-arm64-musl": "1.3.104", + "@swc/core-linux-x64-gnu": "1.3.104", + "@swc/core-linux-x64-musl": "1.3.104", + "@swc/core-win32-arm64-msvc": "1.3.104", + "@swc/core-win32-ia32-msvc": "1.3.104", + "@swc/core-win32-x64-msvc": "1.3.104" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.3.104", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.3.104", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@swc/types": { + "version": "0.1.5", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/detect-port": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/doctrine": { + "version": "0.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ejs": { + "version": "3.1.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "8.56.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.41", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/find-cache-dir": { + "version": "3.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/fs-extra": { + "version": "11.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "^5.1.2", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jasmine": { + "version": "3.10.18", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/js-levenshtein": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.202", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdx": { + "version": "2.0.10", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime-types": { + "version": "2.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.16.3", + "license": "MIT" + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/npmlog": { + "version": "4.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/pretty-hrtime": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ramda": { + "version": "0.29.3", + "dev": true, + "license": "MIT", + "dependencies": { + "types-ramda": "^0.29.4" + } + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.2.48", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "16.9.24", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "^16" + } + }, + "node_modules/@types/react-dom/node_modules/@types/react": { + "version": "16.14.56", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/set-cookie-parser": { + "version": "2.4.7", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sizzle": { + "version": "2.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "2.0.10", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/webpack-env": { + "version": "1.18.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.48.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "5.48.2", + "@typescript-eslint/type-utils": "5.48.2", + "@typescript-eslint/utils": "5.48.2", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.48.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.48.2", + "@typescript-eslint/types": "5.48.2", + "@typescript-eslint/typescript-estree": "5.48.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.48.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.48.2", + "@typescript-eslint/visitor-keys": "5.48.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.48.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.48.2", + "@typescript-eslint/utils": "5.48.2", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.48.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.48.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.48.2", + "@typescript-eslint/visitor-keys": "5.48.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.48.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.48.2", + "@typescript-eslint/types": "5.48.2", + "@typescript-eslint/typescript-estree": "5.48.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.48.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.48.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@yarnpkg/esbuild-plugin-pnp": { + "version": "3.0.0-rc.15", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "esbuild": ">=0.10.0" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.6", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@zkochan/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0", + "peer": true + }, + "node_modules/@zxing/text-encoding": { + "version": "0.9.0", + "license": "(Unlicense OR Apache-2.0)", + "optional": true + }, + "node_modules/abab": { + "version": "2.0.6", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/address": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-styles/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ansi-styles/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/any-promise": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-root-dir": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/aproba": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/arch": { + "version": "2.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.1.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/array-ify": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ast-types": { + "version": "0.16.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.5", + "dev": true, + "license": "MIT" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/axe-core": { + "version": "4.8.3", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.6.5", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "3.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/babel-core": { + "version": "7.0.0-bridge.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-loader": { + "version": "9.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-named-exports-order": { + "version": "0.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/better-opn": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "open": "^7.0.3" + }, + "engines": { + "node": ">8.0.0" + } + }, + "node_modules/better-opn/node_modules/open": { + "version": "7.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/big-integer": { + "version": "1.6.52", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bin-check": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^0.7.0", + "executable": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/cross-spawn": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/bin-check/node_modules/execa": { + "version": "0.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/get-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/is-stream": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-check/node_modules/lru-cache": { + "version": "4.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/bin-check/node_modules/npm-run-path": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/path-key": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/shebang-command": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-check/node_modules/shebang-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-check/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/bin-check/node_modules/yallist": { + "version": "2.1.2", + "dev": true, + "license": "ISC" + }, + "node_modules/bin-version": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "find-versions": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bin-version-check": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bin-version": "^6.0.0", + "semver": "^7.5.3", + "semver-truncate": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/boxen": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-assert": { + "version": "1.2.1", + "dev": true + }, + "node_modules/browserify-zlib": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "~0.2.0" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/builtins": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "17.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^8.0.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cachedir": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsite": { + "version": "1.0.0", + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001579", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "license": "MIT" + }, + "node_modules/chart.js": { + "version": "4.4.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=7" + } + }, + "node_modules/check-more-types": { + "version": "2.24.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chromatic": { + "version": "6.24.1", + "dev": true, + "license": "MIT", + "bin": { + "chroma": "dist/bin.js", + "chromatic": "dist/bin.js", + "chromatic-cli": "dist/bin.js" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/citty": { + "version": "0.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/citty/node_modules/consola": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/colorspace": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/compare-func": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/compare-versions": { + "version": "4.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "dev": true, + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concurrently": { + "version": "6.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "date-fns": "^2.16.1", + "lodash": "^4.17.21", + "rxjs": "^6.6.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^16.2.0" + }, + "bin": { + "concurrently": "bin/concurrently.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/concurrently/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/cliui": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/concurrently/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/rxjs": { + "version": "6.6.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/concurrently/node_modules/yargs": { + "version": "16.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/connect": { + "version": "3.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/finalhandler": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/connect/node_modules/on-finished": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "dev": true, + "license": "MIT" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/console.table": { + "version": "0.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "easy-table": "1.1.0" + }, + "engines": { + "node": "> 0.10" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/content-type": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/conventional-changelog": { + "version": "3.1.25", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/conventional-changelog-atom": { + "version": "2.0.8", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-codemirror": { + "version": "2.0.8", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "6.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/conventional-changelog-core": { + "version": "4.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/node_modules/conventional-commits-parser": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/node_modules/find-up": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/locate-path": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-limit": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-locate": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-try": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/read-pkg-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-ember": { + "version": "2.0.9", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-eslint": { + "version": "3.0.9", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-express": { + "version": "2.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jquery": { + "version": "3.0.11", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jshint": { + "version": "2.0.9", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "2.3.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/conventional-changelog/node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog/node_modules/conventional-changelog-conventionalcommits": { + "version": "4.6.3", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-filter": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.3.5", + "meow": "^8.1.2", + "split2": "^3.2.2" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/conventional-recommended-bump": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", + "q": "^1.5.1" + }, + "bin": { + "conventional-recommended-bump": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-recommended-bump/node_modules/conventional-commits-parser": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js-compat": { + "version": "3.35.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.22.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/browserslist": { + "version": "4.22.2", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=7", + "ts-node": ">=10", + "typescript": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/critters": { + "version": "0.0.16", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^4.2.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" + } + }, + "node_modules/critters/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/critters/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/critters/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/critters/node_modules/parse5": { + "version": "6.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/critters/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-blank-pseudo": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-6.0.1.tgz", + "integrity": "sha512-goSnEITByxTzU4Oh5oJZrEWudxTqk7L6IXj1UW69pO6Hv0UdX+Vsrt02FFu5DweRh2bLu6WpX/+zsQCu5O1gKw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-6.0.1.tgz", + "integrity": "sha512-WwoVKqNxApfEI7dWFyaHoeFCcUPD+lPyjL6lNpRUNX7IyIUuVpawOTwwA5D0ZR6V2xQZonNPVj8kEcxzEaAQfQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-specificity": "^3.0.1", + "postcss-selector-parser": "^6.0.13", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "6.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.31", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.1.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-loader/node_modules/postcss": { + "version": "8.4.33", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-9.0.1.tgz", + "integrity": "sha512-iFit06ochwCKPRiWagbTa1OAWCvWWVdEnIFd8BaRrgO8YrrNh4RAWUQTFcYX5tdFZgFl1DJ3iiULchZyEbnF4g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "7.10.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "CC0-1.0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cuint": { + "version": "0.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/custom-event": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/cypress": { + "version": "12.17.4", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@cypress/request": "2.88.12", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^16.18.39", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^6.2.1", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.4", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.8", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "process": "^0.11.10", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.5.3", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": "^14.0.0 || ^16.0.0 || >=18.0.0" + } + }, + "node_modules/cypress/node_modules/@types/node": { + "version": "16.18.71", + "dev": true, + "license": "MIT" + }, + "node_modules/cypress/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cypress/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cypress/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cypress/node_modules/commander": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cypress/node_modules/execa": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/cypress/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cypress/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cypress/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cypress/node_modules/human-signals": { + "version": "1.1.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/cypress/node_modules/proxy-from-env": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cypress/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/dargs": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/date-fns/node_modules/@babel/runtime": { + "version": "7.23.8", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/date-fns/node_modules/regenerator-runtime": { + "version": "0.14.1", + "dev": true, + "license": "MIT" + }, + "node_modules/date-format": { + "version": "4.0.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/dateformat": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/del": { + "version": "6.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-package-manager": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/detect-port": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, + "node_modules/di": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/diacritics": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/diff": { + "version": "4.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/duplexify": { + "version": "3.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/easy-table": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "wcwidth": ">=1.0.1" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.9", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.637", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/enabled": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io": { + "version": "6.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.11.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "devOptional": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.11.0", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/errno": { + "version": "0.1.8", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.17.8", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.8", + "@esbuild/android-arm64": "0.17.8", + "@esbuild/android-x64": "0.17.8", + "@esbuild/darwin-arm64": "0.17.8", + "@esbuild/darwin-x64": "0.17.8", + "@esbuild/freebsd-arm64": "0.17.8", + "@esbuild/freebsd-x64": "0.17.8", + "@esbuild/linux-arm": "0.17.8", + "@esbuild/linux-arm64": "0.17.8", + "@esbuild/linux-ia32": "0.17.8", + "@esbuild/linux-loong64": "0.17.8", + "@esbuild/linux-mips64el": "0.17.8", + "@esbuild/linux-ppc64": "0.17.8", + "@esbuild/linux-riscv64": "0.17.8", + "@esbuild/linux-s390x": "0.17.8", + "@esbuild/linux-x64": "0.17.8", + "@esbuild/netbsd-x64": "0.17.8", + "@esbuild/openbsd-x64": "0.17.8", + "@esbuild/sunos-x64": "0.17.8", + "@esbuild/win32-arm64": "0.17.8", + "@esbuild/win32-ia32": "0.17.8", + "@esbuild/win32-x64": "0.17.8" + } + }, + "node_modules/esbuild-plugin-alias": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild-register": { + "version": "3.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.17.8", + "dev": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.8.0", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-cypress": { + "version": "2.15.1", + "dev": true, + "license": "MIT", + "dependencies": { + "globals": "^13.20.0" + }, + "peerDependencies": { + "eslint": ">= 3.2.1" + } + }, + "node_modules/eslint-plugin-cypress/node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-cypress/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-storybook": { + "version": "0.6.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf": "^0.0.1", + "@typescript-eslint/utils": "^5.45.0", + "requireindex": "^1.1.0", + "ts-dedent": "^2.2.0" + }, + "engines": { + "node": "12.x || 14.x || >= 16" + }, + "peerDependencies": { + "eslint": ">=6" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@storybook/csf": { + "version": "0.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter-asyncresource": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/eventemitter2": { + "version": "6.4.7", + "dev": true, + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/express": { + "version": "4.18.2", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/ext-list": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-name": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/fancy-log": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-support": "^1.1.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.16.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fetch-retry": { + "version": "5.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/figures": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-saver": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/file-system-cache": { + "version": "2.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "11.0.1", + "@types/ramda": "0.29.3", + "fs-extra": "11.1.1", + "ramda": "0.29.0" + } + }, + "node_modules/file-system-cache/node_modules/fs-extra": { + "version": "11.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/file-type": { + "version": "17.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0-alpha.9", + "token-types": "^5.0.0-alpha.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filename-reserved-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/filenamify": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^3.0.0", + "strip-outer": "^2.0.0", + "trim-repeated": "^2.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-versions": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-regex": "^4.0.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "dev": true, + "license": "ISC" + }, + "node_modules/flow-parser": { + "version": "0.226.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fn.name": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">=12.13.0", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "vue-template-compiler": "*", + "webpack": "^5.11.0" + }, + "peerDependenciesMeta": { + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "dev": true, + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-npm-tarball-url": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-pkg-repo": { + "version": "4.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "get-pkg-repo": "src/cli.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-pkg-repo/node_modules/cliui": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/get-pkg-repo/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/get-pkg-repo/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/get-pkg-repo/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/get-pkg-repo/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/get-pkg-repo/node_modules/yargs": { + "version": "16.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getos": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/giget": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.5", + "consola": "^3.2.3", + "defu": "^6.1.3", + "node-fetch-native": "^1.6.1", + "nypm": "^0.3.3", + "ohash": "^1.1.3", + "pathe": "^1.1.1", + "tar": "^6.2.0" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/giget/node_modules/consola": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.11", + "dev": true, + "license": "MIT", + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-remote-origin-url": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/git-semver-tags": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "bin": { + "git-semver-tags": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-semver-tags/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/gitconfiglocal": { + "version": "1.0.0", + "dev": true, + "license": "BSD", + "dependencies": { + "ini": "^1.3.2" + } + }, + "node_modules/gitconfiglocal/node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "dev": true, + "license": "ISC" + }, + "node_modules/glob": { + "version": "8.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-promise": { + "version": "6.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "^8.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/ahmadnassri" + }, + "peerDependencies": { + "glob": "^8.0.3" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/graphql": { + "version": "16.8.1", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/gunzip-maybe": { + "version": "1.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-zlib": "^0.1.4", + "is-deflate": "^1.0.0", + "is-gzip": "^1.0.0", + "peek-stream": "^1.1.0", + "pumpify": "^1.3.3", + "through2": "^2.0.3" + }, + "bin": { + "gunzip-maybe": "bin.js" + } + }, + "node_modules/gunzip-maybe/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/gunzip-maybe/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/gunzip-maybe/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/gunzip-maybe/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/hasown": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hdr-histogram-js": { + "version": "2.0.3", + "dev": true, + "license": "BSD", + "dependencies": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "node_modules/hdr-histogram-js/node_modules/pako": { + "version": "1.0.11", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/headers-polyfill": { + "version": "3.2.5", + "license": "MIT" + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "2.2.0", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-signature": { + "version": "1.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "dev": true, + "license": "MIT", + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/i18n-iso-countries": { + "version": "7.7.0", + "license": "MIT", + "dependencies": { + "diacritics": "1.3.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.4", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/injection-js": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + } + }, + "node_modules/inquirer": { + "version": "8.2.4", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-deflate": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/is-docker": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-gzip": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-map": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/is-nan": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-unfetch": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.1", + "unfetch": "^4.2.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterare": { + "version": "1.2.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=6" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jasmine-core": { + "version": "4.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jasmine-spec-reporter": { + "version": "7.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "colors": "1.4.0" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-sonar-reporter": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml": "^1.0.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.12.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.4", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-sha256": { + "version": "0.9.0", + "license": "MIT", + "peer": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jscodeshift": { + "version": "0.14.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.13.16", + "@babel/parser": "^7.13.16", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/preset-flow": "^7.13.13", + "@babel/preset-typescript": "^7.13.0", + "@babel/register": "^7.13.16", + "babel-core": "^7.0.0-bridge.0", + "chalk": "^4.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.21.0", + "temp": "^0.8.4", + "write-file-atomic": "^2.3.0" + }, + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/jscodeshift/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jscodeshift/node_modules/ast-types": { + "version": "0.15.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jscodeshift/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jscodeshift/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jscodeshift/node_modules/recast": { + "version": "0.21.5", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "0.15.2", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/jscodeshift/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jscodeshift/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jscodeshift/node_modules/write-file-atomic": { + "version": "2.4.3", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/karma": { + "version": "6.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/karma-coverage": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-jasmine": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jasmine-core": "^4.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "karma": "^6.0.0" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "jasmine-core": "^4.0.0 || ^5.0.0", + "karma": "^6.0.0", + "karma-jasmine": "^5.0.0" + } + }, + "node_modules/karma-jasmine/node_modules/jasmine-core": { + "version": "4.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/karma-sonarqube-unit-reporter": { + "version": "0.0.23", + "dev": true, + "license": "MIT", + "dependencies": { + "xmlbuilder": "^13.0.2" + }, + "peerDependencies": { + "karma": ">=0.9" + } + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/karma/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/keycloak-angular": { + "version": "13.1.0", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "peerDependencies": { + "@angular/common": "^15", + "@angular/core": "^15", + "@angular/router": "^15", + "keycloak-js": "^18 || ^19 || ^20 || ^21" + } + }, + "node_modules/keycloak-js": { + "version": "18.0.1", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "base64-js": "^1.5.1", + "js-sha256": "^0.9.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "> 0.8" + } + }, + "node_modules/lazy-universal-dotenv": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "app-root-dir": "^1.0.2", + "dotenv": "^16.0.0", + "dotenv-expand": "^10.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/less": { + "version": "4.1.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/node_modules/pify": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/listr2": { + "version": "3.14.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/logform": { + "version": "2.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/logform/node_modules/@colors/colors": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "dev": true, + "license": "ISC" + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "16.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-fetch-happen/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "9.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-filename": { + "version": "2.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-slug": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-or-similar": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/markdown-to-jsx": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/material-colors": { + "version": "1.2.6", + "license": "ISC" + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "dev": true, + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memoizerific": { + "version": "1.11.3", + "dev": true, + "license": "MIT", + "dependencies": { + "map-or-similar": "^1.5.0" + } + }, + "node_modules/meow": { + "version": "8.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "4.2.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "dev": true, + "license": "MIT" + }, + "node_modules/modify-values": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/msw": { + "version": "1.3.2", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mswjs/cookies": "^0.2.2", + "@mswjs/interceptors": "^0.17.10", + "@open-draft/until": "^1.0.3", + "@types/cookie": "^0.4.1", + "@types/js-levenshtein": "^1.1.1", + "chalk": "^4.1.1", + "chokidar": "^3.4.2", + "cookie": "^0.4.2", + "graphql": "^16.8.1", + "headers-polyfill": "3.2.5", + "inquirer": "^8.2.0", + "is-node-process": "^1.2.0", + "js-levenshtein": "^1.1.6", + "node-fetch": "^2.6.7", + "outvariant": "^1.4.0", + "path-to-regexp": "^6.2.0", + "strict-event-emitter": "^0.4.3", + "type-fest": "^2.19.0", + "yargs": "^17.3.1" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.4.x <= 5.2.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw-storybook-addon": { + "version": "1.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.0.1" + }, + "peerDependencies": { + "msw": ">=0.35.0 <2.0.0" + } + }, + "node_modules/msw/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/msw/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/msw/node_modules/cookie": { + "version": "0.4.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/msw/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/msw/node_modules/path-to-regexp": { + "version": "6.2.1", + "license": "MIT" + }, + "node_modules/msw/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "license": "ISC" + }, + "node_modules/mz": { + "version": "2.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/needle": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ng-packagr": { + "version": "15.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.0.0", + "ajv": "^8.11.0", + "ansi-colors": "^4.1.3", + "autoprefixer": "^10.4.12", + "browserslist": "^4.21.4", + "cacache": "^17.0.0", + "chokidar": "^3.5.3", + "commander": "^10.0.0", + "convert-source-map": "^2.0.0", + "dependency-graph": "^0.11.0", + "esbuild-wasm": "^0.17.0", + "find-cache-dir": "^3.3.2", + "glob": "^8.0.3", + "injection-js": "^2.4.0", + "jsonc-parser": "^3.2.0", + "less": "^4.1.3", + "ora": "^5.1.0", + "piscina": "^3.2.0", + "postcss": "^8.4.16", + "postcss-url": "^10.1.3", + "rollup": "^3.0.0", + "rxjs": "^7.5.6", + "sass": "^1.55.0" + }, + "bin": { + "ng-packagr": "cli/main.js" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "optionalDependencies": { + "esbuild": "^0.17.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^15.0.0 || ^15.2.0-next.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "tslib": "^2.3.0", + "typescript": ">=4.8.2 <5.0" + }, + "peerDependenciesMeta": { + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/ng-packagr/node_modules/commander": { + "version": "10.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/ng-packagr/node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ngx-build-plus": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/build-angular": ">=14.0.0", + "@schematics/angular": ">=14.0.0", + "webpack-merge": "^5.0.0" + }, + "peerDependencies": { + "@angular-devkit/build-angular": ">=12.0.0", + "rxjs": ">= 6.0.0" + } + }, + "node_modules/ngx-color": { + "version": "8.0.3", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "material-colors": "^1.2.6", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=14.0.0-0", + "@angular/core": ">=14.0.0-0" + } + }, + "node_modules/ngx-translate-testing": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": "^10.0.0-rc.0 || >=10.0.0", + "@angular/core": "^10.0.0-rc.0 || >=10.0.0", + "@ngx-translate/core": ">=14.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/node-dir": { + "version": "0.1.17", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.10.5" + } + }, + "node_modules/node-downloader-helper": { + "version": "2.1.9", + "dev": true, + "license": "MIT", + "bin": { + "ndh": "bin/ndh" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/node-forge": { + "version": "1.3.1", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "9.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.0", + "dev": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "10.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "6.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/npm-packlist": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "14.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { + "version": "11.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nx": { + "version": "16.10.0", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nrwl/tao": "16.10.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.3.1", + "dotenv-expand": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^11.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "lines-and-columns": "~2.0.3", + "minimatch": "3.0.5", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "16.10.0", + "@nx/nx-darwin-x64": "16.10.0", + "@nx/nx-freebsd-x64": "16.10.0", + "@nx/nx-linux-arm-gnueabihf": "16.10.0", + "@nx/nx-linux-arm64-gnu": "16.10.0", + "@nx/nx-linux-arm64-musl": "16.10.0", + "@nx/nx-linux-x64-gnu": "16.10.0", + "@nx/nx-linux-x64-musl": "16.10.0", + "@nx/nx-win32-arm64-msvc": "16.10.0", + "@nx/nx-win32-x64-msvc": "16.10.0" + }, + "peerDependencies": { + "@swc-node/register": "^1.6.7", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/nx/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0", + "peer": true + }, + "node_modules/nx/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/nx/node_modules/enquirer": { + "version": "2.3.6", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/nx/node_modules/glob": { + "version": "7.1.4", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nx/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/nx/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nx/node_modules/minimatch": { + "version": "3.0.5", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nx/node_modules/semver": { + "version": "7.5.3", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nx/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/tsconfig-paths": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nx/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/nx/node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/nypm": { + "version": "0.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.5", + "execa": "^8.0.1", + "pathe": "^1.1.1", + "ufo": "^1.3.2" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/nypm/node_modules/execa": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/nypm/node_modules/get-stream": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/human-signals": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/nypm/node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/npm-run-path": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nypm/node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ohash": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-filter-obj": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arch": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ospath": { + "version": "1.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/outvariant": { + "version": "1.4.2", + "license": "MIT" + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pacote": { + "version": "15.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^4.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/pako": { + "version": "0.2.9", + "dev": true, + "license": "MIT" + }, + "node_modules/param-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "devOptional": true, + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/path-to-regexp": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/peek-readable": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/peek-stream": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "duplexify": "^3.5.0", + "through2": "^2.0.3" + } + }, + "node_modules/peek-stream/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/peek-stream/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/peek-stream/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/peek-stream/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/piscina": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0" + }, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/pkg-dir": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/polished": { + "version": "4.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss": { + "version": "8.4.23", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.4.tgz", + "integrity": "sha512-YBzfVvVUNR4U3N0imzU1NPKCuwxzfHJkEP6imJxzsJ8LozRKeej9mWmg9Ef1ovJdb0xrGTRVzUxgTrMun5iw/Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.5.1", + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3", + "@csstools/postcss-progressive-custom-properties": "^3.0.3" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "9.0.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-9.0.2.tgz", + "integrity": "sha512-f+RDEAPW2m8UbJWkSpRfV+QxhSaQhDMihI75DVGJJh4oRIoegjheeRtINFJum9D8BqGJcvD4GLjggTvCwZ4zuA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-media": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.2.tgz", + "integrity": "sha512-zcEFNRmDm2fZvTPdI1pIW3W//UruMcLosmMiCdpQnrCsTRzWlKQPYMa1ud9auL0BmrryKK1+JjIGn19K0UjO/w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/cascade-layer-name-parser": "^1.0.5", + "@csstools/css-parser-algorithms": "^2.3.2", + "@csstools/css-tokenizer": "^2.2.1", + "@csstools/media-query-list-parser": "^2.1.5" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "13.3.4", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^1.0.7", + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "7.1.6", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^1.0.5", + "@csstools/css-parser-algorithms": "^2.3.2", + "@csstools/css-tokenizer": "^2.2.1", + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-8.0.1.tgz", + "integrity": "sha512-uULohfWBBVoFiZXgsQA24JV6FdKIidQ+ZqxOouhWwdE+qJlALbkS5ScB43ZTjPK+xUZZhlaO/NjfCt5h4IKUfw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-5.0.3.tgz", + "integrity": "sha512-QKYpwmaSm6HcdS0ndAuWSNNMv78R1oSySoh3mYBmctHWr2KWcwPJVakdOyU4lvFVW0GRu9wfIQwGeM4p3xU9ow==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^3.0.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-9.0.1.tgz", + "integrity": "sha512-N2VQ5uPz3Z9ZcqI5tmeholn4d+1H14fKXszpjogZIrFbhaq0zNAtq8sAnw6VLiqGbL8YBzsnu7K9bBkTqaRimQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-8.0.1.tgz", + "integrity": "sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-5.0.1.tgz", + "integrity": "sha512-k2z9Cnngc24c0KF4MtMuDdToROYqGMMUQGcE6V0odwjHyOHtaDBlLeRBV70y9/vF7KIbShrTRZ70JjsI1BZyWw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-6.0.2.tgz", + "integrity": "sha512-/O1xwqpJiz/apxGQi7UUfv1xUcorvkHZfvCYHPpRxxZj2WvjD0rg0+/+c+u5/Do5CpUg3XvfYxMrhcnjW1ArDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-lab-function": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.9.tgz", + "integrity": "sha512-PKFAVTBEWJYsoSTD7Kp/OzeiMsXaLX39Pv75XgUyF5VrbMfeTw+JqCGsvDP3dPhclh6BemdCFHcjXBG9gO4UCg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.5.1", + "@csstools/css-parser-algorithms": "^2.5.0", + "@csstools/css-tokenizer": "^2.2.3", + "@csstools/postcss-progressive-custom-properties": "^3.0.3" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/postcss-loader": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-loader/node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-logical": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-7.0.1.tgz", + "integrity": "sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.0.2.tgz", + "integrity": "sha512-63PpJHSeNs93S3ZUIyi+7kKx4JqOIEJ6QYtG3x+0qA4J03+4n0iwsyA1GAHyWxsHYljQS4/4ZK1o2sMi70b5wQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-specificity": "^3.0.1", + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "2.0.0", + "dev": true, + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-5.0.1.tgz", + "integrity": "sha512-XzjBYKLd1t6vHsaokMV9URBt2EwC9a7nDhpQpjoPk2HRTSQfokPfyAS/Q7AOrzUu6q+vp/GnrDBGuj/FCaRqrQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-9.0.1.tgz", + "integrity": "sha512-JfL+paQOgRQRMoYFc2f73pGuG/Aw3tt4vYMR6UA3cWVMxivviPTnMFnFTczUJOA4K2Zga6xgQVE+PcLs64WC8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.3.0.tgz", + "integrity": "sha512-ycw6doPrqV6QxDCtgiyGDef61bEfiSc59HGM4gOw/wxQxmKnhuEery61oOC/5ViENz/ycpRsuhTexs1kUBTvVw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/postcss-cascade-layers": "^4.0.1", + "@csstools/postcss-color-function": "^3.0.7", + "@csstools/postcss-color-mix-function": "^2.0.7", + "@csstools/postcss-exponential-functions": "^1.0.1", + "@csstools/postcss-font-format-keywords": "^3.0.0", + "@csstools/postcss-gamut-mapping": "^1.0.0", + "@csstools/postcss-gradients-interpolation-method": "^4.0.7", + "@csstools/postcss-hwb-function": "^3.0.6", + "@csstools/postcss-ic-unit": "^3.0.2", + "@csstools/postcss-initial": "^1.0.0", + "@csstools/postcss-is-pseudo-class": "^4.0.3", + "@csstools/postcss-logical-float-and-clear": "^2.0.0", + "@csstools/postcss-logical-overflow": "^1.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^1.0.0", + "@csstools/postcss-logical-resize": "^2.0.0", + "@csstools/postcss-logical-viewport-units": "^2.0.3", + "@csstools/postcss-media-minmax": "^1.1.0", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^2.0.3", + "@csstools/postcss-nested-calc": "^3.0.0", + "@csstools/postcss-normalize-display-values": "^3.0.1", + "@csstools/postcss-oklab-function": "^3.0.7", + "@csstools/postcss-progressive-custom-properties": "^3.0.2", + "@csstools/postcss-relative-color-syntax": "^2.0.7", + "@csstools/postcss-scope-pseudo-class": "^3.0.0", + "@csstools/postcss-stepped-value-functions": "^3.0.2", + "@csstools/postcss-text-decoration-shorthand": "^3.0.3", + "@csstools/postcss-trigonometric-functions": "^3.0.2", + "@csstools/postcss-unset-value": "^3.0.0", + "autoprefixer": "^10.4.16", + "browserslist": "^4.22.1", + "css-blank-pseudo": "^6.0.0", + "css-has-pseudo": "^6.0.0", + "css-prefers-color-scheme": "^9.0.0", + "cssdb": "^7.9.0", + "postcss-attribute-case-insensitive": "^6.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^6.0.2", + "postcss-color-hex-alpha": "^9.0.2", + "postcss-color-rebeccapurple": "^9.0.1", + "postcss-custom-media": "^10.0.2", + "postcss-custom-properties": "^13.3.2", + "postcss-custom-selectors": "^7.1.6", + "postcss-dir-pseudo-class": "^8.0.0", + "postcss-double-position-gradients": "^5.0.2", + "postcss-focus-visible": "^9.0.0", + "postcss-focus-within": "^8.0.0", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^5.0.0", + "postcss-image-set-function": "^6.0.1", + "postcss-lab-function": "^6.0.7", + "postcss-logical": "^7.0.0", + "postcss-nesting": "^12.0.1", + "postcss-opacity-percentage": "^2.0.0", + "postcss-overflow-shorthand": "^5.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^9.0.0", + "postcss-pseudo-class-any-link": "^9.0.0", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^7.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env/node_modules/autoprefixer": { + "version": "10.4.17", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", + "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.22.2", + "caniuse-lite": "^1.0.30001578", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-preset-env/node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-9.0.1.tgz", + "integrity": "sha512-cKYGGZ9yzUZi+dZd7XT2M8iSDfo+T2Ctbpiizf89uBTBfIpZpjvTavzIJXpCReMVXSKROqzpxClNu6fz4DHM0Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-url": { + "version": "10.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "make-dir": "~3.1.0", + "mime": "~2.5.2", + "minimatch": "~3.0.4", + "xxhashjs": "~0.2.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-url/node_modules/mime": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-url/node_modules/minimatch": { + "version": "3.0.8", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/primeflex": { + "version": "3.3.1", + "license": "MIT" + }, + "node_modules/primeicons": { + "version": "6.0.1", + "license": "MIT" + }, + "node_modules/primeng": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/primeng/-/primeng-15.2.1.tgz", + "integrity": "sha512-O0yh31VIJRWmN5fjvCkkdLxNdWmGZOeKWay7zlyW1gDVB3FR0Mk7DPSuTgiJ1hevv/+nnj/yz6nkR5plw5uPyg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^15.2.1", + "@angular/core": "^15.2.1", + "@angular/forms": "^15.2.1", + "primeicons": "^6.0.1", + "rxjs": "^6.0.0 || ^7.5.0", + "zone.js": "^0.10.2 || ^0.11.0 || ^0.12.0" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/prr": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/psl": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer-core": { + "version": "2.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/mime-types": "^2.1.0", + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^4.0.0", + "mime": "^2.0.3", + "mime-types": "^2.1.25", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + }, + "engines": { + "node": ">=8.16.0" + } + }, + "node_modules/puppeteer-core/node_modules/agent-base": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/puppeteer-core/node_modules/concat-stream": { + "version": "1.6.2", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/puppeteer-core/node_modules/extract-zip": { + "version": "1.7.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/puppeteer-core/node_modules/extract-zip/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/puppeteer-core/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/puppeteer-core/node_modules/https-proxy-agent": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "5", + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/puppeteer-core/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/puppeteer-core/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/puppeteer-core/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/puppeteer-core/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/puppeteer-core/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/puppeteer-core/node_modules/ws": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/q": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ramda": { + "version": "0.29.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "17.0.2", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-colorful": { + "version": "5.6.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "version": "2.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "invariant": "^2.2.4", + "react-fast-compare": "^3.2.2", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-inspector": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "5.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-package-json": { + "version": "6.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "10.3.10", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/hosted-git-info": { + "version": "6.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/read-package-json/node_modules/normalize-package-data": { + "version": "5.0.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recast": { + "version": "0.23.4", + "dev": true, + "license": "MIT", + "dependencies": { + "assert": "^2.0.0", + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recast/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.14", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-external-links": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend": "^3.0.0", + "is-absolute-url": "^3.0.0", + "mdast-util-definitions": "^4.0.0", + "space-separated-tokens": "^1.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-slug": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "github-slugger": "^1.0.0", + "mdast-util-to-string": "^1.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/request-progress": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requireindex": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.5" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global/node_modules/global-dirs": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-global/node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.58.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/sass-loader": { + "version": "13.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.3.0", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/scheduler": { + "version": "0.20.2", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/seedrandom": { + "version": "3.0.5", + "license": "MIT" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-regex": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver-truncate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/send": { + "version": "0.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-favicon": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "etag": "~1.8.1", + "fresh": "0.5.2", + "ms": "2.1.1", + "parseurl": "~1.3.2", + "safe-buffer": "5.1.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-favicon/node_modules/ms": { + "version": "2.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-favicon/node_modules/safe-buffer": { + "version": "5.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/set-cookie-parser": { + "version": "2.6.0", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/sigstore": { + "version": "1.9.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sigstore/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/sigstore/node_modules/make-fetch-happen": { + "version": "11.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sigstore/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/sigstore/node_modules/minipass-fetch": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.7.4", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sonarqube-scanner": { + "version": "3.3.0", + "dev": true, + "license": "LGPL-3.0-only", + "dependencies": { + "adm-zip": "^0.5.10", + "fancy-log": "^2.0.0", + "https-proxy-agent": "^7.0.1", + "jest-sonar-reporter": "^2.0.0", + "mkdirp": "^3.0.1", + "node-downloader-helper": "^2.1.9", + "progress": "^2.0.3", + "shell-quote": "^1.8.1", + "slugify": "^1.6.6" + }, + "bin": { + "sonar-scanner": "src/bin/sonar-scanner" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/sonarqube-scanner/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/sonarqube-scanner/node_modules/https-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/sonarqube-scanner/node_modules/mkdirp": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys-length": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2-1", + "dev": true, + "license": "MIT" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/spdy": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/split": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "dev": true, + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/sshpk": { + "version": "1.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "10.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/store2": { + "version": "2.14.2", + "dev": true, + "license": "(MIT OR GPL-3.0)" + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/streamroller": { + "version": "3.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/strict-event-emitter": { + "version": "0.4.6", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-outer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + }, + "bin": { + "sl-log-transformer": "bin/sl-log-transformer.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strtok3": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/stylus": { + "version": "0.59.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "debug": "^4.3.2", + "glob": "^7.1.6", + "sax": "~1.2.4", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://opencollective.com/stylus" + } + }, + "node_modules/stylus-loader": { + "version": "7.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.12", + "normalize-path": "^3.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "stylus": ">=0.52.4", + "webpack": "^5.0.0" + } + }, + "node_modules/stylus/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/stylus/node_modules/sax": { + "version": "1.2.4", + "dev": true, + "license": "ISC" + }, + "node_modules/sucrase": { + "version": "3.35.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.3.10", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "5.1.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domhandler": { + "version": "5.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "3.1.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/synchronous-promise": { + "version": "2.0.17", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/tailwindcss": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "dev": true, + "license": "ISC" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/telejson": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "memoizerific": "^1.11.3" + } + }, + "node_modules/temp": { + "version": "0.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/temp/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tempy": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.16.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "5.27.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttleit": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/through": { + "version": "2.3.8", + "license": "MIT" + }, + "node_modules/through2": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-types": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-repeated": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/ts-node": { + "version": "10.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-toolbelt": { + "version": "9.6.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^3.9.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "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" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/tuf-js": { + "version": "1.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/tuf-js/node_modules/make-fetch-happen": { + "version": "11.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tuf-js/node_modules/minipass-fetch": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "dev": true, + "license": "Unlicense" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/typedarray": { + "version": "0.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/types-ramda": { + "version": "0.29.6", + "dev": true, + "license": "MIT", + "dependencies": { + "ts-toolbelt": "^9.6.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.37", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/ufo": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uid": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@lukeed/csprng": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unfetch": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "0.10.2", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.8.0", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.4.5" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-resize-observer": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@juggle/resize-observer": "^3.3.1" + }, + "peerDependencies": { + "react": "16.8.0 - 18", + "react-dom": "16.8.0 - 18" + } + }, + "node_modules/util": { + "version": "0.12.5", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.10.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uuid-browser": { + "version": "3.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-encoding": { + "version": "1.1.5", + "license": "MIT", + "dependencies": { + "util": "^0.12.3" + }, + "optionalDependencies": { + "@zxing/text-encoding": "0.9.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "5.89.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ipaddr.js": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-hot-middleware": { + "version": "2.26.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.4.6", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/winston": { + "version": "3.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston/node_modules/@colors/colors": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.16.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/xmlbuilder": { + "version": "13.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/xxhashjs": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cuint": "^0.2.2" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.3.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.6.2", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zone.js": { + "version": "0.12.0", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..b1e5c661 --- /dev/null +++ b/package.json @@ -0,0 +1,141 @@ +{ + "name": "onecx-workspace-ui", + "private": true, + "version": "0.0.0", + "license": "Apache-2.0", + "contributors": [ + "OneCX Development Team " + ], + "config": { + "openapiYaml": "src/assets/api/workspace-bff-api.yaml", + "openapiOutput": "src/app/shared/generated" + }, + "scripts": { + "build": "ng build", + "clean": "npm cache clean --force && npm run clean-angular", + "clean-angular": "ng cache clean", + "start": "ng serve --configuration=development --proxy-config=proxy.conf.js", + "prepare": "husky install", + "lint": "ng lint", + "eslint": "eslint --quiet --ext .js,.ts src", + "format": "ng lint --fix", + "browsers": "npx browserslist", + "test": "ng test", + "test:ci": "ng test --watch=false --browsers=ChromeHeadless --code-coverage", + "karma": "rm -rf reports && npm run test:ci", + "sonar": "npx sonarqube-scanner -Dproject.settings=sonar-local-project.properties", + "apigen-cleanup": "rm -rf $npm_package_config_openapiOutput", + "apigen-format": "npx prettier $npm_package_config_openapiYaml --write && npx prettier $npm_package_config_openapiOutput/**/* --write", + "apigen-generate": "openapi-generator-cli generate -i $npm_package_config_openapiYaml -g typescript-angular -c apigen.yaml -o $npm_package_config_openapiOutput --type-mappings=AnyType=object,set=Array", + "apigen": "npm run apigen-cleanup && npm run apigen-generate && npm run apigen-format" + }, + "husky": { + "hooks": { + "pre-commit": "pretty-quick --staged" + } + }, + "dependencies": { + "@angular-architects/module-federation": "15.0.0", + "@angular/animations": "15.2.7", + "@angular/cdk": "^15.2.7", + "@angular/common": "15.2.7", + "@angular/compiler": "15.2.7", + "@angular/core": "15.2.7", + "@angular/forms": "15.2.7", + "@angular/platform-browser": "15.2.7", + "@angular/platform-browser-dynamic": "15.2.7", + "@angular/router": "15.2.7", + "@ngneat/error-tailor": "^2.2.0", + "@ngneat/falso": "^6.4.0", + "@ngx-translate/core": "^14.0.0", + "@ngx-translate/http-loader": "^7.0.0", + "@onecx/accelerator": "^3.7.1", + "@onecx/integration-interface": "^3.7.1", + "@onecx/keycloak-auth": "^3.7.1", + "@onecx/portal-integration-angular": "^3.7.1", + "@onecx/portal-layout-styles": "^3.7.1", + "file-saver": "^2.0.5", + "i18n-iso-countries": "^7.6.0", + "ngx-color": "^8.0.3", + "primeflex": "^3.3.1", + "primeicons": "^6.0.1", + "primeng": "15.2.1", + "rxjs": "7.8.1", + "tslib": "^2.5.0", + "zod": "^3.22.1", + "zone.js": "~0.12.0" + }, + "devDependencies": { + "@angular-devkit/build-angular": "15.2.6", + "@angular-devkit/core": "15.2.6", + "@angular-devkit/schematics": "15.2.6", + "@angular-eslint/builder": "15.2.1", + "@angular-eslint/eslint-plugin": "15.2.1", + "@angular-eslint/eslint-plugin-template": "15.2.1", + "@angular-eslint/schematics": "15.2.1", + "@angular-eslint/template-parser": "15.2.1", + "@angular/cli": "~15.2.0", + "@angular/compiler-cli": "15.2.7", + "@angular/language-service": "15.2.7", + "@commitlint/cli": "^17.6.3", + "@commitlint/config-conventional": "^17.6.3", + "@docusaurus/module-type-aliases": "~2.4.0", + "@jscutlery/semver": "^2.30.1", + "@openapitools/openapi-generator-cli": "^2.6.0", + "@schematics/angular": "15.2.6", + "@storybook/addon-essentials": "7.0.4", + "@storybook/angular": "7.0.4", + "@storybook/core-server": "7.0.4 ", + "@svgr/webpack": "^7.0.0", + "@swc-node/register": "^1.6.5", + "@swc/cli": "~0.1.63", + "@swc/core": "^1.3.56", + "@swc/helpers": "0.5.1", + "@types/jasmine": "~3.10.0", + "@types/node": "18.16.3", + "@typescript-eslint/eslint-plugin": "5.48.2", + "@typescript-eslint/parser": "5.48.2", + "autoprefixer": "10.4.14", + "chromatic": "^6.17.4", + "css-loader": "^6.7.3", + "cypress": "^12.11.0", + "eslint": "^8.33.0", + "eslint-config-prettier": "8.8.0", + "eslint-plugin-cypress": "^2.13.3", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-jsx-a11y": "6.7.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-storybook": "^0.6.12", + "husky": "^8.0.3", + "jasmine-core": "~4.0.0", + "jasmine-spec-reporter": "^7.0.0", + "jsonc-eslint-parser": "^2.2.0", + "karma": "^6.4.2", + "karma-chrome-launcher": "^3.2.0", + "karma-coverage": "^2.2.0", + "karma-jasmine": "^5.1.0", + "karma-jasmine-html-reporter": "^2.0.0", + "karma-sonarqube-unit-reporter": "^0.0.23", + "msw": "^1.2.1", + "msw-storybook-addon": "^1.8.0", + "ng-packagr": "15.2.2", + "ngx-build-plus": "^14.0.0", + "ngx-translate-testing": "^6.1.0", + "postcss": "8.4.23", + "postcss-import": "~15.1.0", + "postcss-preset-env": "~9.3.0", + "postcss-url": "~10.1.3", + "prettier": "^2.8.8", + "sonarqube-scanner": "^3.3.0", + "style-loader": "^3.3.2", + "stylus": "^0.59.0", + "stylus-loader": "^7.1.0", + "tailwindcss": "3.3.2", + "ts-node": "10.9.1", + "typescript": "4.9.5", + "url-loader": "^4.1.1", + "webpack": "^5.82.0", + "webpack-merge": "^5.8.0", + "winston": "^3.8.2" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 00000000..0e516b94 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,3 @@ +module.exports = { + syntax: 'postcss-scss' +} diff --git a/proxy.conf.js b/proxy.conf.js new file mode 100644 index 00000000..3f29c747 --- /dev/null +++ b/proxy.conf.js @@ -0,0 +1,32 @@ +/** + * Used in local environment: + * Request proxy to rewrite URLs and prevent CORS errors + */ +const logFn = function (req, res) { + //console.log(new Date().toISOString() + `: bypassing ${req.method} ${req.url} `) +} +const bypassFn = function (req, res) { + logFn(req, res) + if (req.method.toUpperCase() === 'OPTIONS') { + res.setHeader('Allow', 'GET, POST, HEAD, PUT, DELETE, OPTIONS') + res.setHeader('Access-Control-Allow-Origin', '*') + res.setHeader('Access-Control-Allow-Methods', '*') + res.setHeader('Access-Control-Allow-Headers', '*') + return res.send('') + } +} + +const PROXY_CONFIG = { + '/bff': { + target: 'http://onecx-workspace-bff', + secure: false, + pathRewrite: { + '^.*/bff': '' + }, + changeOrigin: true, + logLevel: 'debug', + bypass: bypassFn + } +} + +module.exports = PROXY_CONFIG diff --git a/sonar-local-project.properties b/sonar-local-project.properties new file mode 100644 index 00000000..e81188b9 --- /dev/null +++ b/sonar-local-project.properties @@ -0,0 +1,25 @@ +# sonar.verbose=true +# run locally: +# docker run -p 9000:9000 sonarqube:lts +# user/pwd: admin/admin +# generate project token! +# start: +# npm run sonar +# +sonar.host.url=http://localhost:9000 +sonar.login= +# +sonar.organization=onecx +sonar.projectKey=onecx-announcement-ui +sonar.projectName=onecx-announcement-ui +sonar.javascript.coveragePlugin=lcov +sonar.javascript.lcov.reportPaths=reports/coverage/lcov.info +sonar.testExecutionReportPaths=reports/sonarqube_report.xml +sonar.sourceEncoding=UTF-8 +#sonar.sources=src/app +#sonar.working.directory=dist/sonar +sonar.coverage.exclusions=*.ts,*.js,src/*.ts,src/**/*.module.ts,src/environments/*,src/assets/**/*,src/app/generated/**/*,src/app/test/* +#sonar.exclusions=src/app/generated/**/* +#sonar.cpd.exclusions= +#sonar.tests=src/app +sonar.test.inclusions=src/app/**/*.spec.ts \ No newline at end of file diff --git a/src/_mixins.scss b/src/_mixins.scss new file mode 100644 index 00000000..6fa55b1b --- /dev/null +++ b/src/_mixins.scss @@ -0,0 +1,21 @@ +/* Portal Mgmt global styles + => uses in component.scss: + @import "path-to-this/_portal-mgmt.scss"; + @include ; +*/ + +// disable preset opacity: not readable +@mixin make-disabled-form-readable-input { + :host { + .p-inputtext.p-component:disabled { + opacity: unset; + } + } +} +@mixin make-disabled-form-readable-dropdown { + :host ::ng-deep { + .p-dropdown.p-component.p-disabled { + opacity: unset; + } + } +} diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 00000000..0f277a9d --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1 @@ + diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts new file mode 100644 index 00000000..61e6d97b --- /dev/null +++ b/src/app/app.component.spec.ts @@ -0,0 +1,26 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core' +import { TestBed } from '@angular/core/testing' +import { AppComponent } from './app.component' +import { RouterTestingModule } from '@angular/router/testing' + +describe('AppComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [RouterTestingModule], + declarations: [AppComponent], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents() + }) + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent) + const app = fixture.componentInstance + expect(app).toBeTruthy() + }) + + it(`should have as title 'workspace-mgmt'`, () => { + const fixture = TestBed.createComponent(AppComponent) + const app = fixture.componentInstance + expect(app.title).toEqual('workspace-mgmt') + }) +}) diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 00000000..734d7a57 --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core' +@Component({ + selector: 'app-root', + templateUrl: './app.component.html' +}) +export class AppComponent { + title = 'onecx-workspace-ui' +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 00000000..5bcc86c0 --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,35 @@ +import { APP_INITIALIZER, CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, NgModule } from '@angular/core' +import { BrowserModule } from '@angular/platform-browser' +import { BrowserAnimationsModule } from '@angular/platform-browser/animations' +import { TranslateService } from '@ngx-translate/core' +import { DialogService } from 'primeng/dynamicdialog' +import { Observable } from 'rxjs' + +import { APP_CONFIG, PortalCoreModule } from '@onecx/portal-integration-angular' +import { KeycloakAuthModule } from '@onecx/keycloak-auth' + +import { AppComponent } from './app.component' +import { environment } from '../environments/environment' + +// standalone app: ensure translations are loaded during app init +function initializer(translate: TranslateService): () => Observable { + console.log('App module initializer') + return () => { + translate.addLangs(['en', 'de']) + const browserLang = translate.getBrowserLang() + return translate.use(browserLang?.match(/en|de/) ? browserLang : 'en') + } +} + +@NgModule({ + bootstrap: [AppComponent], + declarations: [AppComponent], + imports: [BrowserModule, KeycloakAuthModule, BrowserAnimationsModule, PortalCoreModule.forRoot('onecx-workspace-ui')], + providers: [ + DialogService, + { provide: APP_CONFIG, useValue: environment }, + { provide: APP_INITIALIZER, useFactory: initializer, multi: true, deps: [TranslateService] } + ], + schemas: [NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA] +}) +export class AppModule {} diff --git a/src/app/model/menu-string-const.ts b/src/app/model/menu-string-const.ts new file mode 100644 index 00000000..554f4106 --- /dev/null +++ b/src/app/model/menu-string-const.ts @@ -0,0 +1,9 @@ +export class MenuStringConst { + static ANY_VALUE = 'ANY_VALUE' + static SCOPE_PORTAL = 'WORKSPACE' + static SCOPE_APP = 'APP' + static SCOPE_PAGE = 'PAGE' + static DISABLED_YES = 'YES' + static DISABLED_NO = 'NO' + static EMPTY = 'EMPTY' +} diff --git a/src/app/onecx-workspace-remote.module.ts b/src/app/onecx-workspace-remote.module.ts new file mode 100644 index 00000000..e512c213 --- /dev/null +++ b/src/app/onecx-workspace-remote.module.ts @@ -0,0 +1,22 @@ +import { Inject, NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' + +import { MFE_INFO, MfeInfo, PortalCoreModule } from '@onecx/portal-integration-angular' + +const routes: Routes = [ + { + path: '', + loadChildren: () => import('./workspace/workspace.module').then((m) => m.WorkspaceModule) + } +] +@NgModule({ + imports: [PortalCoreModule.forMicroFrontend(), RouterModule.forChild(routes)], + exports: [], + providers: [], + schemas: [] +}) +export class WorkspaceMgmtModule { + constructor(@Inject(MFE_INFO) mfeInfo?: MfeInfo) { + console.info('Workspace Mgmt Module constructor', mfeInfo) + } +} diff --git a/src/app/services/menu-state.service.spec.ts b/src/app/services/menu-state.service.spec.ts new file mode 100644 index 00000000..88066b38 --- /dev/null +++ b/src/app/services/menu-state.service.spec.ts @@ -0,0 +1,29 @@ +import { TestBed } from '@angular/core/testing' +import { HttpClientTestingModule } from '@angular/common/http/testing' + +import { MenuStateService } from './menu-state.service' + +describe('MenuStateService', () => { + let service: MenuStateService + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [MenuStateService] + }) + + service = TestBed.inject(MenuStateService) + }) + + it('should be created', () => { + expect(service).toBeTruthy() + }) + + it('should get and updateState', () => { + const initialShowDetails = service.getState().showDetails + + service.updateState({ showDetails: !initialShowDetails }) + + expect(service.getState().showDetails).toBe(!initialShowDetails) + }) +}) diff --git a/src/app/services/menu-state.service.ts b/src/app/services/menu-state.service.ts new file mode 100644 index 00000000..7399fa16 --- /dev/null +++ b/src/app/services/menu-state.service.ts @@ -0,0 +1,35 @@ +import { Injectable } from '@angular/core' +import { MenuItem } from '../shared/generated' + +export interface MenuState { + selectedPortal?: string + rootFilter: boolean + showDetails: boolean + treeMode?: boolean + treeExpansionState: Map + menuTableFilters?: Map + pageSize: number + portalMenuItems?: MenuItem[] + sortColumn?: { sortField: string; sortOrder: number } +} + +@Injectable({ + providedIn: 'root' +}) +export class MenuStateService { + private state: MenuState = { + pageSize: 0, + showDetails: false, + rootFilter: true, + treeMode: true, + treeExpansionState: new Map() + } + + public updateState(data: Partial): void { + Object.assign(this.state, data) + } + + public getState() { + return this.state + } +} diff --git a/src/app/services/menu-tree.service.spec.ts b/src/app/services/menu-tree.service.spec.ts new file mode 100644 index 00000000..dd8a53ee --- /dev/null +++ b/src/app/services/menu-tree.service.spec.ts @@ -0,0 +1,198 @@ +import { TestBed } from '@angular/core/testing' +import { HttpClientTestingModule } from '@angular/common/http/testing' +import { TreeNode } from 'primeng/api' + +import { MenuTreeService } from './menu-tree.service' +import { MenuItemDetailsDTO, MenuItemStructureDTO } from '../shared/generated' + +describe('MenuTreeService', () => { + let service: MenuTreeService + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [MenuTreeService] + }) + + service = TestBed.inject(MenuTreeService) + }) + + it('should be created', () => { + expect(service).toBeTruthy() + }) + + it('should calculate new positions correctly when old and new parent IDs are different', () => { + const oldParentId = 'oldParent' + const newParentId = 'newParent' + const mockTreeNodes = [ + { key: 'oldParent', children: [{ key: 'child1' }, { key: 'child2' }] }, + { key: 'newParent', children: [{ key: 'child3' }, { key: 'child4' }] } + ] + + const result = service.calculateNewNodesPositions(oldParentId, newParentId, mockTreeNodes) + + expect(result).toEqual([ + { id: 'child1', position: 0 }, + { id: 'child2', position: 1 }, + { id: 'child3', position: 0 }, + { id: 'child4', position: 1 } + ]) + }) + + it('should calculate new positions correctly when old or new parent IDs are missing', () => { + const mockTreeNodes = [ + { key: 'root1', children: [{ key: 'child1' }] }, + { key: 'root2', children: [{ key: 'child2' }] } + ] + + let result = service.calculateNewNodesPositions(undefined, undefined, mockTreeNodes) + expect(result).toEqual([ + { id: 'root1', position: 0 }, + { id: 'root2', position: 1 } + ]) + }) + + it('should calculate new positions correctly: nodes are null', () => { + const id = 'otherParent' + const mockTreeNodes = null + + const result = service['findNodeRecursively'](id, mockTreeNodes as unknown as TreeNode[]) + + expect(result).toBeNull() + }) + + it('should calculate new positions correctly: nodes are empty', () => { + const id = 'otherParent' + const mockTreeNodes: TreeNode[] = [] + + const result = service['findNodeRecursively'](id, mockTreeNodes as unknown as TreeNode[]) + + expect(result).toBeNull() + }) + + it('should parse items from structure correctly', () => { + const structure: MenuItemStructureDTO[] = [ + { + name: '1', + url: '/1', + children: [ + { + name: 'Sub 1.1', + url: '/1/sub1' + }, + { + name: 'Sub 1.2', + url: '/1/sub2' + } + ] + }, + { + name: '2', + url: '/2' + } + ] + const list: MenuItemDetailsDTO[] = [] + + const result = service.parseItemsFromStructure(structure, list) + + expect(result).toEqual([ + { + name: '1', + url: '/1' + }, + { + name: 'Sub 1.1', + url: '/1/sub1' + }, + { + name: 'Sub 1.2', + url: '/1/sub2' + }, + { + name: '2', + url: '/2' + } + ]) + }) + + it('should map items to TreeNodes correctly', () => { + const items: MenuItemStructureDTO[] = [ + { + id: 'item1', + name: 'Item 1', + position: 1, + children: [ + { + id: 'subitem1', + name: 'Subitem 1.1', + position: 2, + children: [ + { + id: 'subsubitem1', + name: 'Subsubitem 1.1.1', + position: 3 + } + ] + }, + { + id: 'subitem2', + name: 'Subitem 1.2', + position: 4 + } + ] + }, + { + id: 'item2', + name: 'Item 2', + position: 5 + } + ] + + const result = service.mapToTreeNodes(items) + + expect(result).toEqual([ + { + styleClass: 'non-leaf', + label: 'Item 1', + key: 'item1', + expanded: false, + children: [ + { + styleClass: 'non-leaf', + label: 'Subitem 1.1', + key: 'subitem1', + expanded: false, + children: [ + { + styleClass: 'leaf', + label: 'Subsubitem 1.1.1', + key: 'subsubitem1', + expanded: false, + children: [], + leaf: false + } + ], + leaf: false + }, + { + styleClass: 'leaf', + label: 'Subitem 1.2', + key: 'subitem2', + expanded: false, + children: [], + leaf: false + } + ], + leaf: false + }, + { + styleClass: 'leaf', + label: 'Item 2', + key: 'item2', + expanded: false, + children: [], + leaf: false + } + ]) + }) +}) diff --git a/src/app/services/menu-tree.service.ts b/src/app/services/menu-tree.service.ts new file mode 100644 index 00000000..26e2cdaf --- /dev/null +++ b/src/app/services/menu-tree.service.ts @@ -0,0 +1,116 @@ +import { Injectable } from '@angular/core' +import { TreeNode } from 'primeng/api' +import { MenuItem } from '../shared/generated' + +export interface NewPosition { + id: string | undefined + position: number +} + +@Injectable() +export class MenuTreeService { + public calculateNewNodesPositions( + oldParentId: string | undefined, + newParentId: string | undefined, + menuTreeNodes: TreeNode[] + ): NewPosition[] { + const newNodesPositions: NewPosition[] = [] + + if (oldParentId && oldParentId !== newParentId) { + const resultNode = this.findNodeRecursively(oldParentId, menuTreeNodes) as TreeNode + if (resultNode.children && resultNode.children.length > 0) { + for (const child of resultNode.children) { + newNodesPositions.push({ + id: child.key, + position: resultNode.children.indexOf(child) + }) + } + } + } + + if (newParentId) { + const resultNode = this.findNodeRecursively(newParentId, menuTreeNodes) as TreeNode + if (resultNode.children && resultNode.children.length > 0) { + for (const child of resultNode.children) { + newNodesPositions.push({ + id: child.key, + position: resultNode.children.indexOf(child) + }) + } + } + } + + if (!newParentId || !oldParentId) { + for (const rootNode of menuTreeNodes) { + newNodesPositions.push({ + id: rootNode.key as string, + position: menuTreeNodes.indexOf(rootNode) + }) + } + } + + return newNodesPositions + } + + private findNodeRecursively(searchedId: string, nodes: TreeNode[]): TreeNode | null { + if (!nodes || nodes.length === 0) { + return null + } + for (const node of nodes) { + if (node.key === searchedId) { + return node + } + if (node.children) { + const recursiveNode = this.findNodeRecursively(searchedId, node.children) + if (recursiveNode) { + return recursiveNode + } + } + } + return null + } + + public parseItemsFromStructure(structure: MenuItem[], list: MenuItem[]) { + structure.forEach((structureItem) => { + const menuItem: MenuItem = {} + Object.keys(structureItem).forEach((key) => { + if (key !== 'children') { + ;(menuItem as any)[key] = (structureItem as any)[key] + } + }) + list.push(menuItem) + if (structureItem.children && structureItem?.children.length > 0) { + this.parseItemsFromStructure(structureItem.children, list) + } + }) + return list + } + + public mapToTreeNodes(items: MenuItem[]): TreeNode[] { + if (!items || items.length === 0) { + return [] + } + const results: TreeNode[] = [] + items.sort((a, b) => ((a.position as number) > (b.position as number) ? 1 : -1)) + for (const item of items) { + const newNode: TreeNode = this.createTreeNode(item) + if (item.children && item.children.length > 0) { + newNode.styleClass = 'non-leaf' + newNode.children = this.mapToTreeNodes(item.children) + } + results.push(newNode) + } + return results + } + + private createTreeNode(item: MenuItem): TreeNode { + return { + styleClass: 'leaf', + label: item.name, + key: item.id, + expanded: false, + children: [], + leaf: false + } + } +} diff --git a/src/app/shared/generated/.gitignore b/src/app/shared/generated/.gitignore new file mode 100644 index 00000000..149b5765 --- /dev/null +++ b/src/app/shared/generated/.gitignore @@ -0,0 +1,4 @@ +wwwroot/*.js +node_modules +typings +dist diff --git a/src/app/shared/generated/.openapi-generator-ignore b/src/app/shared/generated/.openapi-generator-ignore new file mode 100644 index 00000000..7484ee59 --- /dev/null +++ b/src/app/shared/generated/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/src/app/shared/generated/.openapi-generator/FILES b/src/app/shared/generated/.openapi-generator/FILES new file mode 100644 index 00000000..3a6fe4bc --- /dev/null +++ b/src/app/shared/generated/.openapi-generator/FILES @@ -0,0 +1,59 @@ +.gitignore +.openapi-generator-ignore +README.md +api.module.ts +api/api.ts +api/menuItem.service.ts +api/product.service.ts +api/workspace.service.ts +configuration.ts +encoder.ts +git_push.sh +index.ts +model/createMenuItemRequest.ts +model/createMenuItemResponse.ts +model/createProductRequest.ts +model/createUpdateMenuItem.ts +model/createUpdateMicrofrontend.ts +model/createUpdateProductResponse.ts +model/createWorkspaceMenuItemStructrueRequest.ts +model/createWorkspaceRequest.ts +model/createWorkspaceResponse.ts +model/eximMenuStructure.ts +model/eximScope.ts +model/eximSubjectLink.ts +model/eximWorkspace.ts +model/eximWorkspaceAddress.ts +model/eximWorkspaceMenuItem.ts +model/exportWorkspacesRequest.ts +model/getMenuItemResponse.ts +model/getMenuItemsResponse.ts +model/getWorkspaceMenuItemStructureResponse.ts +model/getWorkspaceResponse.ts +model/importMenuResponse.ts +model/importResponseStatus.ts +model/importWorkspaceResponse.ts +model/menuItem.ts +model/menuSnapshot.ts +model/microfrontend.ts +model/models.ts +model/pagingResponse.ts +model/patchMenuItemsRequest.ts +model/patchMenuItemsResponse.ts +model/problemDetailInvalidParam.ts +model/problemDetailParam.ts +model/problemDetailResponse.ts +model/product.ts +model/scope.ts +model/searchWorkspacesRequest.ts +model/searchWorkspacesResponse.ts +model/subjectLink.ts +model/updateProductRequest.ts +model/updateWorkspaceRequest.ts +model/validationConstraint.ts +model/workspace.ts +model/workspaceAbstract.ts +model/workspaceAddress.ts +model/workspaceSnapshot.ts +param.ts +variables.ts diff --git a/src/app/shared/generated/.openapi-generator/VERSION b/src/app/shared/generated/.openapi-generator/VERSION new file mode 100644 index 00000000..4b49d9bb --- /dev/null +++ b/src/app/shared/generated/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.2.0 \ No newline at end of file diff --git a/src/app/shared/generated/README.md b/src/app/shared/generated/README.md new file mode 100644 index 00000000..de16f95a --- /dev/null +++ b/src/app/shared/generated/README.md @@ -0,0 +1,226 @@ +## @ + +### Building + +To install the required dependencies and to build the typescript sources run: +``` +npm install +npm run build +``` + +### publishing + +First build the package then run ```npm publish dist``` (don't forget to specify the `dist` folder!) + +### consuming + +Navigate to the folder of your consuming project and run one of next commands. + +_published:_ + +``` +npm install @ --save +``` + +_without publishing (not recommended):_ + +``` +npm install PATH_TO_GENERATED_PACKAGE/dist.tgz --save +``` + +_It's important to take the tgz file, otherwise you'll get trouble with links on windows_ + +_using `npm link`:_ + +In PATH_TO_GENERATED_PACKAGE/dist: +``` +npm link +``` + +In your project: +``` +npm link +``` + +__Note for Windows users:__ The Angular CLI has troubles to use linked npm packages. +Please refer to this issue https://github.com/angular/angular-cli/issues/8284 for a solution / workaround. +Published packages are not effected by this issue. + + +#### General usage + +In your Angular project: + + +``` +// without configuring providers +import { ApiModule } from ''; +import { HttpClientModule } from '@angular/common/http'; + +@NgModule({ + imports: [ + ApiModule, + // make sure to import the HttpClientModule in the AppModule only, + // see https://github.com/angular/angular/issues/20575 + HttpClientModule + ], + declarations: [ AppComponent ], + providers: [], + bootstrap: [ AppComponent ] +}) +export class AppModule {} +``` + +``` +// configuring providers +import { ApiModule, Configuration, ConfigurationParameters } from ''; + +export function apiConfigFactory (): Configuration { + const params: ConfigurationParameters = { + // set configuration parameters here. + } + return new Configuration(params); +} + +@NgModule({ + imports: [ ApiModule.forRoot(apiConfigFactory) ], + declarations: [ AppComponent ], + providers: [], + bootstrap: [ AppComponent ] +}) +export class AppModule {} +``` + +``` +// configuring providers with an authentication service that manages your access tokens +import { ApiModule, Configuration } from ''; + +@NgModule({ + imports: [ ApiModule ], + declarations: [ AppComponent ], + providers: [ + { + provide: Configuration, + useFactory: (authService: AuthService) => new Configuration( + { + basePath: environment.apiUrl, + accessToken: authService.getAccessToken.bind(authService) + } + ), + deps: [AuthService], + multi: false + } + ], + bootstrap: [ AppComponent ] +}) +export class AppModule {} +``` + +``` +import { DefaultApi } from ''; + +export class AppComponent { + constructor(private apiGateway: DefaultApi) { } +} +``` + +Note: The ApiModule is restricted to being instantiated once app wide. +This is to ensure that all services are treated as singletons. + +#### Using multiple OpenAPI files / APIs / ApiModules +In order to use multiple `ApiModules` generated from different OpenAPI files, +you can create an alias name when importing the modules +in order to avoid naming conflicts: +``` +import { ApiModule } from 'my-api-path'; +import { ApiModule as OtherApiModule } from 'my-other-api-path'; +import { HttpClientModule } from '@angular/common/http'; + +@NgModule({ + imports: [ + ApiModule, + OtherApiModule, + // make sure to import the HttpClientModule in the AppModule only, + // see https://github.com/angular/angular/issues/20575 + HttpClientModule + ] +}) +export class AppModule { + +} +``` + + +### Set service base path +If different than the generated base path, during app bootstrap, you can provide the base path to your service. + +``` +import { BASE_PATH } from ''; + +bootstrap(AppComponent, [ + { provide: BASE_PATH, useValue: 'https://your-web-service.com' }, +]); +``` +or + +``` +import { BASE_PATH } from ''; + +@NgModule({ + imports: [], + declarations: [ AppComponent ], + providers: [ provide: BASE_PATH, useValue: 'https://your-web-service.com' ], + bootstrap: [ AppComponent ] +}) +export class AppModule {} +``` + + +#### Using @angular/cli +First extend your `src/environments/*.ts` files by adding the corresponding base path: + +``` +export const environment = { + production: false, + API_BASE_PATH: 'http://127.0.0.1:8080' +}; +``` + +In the src/app/app.module.ts: +``` +import { BASE_PATH } from ''; +import { environment } from '../environments/environment'; + +@NgModule({ + declarations: [ + AppComponent + ], + imports: [ ], + providers: [{ provide: BASE_PATH, useValue: environment.API_BASE_PATH }], + bootstrap: [ AppComponent ] +}) +export class AppModule { } +``` + +### Customizing path parameter encoding + +Without further customization, only [path-parameters][parameter-locations-url] of [style][style-values-url] 'simple' +and Dates for format 'date-time' are encoded correctly. + +Other styles (e.g. "matrix") are not that easy to encode +and thus are best delegated to other libraries (e.g.: [@honoluluhenk/http-param-expander]). + +To implement your own parameter encoding (or call another library), +pass an arrow-function or method-reference to the `encodeParam` property of the Configuration-object +(see [General Usage](#general-usage) above). + +Example value for use in your Configuration-Provider: +```typescript +new Configuration({ + encodeParam: (param: Param) => myFancyParamEncoder(param), +}) +``` + +[parameter-locations-url]: https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-locations +[style-values-url]: https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-values +[@honoluluhenk/http-param-expander]: https://www.npmjs.com/package/@honoluluhenk/http-param-expander diff --git a/src/app/shared/generated/api.module.ts b/src/app/shared/generated/api.module.ts new file mode 100644 index 00000000..58d341fb --- /dev/null +++ b/src/app/shared/generated/api.module.ts @@ -0,0 +1,30 @@ +import { NgModule, ModuleWithProviders, SkipSelf, Optional } from '@angular/core'; +import { Configuration } from './configuration'; +import { HttpClient } from '@angular/common/http'; + + +@NgModule({ + imports: [], + declarations: [], + exports: [], + providers: [] +}) +export class ApiModule { + public static forRoot(configurationFactory: () => Configuration): ModuleWithProviders { + return { + ngModule: ApiModule, + providers: [ { provide: Configuration, useFactory: configurationFactory } ] + }; + } + + constructor( @Optional() @SkipSelf() parentModule: ApiModule, + @Optional() http: HttpClient) { + if (parentModule) { + throw new Error('ApiModule is already loaded. Import in your base AppModule only.'); + } + if (!http) { + throw new Error('You need to import the HttpClientModule in your AppModule! \n' + + 'See also https://github.com/angular/angular/issues/20575'); + } + } +} diff --git a/src/app/shared/generated/api/api.ts b/src/app/shared/generated/api/api.ts new file mode 100644 index 00000000..99f8cb6d --- /dev/null +++ b/src/app/shared/generated/api/api.ts @@ -0,0 +1,7 @@ +export * from './menuItem.service'; +import { MenuItemAPIService } from './menuItem.service'; +export * from './product.service'; +import { ProductAPIService } from './product.service'; +export * from './workspace.service'; +import { WorkspaceAPIService } from './workspace.service'; +export const APIS = [MenuItemAPIService, ProductAPIService, WorkspaceAPIService]; diff --git a/src/app/shared/generated/api/menuItem.service.ts b/src/app/shared/generated/api/menuItem.service.ts new file mode 100644 index 00000000..99c9b1f0 --- /dev/null +++ b/src/app/shared/generated/api/menuItem.service.ts @@ -0,0 +1,751 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +/* tslint:disable:no-unused-variable member-ordering */ + +import { Inject, Injectable, Optional } from '@angular/core'; +import { HttpClient, HttpHeaders, HttpParams, + HttpResponse, HttpEvent, HttpParameterCodec, HttpContext + } from '@angular/common/http'; +import { CustomHttpParameterCodec } from '../encoder'; +import { Observable } from 'rxjs'; + +// @ts-ignore +import { CreateMenuItemRequest } from '../model/createMenuItemRequest'; +// @ts-ignore +import { CreateMenuItemResponse } from '../model/createMenuItemResponse'; +// @ts-ignore +import { CreateWorkspaceMenuItemStructrueRequest } from '../model/createWorkspaceMenuItemStructrueRequest'; +// @ts-ignore +import { GetMenuItemResponse } from '../model/getMenuItemResponse'; +// @ts-ignore +import { GetMenuItemsResponse } from '../model/getMenuItemsResponse'; +// @ts-ignore +import { GetWorkspaceMenuItemStructureResponse } from '../model/getWorkspaceMenuItemStructureResponse'; +// @ts-ignore +import { ImportMenuResponse } from '../model/importMenuResponse'; +// @ts-ignore +import { MenuSnapshot } from '../model/menuSnapshot'; +// @ts-ignore +import { PatchMenuItemsRequest } from '../model/patchMenuItemsRequest'; +// @ts-ignore +import { PatchMenuItemsResponse } from '../model/patchMenuItemsResponse'; +// @ts-ignore +import { ProblemDetailResponse } from '../model/problemDetailResponse'; + +// @ts-ignore +import { BASE_PATH, COLLECTION_FORMATS } from '../variables'; +import { Configuration } from '../configuration'; + + +export interface CreateMenuItemForWorkspaceRequestParams { + id: string; + createMenuItemRequest: CreateMenuItemRequest; +} + +export interface DeleteMenuItemByIdRequestParams { + id: string; + menuItemId: string; +} + +export interface ExportMenuByWorkspaceNameRequestParams { + name: string; +} + +export interface GetMenuItemByIdRequestParams { + id: string; + menuItemId: string; +} + +export interface GetMenuItemsForWorkspaceByIdRequestParams { + id: string; +} + +export interface GetMenuStructureForWorkspaceIdRequestParams { + id: string; +} + +export interface ImportMenuByWorkspaceNameRequestParams { + name: string; + menuSnapshot: MenuSnapshot; +} + +export interface PatchMenuItemsRequestParams { + id: string; + patchMenuItemsRequest: Array; +} + +export interface UploadMenuStructureForWorkspaceIdRequestParams { + id: string; + createWorkspaceMenuItemStructrueRequest: CreateWorkspaceMenuItemStructrueRequest; +} + + +@Injectable({ + providedIn: 'any' +}) +export class MenuItemAPIService { + + protected basePath = 'http://onecx-workspace-bff:8080'; + public defaultHeaders = new HttpHeaders(); + public configuration = new Configuration(); + public encoder: HttpParameterCodec; + + constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string|string[], @Optional() configuration: Configuration) { + if (configuration) { + this.configuration = configuration; + } + if (typeof this.configuration.basePath !== 'string') { + if (Array.isArray(basePath) && basePath.length > 0) { + basePath = basePath[0]; + } + + if (typeof basePath !== 'string') { + basePath = this.basePath; + } + this.configuration.basePath = basePath; + } + this.encoder = this.configuration.encoder || new CustomHttpParameterCodec(); + } + + + // @ts-ignore + private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams { + if (typeof value === "object" && value instanceof Date === false) { + httpParams = this.addToHttpParamsRecursive(httpParams, value); + } else { + httpParams = this.addToHttpParamsRecursive(httpParams, value, key); + } + return httpParams; + } + + private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams { + if (value == null) { + return httpParams; + } + + if (typeof value === "object") { + if (Array.isArray(value)) { + (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key)); + } else if (value instanceof Date) { + if (key != null) { + httpParams = httpParams.append(key, (value as Date).toISOString().substring(0, 10)); + } else { + throw Error("key may not be null if value is Date"); + } + } else { + Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive( + httpParams, value[k], key != null ? `${key}.${k}` : k)); + } + } else if (key != null) { + httpParams = httpParams.append(key, value); + } else { + throw Error("key may not be null if value is not object or array"); + } + return httpParams; + } + + /** + * Add a new menu item to workspace menu + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public createMenuItemForWorkspace(requestParameters: CreateMenuItemForWorkspaceRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public createMenuItemForWorkspace(requestParameters: CreateMenuItemForWorkspaceRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public createMenuItemForWorkspace(requestParameters: CreateMenuItemForWorkspaceRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public createMenuItemForWorkspace(requestParameters: CreateMenuItemForWorkspaceRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const id = requestParameters.id; + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling createMenuItemForWorkspace.'); + } + const createMenuItemRequest = requestParameters.createMenuItemRequest; + if (createMenuItemRequest === null || createMenuItemRequest === undefined) { + throw new Error('Required parameter createMenuItemRequest was null or undefined when calling createMenuItemForWorkspace.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "id", value: id, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/menuItems`; + return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + body: createMenuItemRequest, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Delete a menuItem by the workspace id and the menuItemId + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public deleteMenuItemById(requestParameters: DeleteMenuItemByIdRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public deleteMenuItemById(requestParameters: DeleteMenuItemByIdRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public deleteMenuItemById(requestParameters: DeleteMenuItemByIdRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public deleteMenuItemById(requestParameters: DeleteMenuItemByIdRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const id = requestParameters.id; + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling deleteMenuItemById.'); + } + const menuItemId = requestParameters.menuItemId; + if (menuItemId === null || menuItemId === undefined) { + throw new Error('Required parameter menuItemId was null or undefined when calling deleteMenuItemById.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "id", value: id, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/menuItems/${this.configuration.encodeParam({name: "menuItemId", value: menuItemId, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}`; + return this.httpClient.request('delete', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Export workspaces + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public exportMenuByWorkspaceName(requestParameters: ExportMenuByWorkspaceNameRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public exportMenuByWorkspaceName(requestParameters: ExportMenuByWorkspaceNameRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public exportMenuByWorkspaceName(requestParameters: ExportMenuByWorkspaceNameRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public exportMenuByWorkspaceName(requestParameters: ExportMenuByWorkspaceNameRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const name = requestParameters.name; + if (name === null || name === undefined) { + throw new Error('Required parameter name was null or undefined when calling exportMenuByWorkspaceName.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "name", value: name, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/menu/export`; + return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Retrieve menu item detail info + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getMenuItemById(requestParameters: GetMenuItemByIdRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public getMenuItemById(requestParameters: GetMenuItemByIdRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public getMenuItemById(requestParameters: GetMenuItemByIdRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public getMenuItemById(requestParameters: GetMenuItemByIdRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const id = requestParameters.id; + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling getMenuItemById.'); + } + const menuItemId = requestParameters.menuItemId; + if (menuItemId === null || menuItemId === undefined) { + throw new Error('Required parameter menuItemId was null or undefined when calling getMenuItemById.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "id", value: id, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/menuItems/${this.configuration.encodeParam({name: "menuItemId", value: menuItemId, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}`; + return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Find all menu items belonging to a workspace + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getMenuItemsForWorkspaceById(requestParameters: GetMenuItemsForWorkspaceByIdRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public getMenuItemsForWorkspaceById(requestParameters: GetMenuItemsForWorkspaceByIdRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public getMenuItemsForWorkspaceById(requestParameters: GetMenuItemsForWorkspaceByIdRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public getMenuItemsForWorkspaceById(requestParameters: GetMenuItemsForWorkspaceByIdRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const id = requestParameters.id; + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling getMenuItemsForWorkspaceById.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "id", value: id, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/menuItems`; + return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Fetch the menuItems of the workspace in the tree structure + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getMenuStructureForWorkspaceId(requestParameters: GetMenuStructureForWorkspaceIdRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public getMenuStructureForWorkspaceId(requestParameters: GetMenuStructureForWorkspaceIdRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public getMenuStructureForWorkspaceId(requestParameters: GetMenuStructureForWorkspaceIdRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public getMenuStructureForWorkspaceId(requestParameters: GetMenuStructureForWorkspaceIdRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const id = requestParameters.id; + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling getMenuStructureForWorkspaceId.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "id", value: id, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/menuItems/tree`; + return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Import workspaces + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public importMenuByWorkspaceName(requestParameters: ImportMenuByWorkspaceNameRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public importMenuByWorkspaceName(requestParameters: ImportMenuByWorkspaceNameRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public importMenuByWorkspaceName(requestParameters: ImportMenuByWorkspaceNameRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public importMenuByWorkspaceName(requestParameters: ImportMenuByWorkspaceNameRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const name = requestParameters.name; + if (name === null || name === undefined) { + throw new Error('Required parameter name was null or undefined when calling importMenuByWorkspaceName.'); + } + const menuSnapshot = requestParameters.menuSnapshot; + if (menuSnapshot === null || menuSnapshot === undefined) { + throw new Error('Required parameter menuSnapshot was null or undefined when calling importMenuByWorkspaceName.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "name", value: name, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/menu/import`; + return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + body: menuSnapshot, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Bulk update menu Items + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public patchMenuItems(requestParameters: PatchMenuItemsRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public patchMenuItems(requestParameters: PatchMenuItemsRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>>; + public patchMenuItems(requestParameters: PatchMenuItemsRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>>; + public patchMenuItems(requestParameters: PatchMenuItemsRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const id = requestParameters.id; + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling patchMenuItems.'); + } + const patchMenuItemsRequest = requestParameters.patchMenuItemsRequest; + if (patchMenuItemsRequest === null || patchMenuItemsRequest === undefined) { + throw new Error('Required parameter patchMenuItemsRequest was null or undefined when calling patchMenuItems.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "id", value: id, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/menuItems`; + return this.httpClient.request>('patch', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + body: patchMenuItemsRequest, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Upload the menu structure for workspace + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public uploadMenuStructureForWorkspaceId(requestParameters: UploadMenuStructureForWorkspaceIdRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public uploadMenuStructureForWorkspaceId(requestParameters: UploadMenuStructureForWorkspaceIdRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public uploadMenuStructureForWorkspaceId(requestParameters: UploadMenuStructureForWorkspaceIdRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public uploadMenuStructureForWorkspaceId(requestParameters: UploadMenuStructureForWorkspaceIdRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const id = requestParameters.id; + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling uploadMenuStructureForWorkspaceId.'); + } + const createWorkspaceMenuItemStructrueRequest = requestParameters.createWorkspaceMenuItemStructrueRequest; + if (createWorkspaceMenuItemStructrueRequest === null || createWorkspaceMenuItemStructrueRequest === undefined) { + throw new Error('Required parameter createWorkspaceMenuItemStructrueRequest was null or undefined when calling uploadMenuStructureForWorkspaceId.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "id", value: id, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/menuItems/tree/upload`; + return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + body: createWorkspaceMenuItemStructrueRequest, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + +} diff --git a/src/app/shared/generated/api/product.service.ts b/src/app/shared/generated/api/product.service.ts new file mode 100644 index 00000000..3e6ac71f --- /dev/null +++ b/src/app/shared/generated/api/product.service.ts @@ -0,0 +1,394 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +/* tslint:disable:no-unused-variable member-ordering */ + +import { Inject, Injectable, Optional } from '@angular/core'; +import { HttpClient, HttpHeaders, HttpParams, + HttpResponse, HttpEvent, HttpParameterCodec, HttpContext + } from '@angular/common/http'; +import { CustomHttpParameterCodec } from '../encoder'; +import { Observable } from 'rxjs'; + +// @ts-ignore +import { CreateProductRequest } from '../model/createProductRequest'; +// @ts-ignore +import { CreateUpdateProductResponse } from '../model/createUpdateProductResponse'; +// @ts-ignore +import { ProblemDetailResponse } from '../model/problemDetailResponse'; +// @ts-ignore +import { Product } from '../model/product'; +// @ts-ignore +import { UpdateProductRequest } from '../model/updateProductRequest'; + +// @ts-ignore +import { BASE_PATH, COLLECTION_FORMATS } from '../variables'; +import { Configuration } from '../configuration'; + + +export interface CreateProductInWorkspaceRequestParams { + id: string; + createProductRequest: CreateProductRequest; +} + +export interface DeleteProductByIdRequestParams { + id: string; + productId: string; +} + +export interface GetProductsForWorkspaceIdRequestParams { + id: string; +} + +export interface UpdateProductByIdRequestParams { + id: string; + productId: string; + updateProductRequest: UpdateProductRequest; +} + + +@Injectable({ + providedIn: 'any' +}) +export class ProductAPIService { + + protected basePath = 'http://onecx-workspace-bff:8080'; + public defaultHeaders = new HttpHeaders(); + public configuration = new Configuration(); + public encoder: HttpParameterCodec; + + constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string|string[], @Optional() configuration: Configuration) { + if (configuration) { + this.configuration = configuration; + } + if (typeof this.configuration.basePath !== 'string') { + if (Array.isArray(basePath) && basePath.length > 0) { + basePath = basePath[0]; + } + + if (typeof basePath !== 'string') { + basePath = this.basePath; + } + this.configuration.basePath = basePath; + } + this.encoder = this.configuration.encoder || new CustomHttpParameterCodec(); + } + + + // @ts-ignore + private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams { + if (typeof value === "object" && value instanceof Date === false) { + httpParams = this.addToHttpParamsRecursive(httpParams, value); + } else { + httpParams = this.addToHttpParamsRecursive(httpParams, value, key); + } + return httpParams; + } + + private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams { + if (value == null) { + return httpParams; + } + + if (typeof value === "object") { + if (Array.isArray(value)) { + (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key)); + } else if (value instanceof Date) { + if (key != null) { + httpParams = httpParams.append(key, (value as Date).toISOString().substring(0, 10)); + } else { + throw Error("key may not be null if value is Date"); + } + } else { + Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive( + httpParams, value[k], key != null ? `${key}.${k}` : k)); + } + } else if (key != null) { + httpParams = httpParams.append(key, value); + } else { + throw Error("key may not be null if value is not object or array"); + } + return httpParams; + } + + /** + * Create/Register new product to workspace + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public createProductInWorkspace(requestParameters: CreateProductInWorkspaceRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public createProductInWorkspace(requestParameters: CreateProductInWorkspaceRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public createProductInWorkspace(requestParameters: CreateProductInWorkspaceRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public createProductInWorkspace(requestParameters: CreateProductInWorkspaceRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const id = requestParameters.id; + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling createProductInWorkspace.'); + } + const createProductRequest = requestParameters.createProductRequest; + if (createProductRequest === null || createProductRequest === undefined) { + throw new Error('Required parameter createProductRequest was null or undefined when calling createProductInWorkspace.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "id", value: id, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/products`; + return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + body: createProductRequest, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Delete a product by the workspace id and the productId + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public deleteProductById(requestParameters: DeleteProductByIdRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public deleteProductById(requestParameters: DeleteProductByIdRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public deleteProductById(requestParameters: DeleteProductByIdRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public deleteProductById(requestParameters: DeleteProductByIdRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const id = requestParameters.id; + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling deleteProductById.'); + } + const productId = requestParameters.productId; + if (productId === null || productId === undefined) { + throw new Error('Required parameter productId was null or undefined when calling deleteProductById.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "id", value: id, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/products/${this.configuration.encodeParam({name: "productId", value: productId, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}`; + return this.httpClient.request('delete', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Find all products belonging to a workspace + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getProductsForWorkspaceId(requestParameters: GetProductsForWorkspaceIdRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public getProductsForWorkspaceId(requestParameters: GetProductsForWorkspaceIdRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>>; + public getProductsForWorkspaceId(requestParameters: GetProductsForWorkspaceIdRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>>; + public getProductsForWorkspaceId(requestParameters: GetProductsForWorkspaceIdRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const id = requestParameters.id; + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling getProductsForWorkspaceId.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "id", value: id, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/products`; + return this.httpClient.request>('get', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Update product and MFEs + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public updateProductById(requestParameters: UpdateProductByIdRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public updateProductById(requestParameters: UpdateProductByIdRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public updateProductById(requestParameters: UpdateProductByIdRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public updateProductById(requestParameters: UpdateProductByIdRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const id = requestParameters.id; + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling updateProductById.'); + } + const productId = requestParameters.productId; + if (productId === null || productId === undefined) { + throw new Error('Required parameter productId was null or undefined when calling updateProductById.'); + } + const updateProductRequest = requestParameters.updateProductRequest; + if (updateProductRequest === null || updateProductRequest === undefined) { + throw new Error('Required parameter updateProductRequest was null or undefined when calling updateProductById.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "id", value: id, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/products/${this.configuration.encodeParam({name: "productId", value: productId, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}`; + return this.httpClient.request('put', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + body: updateProductRequest, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + +} diff --git a/src/app/shared/generated/api/workspace.service.ts b/src/app/shared/generated/api/workspace.service.ts new file mode 100644 index 00000000..003b64db --- /dev/null +++ b/src/app/shared/generated/api/workspace.service.ts @@ -0,0 +1,722 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +/* tslint:disable:no-unused-variable member-ordering */ + +import { Inject, Injectable, Optional } from '@angular/core'; +import { HttpClient, HttpHeaders, HttpParams, + HttpResponse, HttpEvent, HttpParameterCodec, HttpContext + } from '@angular/common/http'; +import { CustomHttpParameterCodec } from '../encoder'; +import { Observable } from 'rxjs'; + +// @ts-ignore +import { CreateWorkspaceRequest } from '../model/createWorkspaceRequest'; +// @ts-ignore +import { CreateWorkspaceResponse } from '../model/createWorkspaceResponse'; +// @ts-ignore +import { ExportWorkspacesRequest } from '../model/exportWorkspacesRequest'; +// @ts-ignore +import { GetWorkspaceResponse } from '../model/getWorkspaceResponse'; +// @ts-ignore +import { ImportWorkspaceResponse } from '../model/importWorkspaceResponse'; +// @ts-ignore +import { ProblemDetailResponse } from '../model/problemDetailResponse'; +// @ts-ignore +import { SearchWorkspacesRequest } from '../model/searchWorkspacesRequest'; +// @ts-ignore +import { SearchWorkspacesResponse } from '../model/searchWorkspacesResponse'; +// @ts-ignore +import { UpdateWorkspaceRequest } from '../model/updateWorkspaceRequest'; +// @ts-ignore +import { WorkspaceSnapshot } from '../model/workspaceSnapshot'; + +// @ts-ignore +import { BASE_PATH, COLLECTION_FORMATS } from '../variables'; +import { Configuration } from '../configuration'; + + +export interface CreateWorkspaceRequestParams { + createWorkspaceRequest: CreateWorkspaceRequest; +} + +export interface DeleteWorkspaceRequestParams { + id: string; +} + +export interface ExportWorkspacesRequestParams { + exportWorkspacesRequest: ExportWorkspacesRequest; +} + +export interface GetWorkspaceByIdRequestParams { + id: string; +} + +export interface GetWorkspaceByNameRequestParams { + name: string; +} + +export interface ImportWorkspacesRequestParams { + workspaceSnapshot: WorkspaceSnapshot; +} + +export interface SearchWorkspacesRequestParams { + searchWorkspacesRequest: SearchWorkspacesRequest; +} + +export interface UpdateWorkspaceRequestParams { + id: string; + updateWorkspaceRequest?: UpdateWorkspaceRequest; +} + + +@Injectable({ + providedIn: 'any' +}) +export class WorkspaceAPIService { + + protected basePath = 'http://onecx-workspace-bff:8080'; + public defaultHeaders = new HttpHeaders(); + public configuration = new Configuration(); + public encoder: HttpParameterCodec; + + constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string|string[], @Optional() configuration: Configuration) { + if (configuration) { + this.configuration = configuration; + } + if (typeof this.configuration.basePath !== 'string') { + if (Array.isArray(basePath) && basePath.length > 0) { + basePath = basePath[0]; + } + + if (typeof basePath !== 'string') { + basePath = this.basePath; + } + this.configuration.basePath = basePath; + } + this.encoder = this.configuration.encoder || new CustomHttpParameterCodec(); + } + + + // @ts-ignore + private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams { + if (typeof value === "object" && value instanceof Date === false) { + httpParams = this.addToHttpParamsRecursive(httpParams, value); + } else { + httpParams = this.addToHttpParamsRecursive(httpParams, value, key); + } + return httpParams; + } + + private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams { + if (value == null) { + return httpParams; + } + + if (typeof value === "object") { + if (Array.isArray(value)) { + (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key)); + } else if (value instanceof Date) { + if (key != null) { + httpParams = httpParams.append(key, (value as Date).toISOString().substring(0, 10)); + } else { + throw Error("key may not be null if value is Date"); + } + } else { + Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive( + httpParams, value[k], key != null ? `${key}.${k}` : k)); + } + } else if (key != null) { + httpParams = httpParams.append(key, value); + } else { + throw Error("key may not be null if value is not object or array"); + } + return httpParams; + } + + /** + * Create new workspace + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public createWorkspace(requestParameters: CreateWorkspaceRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public createWorkspace(requestParameters: CreateWorkspaceRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public createWorkspace(requestParameters: CreateWorkspaceRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public createWorkspace(requestParameters: CreateWorkspaceRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const createWorkspaceRequest = requestParameters.createWorkspaceRequest; + if (createWorkspaceRequest === null || createWorkspaceRequest === undefined) { + throw new Error('Required parameter createWorkspaceRequest was null or undefined when calling createWorkspace.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces`; + return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + body: createWorkspaceRequest, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Delete workspace + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public deleteWorkspace(requestParameters: DeleteWorkspaceRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public deleteWorkspace(requestParameters: DeleteWorkspaceRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public deleteWorkspace(requestParameters: DeleteWorkspaceRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public deleteWorkspace(requestParameters: DeleteWorkspaceRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const id = requestParameters.id; + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling deleteWorkspace.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "id", value: id, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}`; + return this.httpClient.request('delete', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Export workspaces + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public exportWorkspaces(requestParameters: ExportWorkspacesRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public exportWorkspaces(requestParameters: ExportWorkspacesRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public exportWorkspaces(requestParameters: ExportWorkspacesRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public exportWorkspaces(requestParameters: ExportWorkspacesRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const exportWorkspacesRequest = requestParameters.exportWorkspacesRequest; + if (exportWorkspacesRequest === null || exportWorkspacesRequest === undefined) { + throw new Error('Required parameter exportWorkspacesRequest was null or undefined when calling exportWorkspaces.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/export`; + return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + body: exportWorkspacesRequest, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * get all theme names + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getAllThemes(observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public getAllThemes(observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>>; + public getAllThemes(observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>>; + public getAllThemes(observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/themes`; + return this.httpClient.request>('get', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Get workspace by id + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getWorkspaceById(requestParameters: GetWorkspaceByIdRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public getWorkspaceById(requestParameters: GetWorkspaceByIdRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public getWorkspaceById(requestParameters: GetWorkspaceByIdRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public getWorkspaceById(requestParameters: GetWorkspaceByIdRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const id = requestParameters.id; + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling getWorkspaceById.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "id", value: id, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}`; + return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Get workspace by name + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public getWorkspaceByName(requestParameters: GetWorkspaceByNameRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public getWorkspaceByName(requestParameters: GetWorkspaceByNameRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public getWorkspaceByName(requestParameters: GetWorkspaceByNameRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public getWorkspaceByName(requestParameters: GetWorkspaceByNameRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const name = requestParameters.name; + if (name === null || name === undefined) { + throw new Error('Required parameter name was null or undefined when calling getWorkspaceByName.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/name/${this.configuration.encodeParam({name: "name", value: name, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}`; + return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Import workspaces + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public importWorkspaces(requestParameters: ImportWorkspacesRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public importWorkspaces(requestParameters: ImportWorkspacesRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public importWorkspaces(requestParameters: ImportWorkspacesRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public importWorkspaces(requestParameters: ImportWorkspacesRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const workspaceSnapshot = requestParameters.workspaceSnapshot; + if (workspaceSnapshot === null || workspaceSnapshot === undefined) { + throw new Error('Required parameter workspaceSnapshot was null or undefined when calling importWorkspaces.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/import`; + return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + body: workspaceSnapshot, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Search workspaces by criteria + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public searchWorkspaces(requestParameters: SearchWorkspacesRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public searchWorkspaces(requestParameters: SearchWorkspacesRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public searchWorkspaces(requestParameters: SearchWorkspacesRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public searchWorkspaces(requestParameters: SearchWorkspacesRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const searchWorkspacesRequest = requestParameters.searchWorkspacesRequest; + if (searchWorkspacesRequest === null || searchWorkspacesRequest === undefined) { + throw new Error('Required parameter searchWorkspacesRequest was null or undefined when calling searchWorkspaces.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/search`; + return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + body: searchWorkspacesRequest, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * Update workspace + * @param requestParameters + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public updateWorkspace(requestParameters: UpdateWorkspaceRequestParams, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public updateWorkspace(requestParameters: UpdateWorkspaceRequestParams, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public updateWorkspace(requestParameters: UpdateWorkspaceRequestParams, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public updateWorkspace(requestParameters: UpdateWorkspaceRequestParams, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + const id = requestParameters.id; + if (id === null || id === undefined) { + throw new Error('Required parameter id was null or undefined when calling updateWorkspace.'); + } + const updateWorkspaceRequest = requestParameters.updateWorkspaceRequest; + + let localVarHeaders = this.defaultHeaders; + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' | 'blob' = 'json'; + if (localVarHttpHeaderAcceptSelected) { + if (localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) { + responseType_ = 'json'; + } else { + responseType_ = 'blob'; + } + } + + let localVarPath = `/workspaces/${this.configuration.encodeParam({name: "id", value: id, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}`; + return this.httpClient.request('put', `${this.configuration.basePath}${localVarPath}`, + { + context: localVarHttpContext, + body: updateWorkspaceRequest, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + +} diff --git a/src/app/shared/generated/configuration.ts b/src/app/shared/generated/configuration.ts new file mode 100644 index 00000000..526b454f --- /dev/null +++ b/src/app/shared/generated/configuration.ts @@ -0,0 +1,166 @@ +import { HttpParameterCodec } from '@angular/common/http'; +import { Param } from './param'; + +export interface ConfigurationParameters { + /** + * @deprecated Since 5.0. Use credentials instead + */ + apiKeys?: {[ key: string ]: string}; + username?: string; + password?: string; + /** + * @deprecated Since 5.0. Use credentials instead + */ + accessToken?: string | (() => string); + basePath?: string; + withCredentials?: boolean; + /** + * Takes care of encoding query- and form-parameters. + */ + encoder?: HttpParameterCodec; + /** + * Override the default method for encoding path parameters in various + * styles. + *

+ * See {@link README.md} for more details + *

+ */ + encodeParam?: (param: Param) => string; + /** + * The keys are the names in the securitySchemes section of the OpenAPI + * document. They should map to the value used for authentication + * minus any standard prefixes such as 'Basic' or 'Bearer'. + */ + credentials?: {[ key: string ]: string | (() => string | undefined)}; +} + +export class Configuration { + /** + * @deprecated Since 5.0. Use credentials instead + */ + apiKeys?: {[ key: string ]: string}; + username?: string; + password?: string; + /** + * @deprecated Since 5.0. Use credentials instead + */ + accessToken?: string | (() => string); + basePath?: string; + withCredentials?: boolean; + /** + * Takes care of encoding query- and form-parameters. + */ + encoder?: HttpParameterCodec; + /** + * Encoding of various path parameter + * styles. + *

+ * See {@link README.md} for more details + *

+ */ + encodeParam: (param: Param) => string; + /** + * The keys are the names in the securitySchemes section of the OpenAPI + * document. They should map to the value used for authentication + * minus any standard prefixes such as 'Basic' or 'Bearer'. + */ + credentials: {[ key: string ]: string | (() => string | undefined)}; + + constructor(configurationParameters: ConfigurationParameters = {}) { + this.apiKeys = configurationParameters.apiKeys; + this.username = configurationParameters.username; + this.password = configurationParameters.password; + this.accessToken = configurationParameters.accessToken; + this.basePath = configurationParameters.basePath; + this.withCredentials = configurationParameters.withCredentials; + this.encoder = configurationParameters.encoder; + if (configurationParameters.encodeParam) { + this.encodeParam = configurationParameters.encodeParam; + } + else { + this.encodeParam = param => this.defaultEncodeParam(param); + } + if (configurationParameters.credentials) { + this.credentials = configurationParameters.credentials; + } + else { + this.credentials = {}; + } + } + + /** + * Select the correct content-type to use for a request. + * Uses {@link Configuration#isJsonMime} to determine the correct content-type. + * If no content type is found return the first found type if the contentTypes is not empty + * @param contentTypes - the array of content types that are available for selection + * @returns the selected content-type or undefined if no selection could be made. + */ + public selectHeaderContentType (contentTypes: string[]): string | undefined { + if (contentTypes.length === 0) { + return undefined; + } + + const type = contentTypes.find((x: string) => this.isJsonMime(x)); + if (type === undefined) { + return contentTypes[0]; + } + return type; + } + + /** + * Select the correct accept content-type to use for a request. + * Uses {@link Configuration#isJsonMime} to determine the correct accept content-type. + * If no content type is found return the first found type if the contentTypes is not empty + * @param accepts - the array of content types that are available for selection. + * @returns the selected content-type or undefined if no selection could be made. + */ + public selectHeaderAccept(accepts: string[]): string | undefined { + if (accepts.length === 0) { + return undefined; + } + + const type = accepts.find((x: string) => this.isJsonMime(x)); + if (type === undefined) { + return accepts[0]; + } + return type; + } + + /** + * Check if the given MIME is a JSON MIME. + * JSON MIME examples: + * application/json + * application/json; charset=UTF8 + * APPLICATION/JSON + * application/vnd.company+json + * @param mime - MIME (Multipurpose Internet Mail Extensions) + * @return True if the given MIME is JSON, false otherwise. + */ + public isJsonMime(mime: string): boolean { + const jsonMime: RegExp = new RegExp('^(application\/json|[^;/ \t]+\/[^;/ \t]+[+]json)[ \t]*(;.*)?$', 'i'); + return mime !== null && (jsonMime.test(mime) || mime.toLowerCase() === 'application/json-patch+json'); + } + + public lookupCredential(key: string): string | undefined { + const value = this.credentials[key]; + return typeof value === 'function' + ? value() + : value; + } + + private defaultEncodeParam(param: Param): string { + // This implementation exists as fallback for missing configuration + // and for backwards compatibility to older typescript-angular generator versions. + // It only works for the 'simple' parameter style. + // Date-handling only works for the 'date-time' format. + // All other styles and Date-formats are probably handled incorrectly. + // + // But: if that's all you need (i.e.: the most common use-case): no need for customization! + + const value = param.dataFormat === 'date-time' && param.value instanceof Date + ? (param.value as Date).toISOString() + : param.value; + + return encodeURIComponent(String(value)); + } +} diff --git a/src/app/shared/generated/encoder.ts b/src/app/shared/generated/encoder.ts new file mode 100644 index 00000000..138c4d5c --- /dev/null +++ b/src/app/shared/generated/encoder.ts @@ -0,0 +1,20 @@ +import { HttpParameterCodec } from '@angular/common/http'; + +/** + * Custom HttpParameterCodec + * Workaround for https://github.com/angular/angular/issues/18261 + */ +export class CustomHttpParameterCodec implements HttpParameterCodec { + encodeKey(k: string): string { + return encodeURIComponent(k); + } + encodeValue(v: string): string { + return encodeURIComponent(v); + } + decodeKey(k: string): string { + return decodeURIComponent(k); + } + decodeValue(v: string): string { + return decodeURIComponent(v); + } +} diff --git a/src/app/shared/generated/index.ts b/src/app/shared/generated/index.ts new file mode 100644 index 00000000..104dd3d2 --- /dev/null +++ b/src/app/shared/generated/index.ts @@ -0,0 +1,6 @@ +export * from './api/api'; +export * from './model/models'; +export * from './variables'; +export * from './configuration'; +export * from './api.module'; +export * from './param'; diff --git a/src/app/shared/generated/model/createMenuItemRequest.ts b/src/app/shared/generated/model/createMenuItemRequest.ts new file mode 100644 index 00000000..db08b212 --- /dev/null +++ b/src/app/shared/generated/model/createMenuItemRequest.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { CreateUpdateMenuItem } from './createUpdateMenuItem'; + + +export interface CreateMenuItemRequest { + resource: CreateUpdateMenuItem; +} + diff --git a/src/app/shared/generated/model/createMenuItemResponse.ts b/src/app/shared/generated/model/createMenuItemResponse.ts new file mode 100644 index 00000000..ab6b17c5 --- /dev/null +++ b/src/app/shared/generated/model/createMenuItemResponse.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { MenuItem } from './menuItem'; + + +export interface CreateMenuItemResponse { + resource?: MenuItem; +} + diff --git a/src/app/shared/generated/model/createProductRequest.ts b/src/app/shared/generated/model/createProductRequest.ts new file mode 100644 index 00000000..938536a8 --- /dev/null +++ b/src/app/shared/generated/model/createProductRequest.ts @@ -0,0 +1,20 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { CreateUpdateMicrofrontend } from './createUpdateMicrofrontend'; + + +export interface CreateProductRequest { + productName: string; + baseUrl: string; + microfrontends?: Array; +} + diff --git a/src/app/shared/generated/model/createUpdateMenuItem.ts b/src/app/shared/generated/model/createUpdateMenuItem.ts new file mode 100644 index 00000000..f2803a59 --- /dev/null +++ b/src/app/shared/generated/model/createUpdateMenuItem.ts @@ -0,0 +1,34 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { Scope } from './scope'; + + +export interface CreateUpdateMenuItem { + modificationCount?: number; + key?: string; + name?: string; + description?: string; + url?: string; + readonly workspaceName?: string; + readonly applicationId?: string; + disabled?: boolean; + position?: number; + permission?: string; + badge?: string; + scope?: Scope; + workspaceExit?: boolean; + parentItemId?: string; + i18n?: { [key: string]: string; }; +} + + + diff --git a/src/app/shared/generated/model/createUpdateMicrofrontend.ts b/src/app/shared/generated/model/createUpdateMicrofrontend.ts new file mode 100644 index 00000000..3d43eddc --- /dev/null +++ b/src/app/shared/generated/model/createUpdateMicrofrontend.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface CreateUpdateMicrofrontend { + mfeId: string; + basePath: string; +} + diff --git a/src/app/shared/generated/model/createUpdateProductResponse.ts b/src/app/shared/generated/model/createUpdateProductResponse.ts new file mode 100644 index 00000000..b70faf15 --- /dev/null +++ b/src/app/shared/generated/model/createUpdateProductResponse.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { Product } from './product'; + + +export interface CreateUpdateProductResponse { + resource: Product; +} + diff --git a/src/app/shared/generated/model/createWorkspaceMenuItemStructrueRequest.ts b/src/app/shared/generated/model/createWorkspaceMenuItemStructrueRequest.ts new file mode 100644 index 00000000..429e3a05 --- /dev/null +++ b/src/app/shared/generated/model/createWorkspaceMenuItemStructrueRequest.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { MenuItem } from './menuItem'; + + +export interface CreateWorkspaceMenuItemStructrueRequest { + menuItems?: Array; +} + diff --git a/src/app/shared/generated/model/createWorkspaceRequest.ts b/src/app/shared/generated/model/createWorkspaceRequest.ts new file mode 100644 index 00000000..e01a3687 --- /dev/null +++ b/src/app/shared/generated/model/createWorkspaceRequest.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { Workspace } from './workspace'; + + +export interface CreateWorkspaceRequest { + resource: Workspace; +} + diff --git a/src/app/shared/generated/model/createWorkspaceResponse.ts b/src/app/shared/generated/model/createWorkspaceResponse.ts new file mode 100644 index 00000000..e14d4557 --- /dev/null +++ b/src/app/shared/generated/model/createWorkspaceResponse.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { Workspace } from './workspace'; + + +export interface CreateWorkspaceResponse { + resource?: Workspace; +} + diff --git a/src/app/shared/generated/model/eximMenuStructure.ts b/src/app/shared/generated/model/eximMenuStructure.ts new file mode 100644 index 00000000..eb748c5b --- /dev/null +++ b/src/app/shared/generated/model/eximMenuStructure.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { EximWorkspaceMenuItem } from './eximWorkspaceMenuItem'; + + +export interface EximMenuStructure { + menuItems?: Array; +} + diff --git a/src/app/shared/generated/model/eximScope.ts b/src/app/shared/generated/model/eximScope.ts new file mode 100644 index 00000000..6f057906 --- /dev/null +++ b/src/app/shared/generated/model/eximScope.ts @@ -0,0 +1,19 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export enum EximScope { + Workspace = 'WORKSPACE', + App = 'APP', + Page = 'PAGE' +} + diff --git a/src/app/shared/generated/model/eximSubjectLink.ts b/src/app/shared/generated/model/eximSubjectLink.ts new file mode 100644 index 00000000..7c5a32af --- /dev/null +++ b/src/app/shared/generated/model/eximSubjectLink.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface EximSubjectLink { + label?: string; + url?: string; +} + diff --git a/src/app/shared/generated/model/eximWorkspace.ts b/src/app/shared/generated/model/eximWorkspace.ts new file mode 100644 index 00000000..144ebb3e --- /dev/null +++ b/src/app/shared/generated/model/eximWorkspace.ts @@ -0,0 +1,34 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { MenuSnapshot } from './menuSnapshot'; +import { EximSubjectLink } from './eximSubjectLink'; +import { EximWorkspaceAddress } from './eximWorkspaceAddress'; + + +export interface EximWorkspace { + name?: string; + description?: string; + theme?: string; + homePage?: string; + baseUrl?: string; + companyName?: string; + phoneNumber?: string; + rssFeedUrl?: string; + footerLabel?: string; + logoUrl?: string; + address?: EximWorkspaceAddress; + workspaceRoles?: string; + subjectLinks?: Array; + imageUrls?: Array; + menu?: MenuSnapshot; +} + diff --git a/src/app/shared/generated/model/eximWorkspaceAddress.ts b/src/app/shared/generated/model/eximWorkspaceAddress.ts new file mode 100644 index 00000000..6f2017c8 --- /dev/null +++ b/src/app/shared/generated/model/eximWorkspaceAddress.ts @@ -0,0 +1,21 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface EximWorkspaceAddress { + street?: string; + streetNo?: string; + city?: string; + country?: string; + postalCode?: string; +} + diff --git a/src/app/shared/generated/model/eximWorkspaceMenuItem.ts b/src/app/shared/generated/model/eximWorkspaceMenuItem.ts new file mode 100644 index 00000000..0f71ca05 --- /dev/null +++ b/src/app/shared/generated/model/eximWorkspaceMenuItem.ts @@ -0,0 +1,33 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { EximScope } from './eximScope'; + + +export interface EximWorkspaceMenuItem { + key?: string; + name?: string; + description?: string; + url?: string; + workspaceName?: string; + applicationId?: string; + disabled?: boolean; + position?: number; + permission?: string; + badge?: string; + scope?: EximScope; + workspaceExit?: boolean; + i18n?: { [key: string]: string; }; + children?: Array; +} + + + diff --git a/src/app/shared/generated/model/exportWorkspacesRequest.ts b/src/app/shared/generated/model/exportWorkspacesRequest.ts new file mode 100644 index 00000000..70580a77 --- /dev/null +++ b/src/app/shared/generated/model/exportWorkspacesRequest.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface ExportWorkspacesRequest { + names?: Array; + includeMenus?: boolean; +} + diff --git a/src/app/shared/generated/model/getMenuItemResponse.ts b/src/app/shared/generated/model/getMenuItemResponse.ts new file mode 100644 index 00000000..ed4bfb60 --- /dev/null +++ b/src/app/shared/generated/model/getMenuItemResponse.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { MenuItem } from './menuItem'; + + +export interface GetMenuItemResponse { + resource: MenuItem; +} + diff --git a/src/app/shared/generated/model/getMenuItemsResponse.ts b/src/app/shared/generated/model/getMenuItemsResponse.ts new file mode 100644 index 00000000..438f95fa --- /dev/null +++ b/src/app/shared/generated/model/getMenuItemsResponse.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { MenuItem } from './menuItem'; + + +export interface GetMenuItemsResponse { + menuItems?: Array; +} + diff --git a/src/app/shared/generated/model/getWorkspaceMenuItemStructureResponse.ts b/src/app/shared/generated/model/getWorkspaceMenuItemStructureResponse.ts new file mode 100644 index 00000000..23cb2d5b --- /dev/null +++ b/src/app/shared/generated/model/getWorkspaceMenuItemStructureResponse.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { MenuItem } from './menuItem'; + + +export interface GetWorkspaceMenuItemStructureResponse { + menuItems?: Array; +} + diff --git a/src/app/shared/generated/model/getWorkspaceResponse.ts b/src/app/shared/generated/model/getWorkspaceResponse.ts new file mode 100644 index 00000000..4cf67229 --- /dev/null +++ b/src/app/shared/generated/model/getWorkspaceResponse.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { Workspace } from './workspace'; + + +export interface GetWorkspaceResponse { + resource?: Workspace; +} + diff --git a/src/app/shared/generated/model/importMenuResponse.ts b/src/app/shared/generated/model/importMenuResponse.ts new file mode 100644 index 00000000..daeeb4fe --- /dev/null +++ b/src/app/shared/generated/model/importMenuResponse.ts @@ -0,0 +1,24 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { ImportResponseStatus } from './importResponseStatus'; + + +export interface ImportMenuResponse { + /** + * ID of the request + */ + id?: string; + status?: ImportResponseStatus; +} + + + diff --git a/src/app/shared/generated/model/importResponseStatus.ts b/src/app/shared/generated/model/importResponseStatus.ts new file mode 100644 index 00000000..99727569 --- /dev/null +++ b/src/app/shared/generated/model/importResponseStatus.ts @@ -0,0 +1,20 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export enum ImportResponseStatus { + Updated = 'UPDATED', + Created = 'CREATED', + Skipped = 'SKIPPED', + Error = 'ERROR' +} + diff --git a/src/app/shared/generated/model/importWorkspaceResponse.ts b/src/app/shared/generated/model/importWorkspaceResponse.ts new file mode 100644 index 00000000..0a83630e --- /dev/null +++ b/src/app/shared/generated/model/importWorkspaceResponse.ts @@ -0,0 +1,23 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { ImportResponseStatus } from './importResponseStatus'; + + +export interface ImportWorkspaceResponse { + /** + * ID of the request + */ + id?: string; + workspaces?: { [key: string]: ImportResponseStatus; }; + menus?: { [key: string]: ImportResponseStatus; }; +} + diff --git a/src/app/shared/generated/model/menuItem.ts b/src/app/shared/generated/model/menuItem.ts new file mode 100644 index 00000000..4df6a752 --- /dev/null +++ b/src/app/shared/generated/model/menuItem.ts @@ -0,0 +1,40 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { Scope } from './scope'; + + +export interface MenuItem { + modificationCount?: number; + creationDate?: string; + creationUser?: string; + modificationDate?: string; + modificationUser?: string; + id?: string; + key?: string; + name?: string; + description?: string; + url?: string; + workspaceName?: string; + applicationId?: string; + disabled?: boolean; + position?: number; + permission?: string; + badge?: string; + scope?: Scope; + workspaceExit?: boolean; + parentItemId?: string; + children?: Array; + i18n?: { [key: string]: string; }; +} + + + diff --git a/src/app/shared/generated/model/menuSnapshot.ts b/src/app/shared/generated/model/menuSnapshot.ts new file mode 100644 index 00000000..cfc6ccce --- /dev/null +++ b/src/app/shared/generated/model/menuSnapshot.ts @@ -0,0 +1,23 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { EximMenuStructure } from './eximMenuStructure'; + + +export interface MenuSnapshot { + /** + * ID of the request + */ + id?: string; + created?: string; + menu?: EximMenuStructure; +} + diff --git a/src/app/shared/generated/model/microfrontend.ts b/src/app/shared/generated/model/microfrontend.ts new file mode 100644 index 00000000..a4aae116 --- /dev/null +++ b/src/app/shared/generated/model/microfrontend.ts @@ -0,0 +1,19 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface Microfrontend { + id?: string; + mfeId?: string; + basePath?: string; +} + diff --git a/src/app/shared/generated/model/models.ts b/src/app/shared/generated/model/models.ts new file mode 100644 index 00000000..00a490f9 --- /dev/null +++ b/src/app/shared/generated/model/models.ts @@ -0,0 +1,44 @@ +export * from './createMenuItemRequest'; +export * from './createMenuItemResponse'; +export * from './createProductRequest'; +export * from './createUpdateMenuItem'; +export * from './createUpdateMicrofrontend'; +export * from './createUpdateProductResponse'; +export * from './createWorkspaceMenuItemStructrueRequest'; +export * from './createWorkspaceRequest'; +export * from './createWorkspaceResponse'; +export * from './eximMenuStructure'; +export * from './eximScope'; +export * from './eximSubjectLink'; +export * from './eximWorkspace'; +export * from './eximWorkspaceAddress'; +export * from './eximWorkspaceMenuItem'; +export * from './exportWorkspacesRequest'; +export * from './getMenuItemResponse'; +export * from './getMenuItemsResponse'; +export * from './getWorkspaceMenuItemStructureResponse'; +export * from './getWorkspaceResponse'; +export * from './importMenuResponse'; +export * from './importResponseStatus'; +export * from './importWorkspaceResponse'; +export * from './menuItem'; +export * from './menuSnapshot'; +export * from './microfrontend'; +export * from './pagingResponse'; +export * from './patchMenuItemsRequest'; +export * from './patchMenuItemsResponse'; +export * from './problemDetailInvalidParam'; +export * from './problemDetailParam'; +export * from './problemDetailResponse'; +export * from './product'; +export * from './scope'; +export * from './searchWorkspacesRequest'; +export * from './searchWorkspacesResponse'; +export * from './subjectLink'; +export * from './updateProductRequest'; +export * from './updateWorkspaceRequest'; +export * from './validationConstraint'; +export * from './workspace'; +export * from './workspaceAbstract'; +export * from './workspaceAddress'; +export * from './workspaceSnapshot'; diff --git a/src/app/shared/generated/model/pagingResponse.ts b/src/app/shared/generated/model/pagingResponse.ts new file mode 100644 index 00000000..a5bef093 --- /dev/null +++ b/src/app/shared/generated/model/pagingResponse.ts @@ -0,0 +1,20 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface PagingResponse { + totalElements?: number; + number?: number; + size?: number; + totalPages?: number; +} + diff --git a/src/app/shared/generated/model/patchMenuItemsRequest.ts b/src/app/shared/generated/model/patchMenuItemsRequest.ts new file mode 100644 index 00000000..f6aaab9b --- /dev/null +++ b/src/app/shared/generated/model/patchMenuItemsRequest.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { MenuItem } from './menuItem'; + + +export interface PatchMenuItemsRequest { + resource?: MenuItem; +} + diff --git a/src/app/shared/generated/model/patchMenuItemsResponse.ts b/src/app/shared/generated/model/patchMenuItemsResponse.ts new file mode 100644 index 00000000..10254ca6 --- /dev/null +++ b/src/app/shared/generated/model/patchMenuItemsResponse.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { MenuItem } from './menuItem'; + + +export interface PatchMenuItemsResponse { + resource?: MenuItem; +} + diff --git a/src/app/shared/generated/model/problemDetailInvalidParam.ts b/src/app/shared/generated/model/problemDetailInvalidParam.ts new file mode 100644 index 00000000..4f47735b --- /dev/null +++ b/src/app/shared/generated/model/problemDetailInvalidParam.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface ProblemDetailInvalidParam { + name?: string; + message?: string; +} + diff --git a/src/app/shared/generated/model/problemDetailParam.ts b/src/app/shared/generated/model/problemDetailParam.ts new file mode 100644 index 00000000..6275774b --- /dev/null +++ b/src/app/shared/generated/model/problemDetailParam.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface ProblemDetailParam { + key?: string; + value?: string; +} + diff --git a/src/app/shared/generated/model/problemDetailResponse.ts b/src/app/shared/generated/model/problemDetailResponse.ts new file mode 100644 index 00000000..8fb0c180 --- /dev/null +++ b/src/app/shared/generated/model/problemDetailResponse.ts @@ -0,0 +1,22 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { ProblemDetailInvalidParam } from './problemDetailInvalidParam'; +import { ProblemDetailParam } from './problemDetailParam'; + + +export interface ProblemDetailResponse { + errorCode?: string; + detail?: string; + params?: Array; + invalidParams?: Array; +} + diff --git a/src/app/shared/generated/model/product.ts b/src/app/shared/generated/model/product.ts new file mode 100644 index 00000000..6dde82de --- /dev/null +++ b/src/app/shared/generated/model/product.ts @@ -0,0 +1,26 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { Microfrontend } from './microfrontend'; + + +export interface Product { + modificationCount?: number; + creationDate?: string; + creationUser?: string; + modificationDate?: string; + modificationUser?: string; + id?: string; + productName?: string; + baseUrl?: string; + microfrontends?: Array; +} + diff --git a/src/app/shared/generated/model/scope.ts b/src/app/shared/generated/model/scope.ts new file mode 100644 index 00000000..e26ef58c --- /dev/null +++ b/src/app/shared/generated/model/scope.ts @@ -0,0 +1,19 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export enum Scope { + Workspace = 'WORKSPACE', + App = 'APP', + Page = 'PAGE' +} + diff --git a/src/app/shared/generated/model/searchWorkspacesRequest.ts b/src/app/shared/generated/model/searchWorkspacesRequest.ts new file mode 100644 index 00000000..41d5b8f2 --- /dev/null +++ b/src/app/shared/generated/model/searchWorkspacesRequest.ts @@ -0,0 +1,26 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface SearchWorkspacesRequest { + name?: string; + themeName?: string; + /** + * The number of page. + */ + pageNumber?: number; + /** + * The size of page + */ + pageSize?: number; +} + diff --git a/src/app/shared/generated/model/searchWorkspacesResponse.ts b/src/app/shared/generated/model/searchWorkspacesResponse.ts new file mode 100644 index 00000000..df11ee52 --- /dev/null +++ b/src/app/shared/generated/model/searchWorkspacesResponse.ts @@ -0,0 +1,22 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { WorkspaceAbstract } from './workspaceAbstract'; + + +export interface SearchWorkspacesResponse { + totalElements?: number; + number?: number; + size?: number; + totalPages?: number; + stream?: Array; +} + diff --git a/src/app/shared/generated/model/subjectLink.ts b/src/app/shared/generated/model/subjectLink.ts new file mode 100644 index 00000000..299c618f --- /dev/null +++ b/src/app/shared/generated/model/subjectLink.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface SubjectLink { + label?: string; + url?: string; +} + diff --git a/src/app/shared/generated/model/updateProductRequest.ts b/src/app/shared/generated/model/updateProductRequest.ts new file mode 100644 index 00000000..f260df73 --- /dev/null +++ b/src/app/shared/generated/model/updateProductRequest.ts @@ -0,0 +1,20 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { CreateUpdateMicrofrontend } from './createUpdateMicrofrontend'; + + +export interface UpdateProductRequest { + modificationCount: number; + baseUrl: string; + microfrontends?: Array; +} + diff --git a/src/app/shared/generated/model/updateWorkspaceRequest.ts b/src/app/shared/generated/model/updateWorkspaceRequest.ts new file mode 100644 index 00000000..da84becc --- /dev/null +++ b/src/app/shared/generated/model/updateWorkspaceRequest.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { Workspace } from './workspace'; + + +export interface UpdateWorkspaceRequest { + resource: Workspace; +} + diff --git a/src/app/shared/generated/model/validationConstraint.ts b/src/app/shared/generated/model/validationConstraint.ts new file mode 100644 index 00000000..62b23fd8 --- /dev/null +++ b/src/app/shared/generated/model/validationConstraint.ts @@ -0,0 +1,18 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface ValidationConstraint { + name?: string; + message?: string; +} + diff --git a/src/app/shared/generated/model/workspace.ts b/src/app/shared/generated/model/workspace.ts new file mode 100644 index 00000000..439cef90 --- /dev/null +++ b/src/app/shared/generated/model/workspace.ts @@ -0,0 +1,38 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { WorkspaceAddress } from './workspaceAddress'; +import { SubjectLink } from './subjectLink'; + + +export interface Workspace { + readonly id?: string; + modificationCount?: number; + creationDate?: string; + readonly creationUser?: string; + modificationDate?: string; + readonly modificationUser?: string; + name: string; + description?: string; + theme?: string; + homePage?: string; + baseUrl?: string; + companyName?: string; + phoneNumber?: string; + rssFeedUrl?: string; + footerLabel?: string; + logoUrl?: string; + workspaceRoles?: Array; + address?: WorkspaceAddress; + subjectLinks?: Array; + imageUrls?: Array; +} + diff --git a/src/app/shared/generated/model/workspaceAbstract.ts b/src/app/shared/generated/model/workspaceAbstract.ts new file mode 100644 index 00000000..f46be89c --- /dev/null +++ b/src/app/shared/generated/model/workspaceAbstract.ts @@ -0,0 +1,21 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface WorkspaceAbstract { + name: string; + description?: string; + theme?: string; + baseUrl?: string; + logoUrl?: string; +} + diff --git a/src/app/shared/generated/model/workspaceAddress.ts b/src/app/shared/generated/model/workspaceAddress.ts new file mode 100644 index 00000000..5e808574 --- /dev/null +++ b/src/app/shared/generated/model/workspaceAddress.ts @@ -0,0 +1,21 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface WorkspaceAddress { + street?: string; + streetNo?: string; + city?: string; + country?: string; + postalCode?: string; +} + diff --git a/src/app/shared/generated/model/workspaceSnapshot.ts b/src/app/shared/generated/model/workspaceSnapshot.ts new file mode 100644 index 00000000..2e04d657 --- /dev/null +++ b/src/app/shared/generated/model/workspaceSnapshot.ts @@ -0,0 +1,23 @@ +/** + * onecx-workspace-bff + * OneCx workspace Bff + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { EximWorkspace } from './eximWorkspace'; + + +export interface WorkspaceSnapshot { + /** + * ID of the request + */ + id?: string; + created?: string; + workspaces?: { [key: string]: EximWorkspace; }; +} + diff --git a/src/app/shared/generated/param.ts b/src/app/shared/generated/param.ts new file mode 100644 index 00000000..78a2d20a --- /dev/null +++ b/src/app/shared/generated/param.ts @@ -0,0 +1,69 @@ +/** + * Standard parameter styles defined by OpenAPI spec + */ +export type StandardParamStyle = + | 'matrix' + | 'label' + | 'form' + | 'simple' + | 'spaceDelimited' + | 'pipeDelimited' + | 'deepObject' + ; + +/** + * The OpenAPI standard {@link StandardParamStyle}s may be extended by custom styles by the user. + */ +export type ParamStyle = StandardParamStyle | string; + +/** + * Standard parameter locations defined by OpenAPI spec + */ +export type ParamLocation = 'query' | 'header' | 'path' | 'cookie'; + +/** + * Standard types as defined in OpenAPI Specification: Data Types + */ +export type StandardDataType = + | "integer" + | "number" + | "boolean" + | "string" + | "object" + | "array" + ; + +/** + * Standard {@link DataType}s plus your own types/classes. + */ +export type DataType = StandardDataType | string; + +/** + * Standard formats as defined in OpenAPI Specification: Data Types + */ +export type StandardDataFormat = + | "int32" + | "int64" + | "float" + | "double" + | "byte" + | "binary" + | "date" + | "date-time" + | "password" + ; + +export type DataFormat = StandardDataFormat | string; + +/** + * The parameter to encode. + */ +export interface Param { + name: string; + value: unknown; + in: ParamLocation; + style: ParamStyle, + explode: boolean; + dataType: DataType; + dataFormat: DataFormat | undefined; +} diff --git a/src/app/shared/generated/variables.ts b/src/app/shared/generated/variables.ts new file mode 100644 index 00000000..6fe58549 --- /dev/null +++ b/src/app/shared/generated/variables.ts @@ -0,0 +1,9 @@ +import { InjectionToken } from '@angular/core'; + +export const BASE_PATH = new InjectionToken('basePath'); +export const COLLECTION_FORMATS = { + 'csv': ',', + 'tsv': ' ', + 'ssv': ' ', + 'pipes': '|' +} diff --git a/src/app/shared/image-container/image-container.component.html b/src/app/shared/image-container/image-container.component.html new file mode 100644 index 00000000..7eeab2ec --- /dev/null +++ b/src/app/shared/image-container/image-container.component.html @@ -0,0 +1,58 @@ +Image + + + diff --git a/src/app/shared/image-container/image-container.component.scss b/src/app/shared/image-container/image-container.component.scss new file mode 100644 index 00000000..f7f1dc5d --- /dev/null +++ b/src/app/shared/image-container/image-container.component.scss @@ -0,0 +1,46 @@ +::ng-deep { + .image-object { + object-fit: contain; + } + .image-sm { + max-height: 45px; + max-width: 100px; + } + .placeholder-sm { + max-height: 40px; + max-width: 65px; + } + .image-lg { + max-height: 70px; + max-width: 170px; + } + .placeholder-lg { + max-height: 60px; + max-width: 97px; + } + @media screen and (max-width: 768px) { + .sm\:image-lg { + max-height: 45px; + max-width: 100px; + } + .sm\:placeholder-lg { + max-height: 40px; + max-width: 65px; + } + } + .placeholder-sm, + .placeholder-lg { + width: 100%; + border-radius: var(--border-radius); + } + .placeholder { + // https://www.mediaevent.de/css/gradient.html + // org: rgba(168, 185, 209, 0.9) === hsla(215, 30%, 70%, 0.9) + background-image: linear-gradient( + rgba(203, 210, 221, 0.9) 0%, + rgba(203, 210, 221, 0) 50%, + rgba(203, 210, 221, 0.9) 100% + ), + linear-gradient(to right, rgba(203, 210, 221, 0.8) 30%, white 50%, rgba(203, 210, 221, 0.8) 70%); + } +} diff --git a/src/app/shared/image-container/image-container.component.ts b/src/app/shared/image-container/image-container.component.ts new file mode 100644 index 00000000..3b963311 --- /dev/null +++ b/src/app/shared/image-container/image-container.component.ts @@ -0,0 +1,32 @@ +import { Component, Input, OnChanges, SimpleChanges } from '@angular/core' +import { environment } from '../../../environments/environment' + +@Component({ + selector: 'app-image-container', + styleUrls: ['./image-container.component.scss'], + templateUrl: './image-container.component.html' +}) +export class ImageContainerComponent implements OnChanges { + @Input() public id = '' + @Input() public imageUrl: string | undefined + @Input() public small = false + + public displayPlaceHolder = false + private apiPrefix = environment.apiPrefix + + public onImageError() { + this.displayPlaceHolder = true + } + + ngOnChanges(changes: SimpleChanges): void { + if (changes['imageUrl']) { + this.displayPlaceHolder = false + + // if image Url does not start with a http the api-prefix ... + // ...then it stored in the backend. So we need to put prefix in front + if (this.imageUrl && !this.imageUrl.match(/^(http|https)/g) && this.imageUrl.indexOf(this.apiPrefix) !== 0) { + this.imageUrl = this.apiPrefix + this.imageUrl + } + } + } +} diff --git a/src/app/shared/label.resolver.spec.ts b/src/app/shared/label.resolver.spec.ts new file mode 100644 index 00000000..97b52856 --- /dev/null +++ b/src/app/shared/label.resolver.spec.ts @@ -0,0 +1,43 @@ +import { LabelResolver } from './label.resolver' + +let labelResolver: LabelResolver + +describe('LabelResolver', () => { + const translateServiceSpy = jasmine.createSpyObj('TranslateService', ['instant']) + + const activatedRouteSpy = jasmine.createSpyObj('ActivatedRouteSnapshot', [], { + routeConfig: { + path: 'path' + }, + data: {} + }) + + const routerStateSpy = jasmine.createSpyObj('RouterStateSnapshot', ['']) + + beforeEach(async () => { + labelResolver = new LabelResolver(translateServiceSpy) + translateServiceSpy.instant.calls.reset() + const dataSpy = Object.getOwnPropertyDescriptor(activatedRouteSpy, 'data')?.get as jasmine.Spy<() => {}> + dataSpy.and.returnValue({}) + }) + + it('should translate if breadcrumb is present', () => { + const dataSpy = Object.getOwnPropertyDescriptor(activatedRouteSpy, 'data')?.get as jasmine.Spy<() => {}> + dataSpy.and.returnValue({ + breadcrumb: 'defined' + }) + translateServiceSpy.instant.and.returnValue('translation') + + const result = labelResolver.resolve(activatedRouteSpy, routerStateSpy) + + expect(result).toBe('translation') + expect(translateServiceSpy.instant).toHaveBeenCalledOnceWith('defined') + }) + + it('should use route path if breadcrumb is not present', () => { + const result = labelResolver.resolve(activatedRouteSpy, routerStateSpy) + + expect(result).toBe('path') + expect(translateServiceSpy.instant).toHaveBeenCalledTimes(0) + }) +}) diff --git a/src/app/shared/label.resolver.ts b/src/app/shared/label.resolver.ts new file mode 100644 index 00000000..bee3fc4f --- /dev/null +++ b/src/app/shared/label.resolver.ts @@ -0,0 +1,30 @@ +// import { Injectable } from '@angular/core' +// import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router' +// import { TranslateService } from '@ngx-translate/core' +// import { Observable } from 'rxjs' + +// //dont use `providedIn root` - wont work when we are in shell +// @Injectable() +// export class LabelResolver implements Resolve { +// constructor(private translate: TranslateService) {} +// /* eslint-disable @typescript-eslint/no-unused-vars */ /* TODO: is state needed */ +// resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): string | Observable | Promise { +// return route.data['breadcrumb'] ? this.translate.instant(route.data['breadcrumb']) : route.routeConfig?.path +// } +// } + +import { Injectable } from '@angular/core' +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router' +import { TranslateService } from '@ngx-translate/core' +import { Observable, map } from 'rxjs' + +//dont use `providedIn root` - wont work when we are in shell +@Injectable() +export class LabelResolver implements Resolve { + constructor(private translate: TranslateService) {} + resolve(route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): string | Observable | Promise { + return route.data['breadcrumb'] + ? this.translate.get(route.data['breadcrumb']).pipe(map((t) => t.toString())) + : route.routeConfig?.path ?? '' + } +} diff --git a/src/app/shared/shared.module.spec.ts b/src/app/shared/shared.module.spec.ts new file mode 100644 index 00000000..4ad1d586 --- /dev/null +++ b/src/app/shared/shared.module.spec.ts @@ -0,0 +1,46 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core' +import { TestBed } from '@angular/core/testing' +import { HttpClient } from '@angular/common/http' +import { HttpClientTestingModule } from '@angular/common/http/testing' + +import { MfeInfo, TranslateCombinedLoader } from '@onecx/portal-integration-angular' +import { basePathProvider, HttpLoaderFactory } from './shared.module' + +describe('SharedModule', () => { + let httpClient: HttpClient + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + schemas: [NO_ERRORS_SCHEMA] + }) + + httpClient = TestBed.inject(HttpClient) + }) + + it('should return the correct basePath with mfeInfo', () => { + const mfeInfo: MfeInfo = { + mountPath: '', + remoteBaseUrl: 'http://localhost:4200/', + baseHref: '', + shellName: '' + } + + const result = basePathProvider(mfeInfo) + + expect(result).toEqual('http://localhost:4200/portal-api') + }) + + it('should return a translate loader', () => { + const mfeInfo: MfeInfo = { + mountPath: '', + remoteBaseUrl: 'http://localhost:4200/', + baseHref: '', + shellName: '' + } + + const result = HttpLoaderFactory(httpClient, mfeInfo) + + expect(result).toBeInstanceOf(TranslateCombinedLoader) + }) +}) diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts new file mode 100644 index 00000000..801fb109 --- /dev/null +++ b/src/app/shared/shared.module.ts @@ -0,0 +1,178 @@ +import { CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +// import { HttpClient } from '@angular/common/http' +import { FormsModule, ReactiveFormsModule } from '@angular/forms' +import { + // MissingTranslationHandler, + // MissingTranslationHandlerParams, + // TranslateLoader, + TranslateModule, + TranslateService +} from '@ngx-translate/core' +// import { TranslateHttpLoader } from '@ngx-translate/http-loader' +import { ErrorTailorModule } from '@ngneat/error-tailor' + +import { AutoCompleteModule } from 'primeng/autocomplete' +import { BadgeModule } from 'primeng/badge' +import { CheckboxModule } from 'primeng/checkbox' +import { ConfirmPopupModule } from 'primeng/confirmpopup' +import { ConfirmationService, MessageService } from 'primeng/api' +import { DataViewModule } from 'primeng/dataview' +import { DialogModule } from 'primeng/dialog' +import { DialogService, DynamicDialogModule } from 'primeng/dynamicdialog' +import { DropdownModule } from 'primeng/dropdown' +import { FileUploadModule } from 'primeng/fileupload' +import { InputTextModule } from 'primeng/inputtext' +import { InputTextareaModule } from 'primeng/inputtextarea' +import { KeyFilterModule } from 'primeng/keyfilter' +import { ListboxModule } from 'primeng/listbox' +import { MultiSelectModule } from 'primeng/multiselect' +import { OverlayPanelModule } from 'primeng/overlaypanel' +import { PanelModule } from 'primeng/panel' +import { SelectButtonModule } from 'primeng/selectbutton' +import { StepsModule } from 'primeng/steps' +import { TabViewModule } from 'primeng/tabview' +import { TableModule } from 'primeng/table' +import { ToastModule } from 'primeng/toast' +import { TreeModule } from 'primeng/tree' + +import { + MfeInfo, + MFE_INFO, + PortalDialogService, + PortalMessageService + // TranslateCombinedLoader +} from '@onecx/portal-integration-angular' + +import { environment } from '../../environments/environment' +import { BASE_PATH } from './generated' +import { LabelResolver } from './label.resolver' +import { ImageContainerComponent } from './image-container/image-container.component' +import { ThemeColorBoxComponent } from './theme-color-box/theme-color-box.component' + +export const basePathProvider = (mfeInfo: MfeInfo) => { + /* console.log( + 'Base path provider: ' + (mfeInfo ? mfeInfo.remoteBaseUrl + '' + environment.apiPrefix : '' + environment.apiPrefix) + ) */ + return (mfeInfo ? mfeInfo.remoteBaseUrl : '') + environment.apiPrefix +} + +// export function HttpLoaderFactory(http: HttpClient, mfeInfo: MfeInfo) { +// // console.log(`Configuring translation loader ${mfeInfo?.remoteBaseUrl}`) +// // if running standalone then load the app assets directly from remote base URL +// const appAssetPrefix = mfeInfo?.remoteBaseUrl ? mfeInfo.remoteBaseUrl : './' +// return new TranslateCombinedLoader( +// new TranslateHttpLoader(http, appAssetPrefix + 'assets/i18n/', '.json'), +// new TranslateHttpLoader(http, appAssetPrefix + 'onecx-portal-lib/assets/i18n/', '.json') +// ) +// } + +// export class MyMissingTranslationHandler implements MissingTranslationHandler { +// handle(params: MissingTranslationHandlerParams) { +// console.log(`Missing translation for ${params.key}`) +// return params.key +// } +// } + +@NgModule({ + declarations: [ImageContainerComponent, ThemeColorBoxComponent], + imports: [ + AutoCompleteModule, + BadgeModule, + CheckboxModule, + CommonModule, + ConfirmPopupModule, + DataViewModule, + DialogModule, + DropdownModule, + DynamicDialogModule, + FileUploadModule, + FormsModule, + InputTextModule, + InputTextareaModule, + KeyFilterModule, + ListboxModule, + MultiSelectModule, + OverlayPanelModule, + PanelModule, + ReactiveFormsModule, + SelectButtonModule, + StepsModule, + TabViewModule, + TableModule, + ToastModule, + TreeModule, + TranslateModule /* .forRoot({ + isolate: true, + loader: { provide: TranslateLoader, useFactory: HttpLoaderFactory, deps: [HttpClient, MFE_INFO] }, + missingTranslationHandler: { provide: MissingTranslationHandler, useClass: MyMissingTranslationHandler } + }) */, + ErrorTailorModule.forRoot({ + controlErrorsOn: { async: true, blur: true, change: true }, + errors: { + useFactory: (i18n: TranslateService) => { + return { + required: () => i18n.instant('VALIDATION.ERRORS.EMPTY_REQUIRED_FIELD'), + maxlength: ({ requiredLength }) => + i18n.instant('VALIDATION.ERRORS.MAXIMUM_LENGTH').replace('{{chars}}', requiredLength), + minlength: ({ requiredLength }) => + i18n.instant('VALIDATION.ERRORS.MINIMUM_LENGTH').replace('{{chars}}', requiredLength), + pattern: () => i18n.instant('VALIDATION.ERRORS.PATTERN_ERROR') + } + }, + deps: [TranslateService] + }, + //this is required because primeng calendar wraps things in an ugly way + blurPredicate: (element: Element) => { + return ['INPUT', 'TEXTAREA', 'SELECT', 'CUSTOM-DATE', 'P-CALENDAR', 'P-DROPDOWN'].some( + (selector) => element.tagName === selector + ) + } + }) + ], + exports: [ + AutoCompleteModule, + BadgeModule, + CheckboxModule, + CommonModule, + ConfirmPopupModule, + DataViewModule, + DialogModule, + DropdownModule, + DynamicDialogModule, + ErrorTailorModule, + FileUploadModule, + FormsModule, + ImageContainerComponent, + InputTextModule, + InputTextareaModule, + KeyFilterModule, + ListboxModule, + MultiSelectModule, + OverlayPanelModule, + PanelModule, + ReactiveFormsModule, + SelectButtonModule, + StepsModule, + TabViewModule, + TableModule, + ThemeColorBoxComponent, + ToastModule, + TranslateModule, + TreeModule + ], + //this is not elegant, for some reason the injection token from primeng does not work across federated module + providers: [ + ConfirmationService, + LabelResolver, + { provide: MessageService, useExisting: PortalMessageService }, + { provide: DialogService, useClass: PortalDialogService }, + { + provide: BASE_PATH, + useFactory: basePathProvider, + deps: [MFE_INFO] + } + ], + schemas: [NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA] +}) +export class SharedModule {} diff --git a/src/app/shared/theme-color-box/theme-color-box.component.html b/src/app/shared/theme-color-box/theme-color-box.component.html new file mode 100644 index 00000000..f6f5242d --- /dev/null +++ b/src/app/shared/theme-color-box/theme-color-box.component.html @@ -0,0 +1,41 @@ +
+
+
+
+
+
+
diff --git a/src/app/shared/theme-color-box/theme-color-box.component.scss b/src/app/shared/theme-color-box/theme-color-box.component.scss new file mode 100644 index 00000000..28417102 --- /dev/null +++ b/src/app/shared/theme-color-box/theme-color-box.component.scss @@ -0,0 +1,19 @@ +::ng-deep { + .theme-color-box { + .theme-color { + width: 20%; + &:first-of-type { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + } + &:last-of-type { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + } + } + } + // height of a normal text input control + .h-inputtext { + height: 2.786rem; + } +} diff --git a/src/app/shared/theme-color-box/theme-color-box.component.spec.ts b/src/app/shared/theme-color-box/theme-color-box.component.spec.ts new file mode 100644 index 00000000..69e5928a --- /dev/null +++ b/src/app/shared/theme-color-box/theme-color-box.component.spec.ts @@ -0,0 +1,40 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core' +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' +import { HttpClient } from '@angular/common/http' +import { HttpClientTestingModule } from '@angular/common/http/testing' +import { TranslateLoader, TranslateModule } from '@ngx-translate/core' + +import { HttpLoaderFactory } from '../shared.module' +import { ThemeColorBoxComponent } from './theme-color-box.component' + +describe('ThemeColorBoxComponent', () => { + let component: ThemeColorBoxComponent + let fixture: ComponentFixture + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ThemeColorBoxComponent], + imports: [ + HttpClientTestingModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }) + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents() + })) + + beforeEach(() => { + fixture = TestBed.createComponent(ThemeColorBoxComponent) + component = fixture.componentInstance + fixture.detectChanges() + }) + + it('should create', () => { + expect(component).toBeTruthy() + }) +}) diff --git a/src/app/shared/theme-color-box/theme-color-box.component.ts b/src/app/shared/theme-color-box/theme-color-box.component.ts new file mode 100644 index 00000000..1e8789a7 --- /dev/null +++ b/src/app/shared/theme-color-box/theme-color-box.component.ts @@ -0,0 +1,23 @@ +import { Component, Input } from '@angular/core' + +@Component({ + selector: 'app-theme-color-box', + styleUrls: ['./theme-color-box.component.scss'], + templateUrl: './theme-color-box.component.html' +}) +export class ThemeColorBoxComponent { + @Input() public styleClass = 'h-1rem' + @Input() public properties = { + general: { + 'primary-color': 'lightgray', + 'secondary-color': 'silver', + 'text-color': 'gray' + }, + topbar: { + 'topbar-text-color': 'gray', + 'topbar-bg-color': 'lightgray', + 'topbar-menu-button-bg-color': 'silver', + 'topbar-left-bg-color': ' lightgray' + } + } +} diff --git a/src/app/shared/utils.spec.ts b/src/app/shared/utils.spec.ts new file mode 100644 index 00000000..bc762061 --- /dev/null +++ b/src/app/shared/utils.spec.ts @@ -0,0 +1,113 @@ +import { FormGroup, FormControl } from '@angular/forms' +import { SelectItem } from 'primeng/api' + +import { + limitText, + setFetchUrls, + copyToClipboard, + forceFormValidation, + dropDownSortItemsByLabel, + dropDownGetLabelByValue, + sortByLocale +} from './utils' + +describe('util functions', () => { + describe('limitText', () => { + it('should truncate text that exceeds the specified limit', () => { + const result = limitText('hello', 4) + + expect(result).toEqual('hell...') + }) + + it('should return the original text if it does not exceed the limit', () => { + const result = limitText('hello', 6) + + expect(result).toEqual('hello') + }) + + it('should return an empty string for undefined input', () => { + const str: any = undefined + const result = limitText(str, 5) + + expect(result).toEqual('') + }) + }) + + describe('setFetchUrls', () => { + it('should prepend apiPrefix to a relative URL', () => { + const result = setFetchUrls('ahm-api', '/am') + + expect(result).toEqual('ahm-api/am') + }) + + it('should return the original URL if it is absolute', () => { + const result = setFetchUrls('ahm-api', 'http://am') + + expect(result).toEqual('http://am') + }) + }) + + describe('copyToClipboard', () => { + let writeTextSpy: jasmine.Spy + + beforeEach(() => { + writeTextSpy = spyOn(navigator.clipboard, 'writeText') + }) + + it('should copy text to clipboard', () => { + copyToClipboard('text') + + expect(writeTextSpy).toHaveBeenCalledWith('text') + }) + }) + + describe('forceFormValidation', () => { + it('should mark controls as dirty and touched', () => { + const group = new FormGroup({ + control1: new FormControl(''), + control2: new FormControl('') + }) + + forceFormValidation(group) + + expect(group.dirty).toBeTrue() + expect(group.touched).toBeTrue() + }) + }) + + describe('dropDownSortItemsByLabel', () => { + it('should correctly sort items by label', () => { + const items: SelectItem[] = [ + { label: 'label2', value: 2 }, + { label: 'label1', value: 1 } + ] + + const sortedItems = items.sort(dropDownSortItemsByLabel) + + expect(sortedItems[0].label).toEqual('label1') + }) + }) + + describe('dropDownGetLabelByValue', () => { + it('should return the label corresponding to the value', () => { + const items: SelectItem[] = [ + { label: 'label2', value: 2 }, + { label: 'label1', value: 1 } + ] + + const result = dropDownGetLabelByValue(items, '1') + + expect(result).toEqual('label1') + }) + }) + + describe('sortByLocale', () => { + it('should sort strings based on locale', () => { + const strings: string[] = ['str2', 'str1'] + + const sortedStrings = strings.sort(sortByLocale) + + expect(sortedStrings[0]).toEqual('str1') + }) + }) +}) diff --git a/src/app/shared/utils.ts b/src/app/shared/utils.ts new file mode 100644 index 00000000..91b99162 --- /dev/null +++ b/src/app/shared/utils.ts @@ -0,0 +1,200 @@ +// import { MicrofrontendDTO } from '@onecx/portal-integration-angular' +import { AbstractControl, FormArray, FormGroup } from '@angular/forms' +import { SelectItem } from 'primeng/api' +import { Workspace /* , ThemeDTO */ } from './generated' + +export function limitText(text: string, limit: number): string { + if (text) { + return text.length < limit ? text : text.substring(0, limit) + '...' + } else { + return '' + } +} + +/** + * Clones a given portal and converts its microfrontends Set to an array. + * + * Used to avoid serialization issues caused by Sets when sending a portal to the backend. + * @param portal Workspace that should be cloned + * @returns Clone of the portal which contains the portal microfrontends as an array. + */ +export function clonePortalWithMicrofrontendsArray(portal: Workspace): Workspace { + const updatedPortal: Workspace = { ...portal } + // updatedPortal.microfrontendRegistrations = Array.from( + // portal.microfrontendRegistrations ?? [] + // ) as unknown as Set + return updatedPortal +} + +export function setFetchUrls(apiPrefix: string, url: string): string { + if (url && !url.match(/^(http|https)/g)) { + return apiPrefix + url + } else { + return url + } +} + +export function copyToClipboard(text?: string): void { + if (text) navigator.clipboard.writeText(text) +} + +/** + * FORM + */ +export function forceFormValidation(form: AbstractControl): void { + if (form instanceof FormGroup || form instanceof FormArray) { + for (const inner in form.controls) { + const control = form.get(inner) + control && forceFormValidation(control) + } + } else { + form.markAsDirty() + form.markAsTouched() + form.updateValueAndValidity() + } +} + +/** + * DROPDOWN + */ +export type DropDownChangeEvent = MouseEvent & { value: any } + +export function dropDownSortItemsByLabel(a: SelectItem, b: SelectItem): number { + return (a.label ? (a.label as string).toUpperCase() : '').localeCompare( + b.label ? (b.label as string).toUpperCase() : '' + ) +} +export function dropDownGetLabelByValue(ddArray: SelectItem[], val: string): string | undefined { + const a: any = ddArray.find((item: SelectItem) => { + return item?.value == val + }) + return a.label +} +export function sortByLocale(a: any, b: any): number { + return a.toUpperCase().localeCompare(b.toUpperCase()) +} + +// export function sortThemeByName(a: ThemeDTO, b: ThemeDTO): number { +// return (a.name ? (a.name as string).toUpperCase() : '').localeCompare(b.name ? (b.name as string).toUpperCase() : '') +// } + +/** + * TREE + * + * important: tree need a trigger inside the component like + * this.treeNodes = [...this.treeNodes] + */ +/* export function expandAll(treeNodes: TreeNode[]): void { + treeNodes.forEach((node) => { + expandRecursive(node, true) + }) +} + +export function collapseAll(treeNodes: TreeNode[]): void { + treeNodes.forEach((node) => { + expandRecursive(node, false) + }) +} + +export function expandRecursive(node: TreeNode, isExpand: boolean): void { + node.expanded = isExpand + if (node.children) { + node.children.forEach((childNode) => { + expandRecursive(childNode, isExpand) + }) + } +} */ + +/* + * DeepCopy class helps to copy an Original Array or an Object without impacting on original data + */ +/* export function deepCopy(data: any): any { + let node: any + if (Array.isArray(data)) { + node = data.length > 0 ? data.slice(0) : [] + node.forEach((e: any, i: number) => { + if ((typeof e === 'object' && e) || (Array.isArray(e) && e.length > 0)) { + node[i] = deepCopy(e) + } + }) + } else if (data && typeof data === 'object') { + node = data instanceof Date ? data : Object.assign({}, data) + Object.keys(node).forEach((key) => { + if ((typeof node[key] === 'object' && node[key]) || (Array.isArray(node[key]) && node[key].length > 0)) { + node[key] = deepCopy(node[key]) + } + }) + } else { + node = data + } + return node +} + +export function deepCopy2(data: any, objMap?: WeakMap) { + if (!objMap) { + // Map for handle recursive objects + objMap = new WeakMap() + } + + // recursion wrapper + const deeper: any = (value: any) => { + if (value && typeof value === 'object') { + return deepCopy2(value, objMap) + } + return value + } + + // Array value + if (Array.isArray(data)) return data.map(deeper) + + // Object value + if (data && typeof data === 'object') { + // Same object seen earlier + if (objMap.has(data)) return objMap.get(data) + // Date object + if (data instanceof Date) { + const result = new Date(data.valueOf()) + objMap.set(data, result) + return result + } + // Use original prototype + const node = Object.create(Object.getPrototypeOf(data)) + // Save object to map before recursion + objMap.set(data, node) + for (const [key, value] of Object.entries(data)) { + node[key] = deeper(value) + } + return node + } + // Scalar value + return data +} */ + +/** + * Filter objects => exclude given properties + */ +export function filterObject(obj: any, exProps: string[]): any { + const pickedObj: any = {} + for (const prop in obj) { + if (!exProps.includes(prop)) { + pickedObj[prop] = obj[prop] + } + } + return pickedObj +} + +export function filterObjectTree(obj: any, exProps: string[], childProp: string): any { + const pickedObj: any = {} + for (const prop in obj) { + if (!exProps.includes(prop)) { + pickedObj[prop] = obj[prop] + } + } + // if children exists + if (childProp in obj && Array.isArray(obj[childProp])) { + if (obj[childProp].length > 0) { + pickedObj[childProp] = obj[childProp].map((child: any) => filterObjectTree(child, exProps, childProp)) + } + } + return pickedObj +} diff --git a/src/app/test/mocks/auth-mock.service.ts b/src/app/test/mocks/auth-mock.service.ts new file mode 100644 index 00000000..ed76935c --- /dev/null +++ b/src/app/test/mocks/auth-mock.service.ts @@ -0,0 +1,27 @@ +import { IAuthService, UserProfile } from '@onecx/portal-integration-angular' +import { BehaviorSubject } from 'rxjs' + +export class IAuthMockService implements IAuthService { + currentUser$ = new BehaviorSubject(undefined) + getCurrentUser(): UserProfile | null { + return null + } + logout(): void {} + hasPermission(permissionKey: string): boolean { + return false + } + getAuthProviderName(): string { + return 'mock' + } + hasRole(role: string | string[]): boolean { + return false + } + init(): Promise { + return new Promise((resolve, reject) => { + resolve(false) + }) + } + getUserRoles(): string[] { + return [] + } +} diff --git a/src/app/types/index.d.ts b/src/app/types/index.d.ts new file mode 100644 index 00000000..77775758 --- /dev/null +++ b/src/app/types/index.d.ts @@ -0,0 +1 @@ +declare module 'file-saver' diff --git a/src/app/workspace/workspace-create/logo-state.ts b/src/app/workspace/workspace-create/logo-state.ts new file mode 100644 index 00000000..d50bd193 --- /dev/null +++ b/src/app/workspace/workspace-create/logo-state.ts @@ -0,0 +1,7 @@ +export enum LogoState { + INITIAL, + UPDATE, + SELECT, + CONFIRM, + REMOVE +} diff --git a/src/app/workspace/workspace-create/workspace-create.component.html b/src/app/workspace/workspace-create/workspace-create.component.html new file mode 100644 index 00000000..89470e19 --- /dev/null +++ b/src/app/workspace/workspace-create/workspace-create.component.html @@ -0,0 +1,164 @@ +
+
+
+ + + + +
+ +
+ + + + +
+ + + +
+ + + + +
+ +
+ + + + + +
+ + + +
+ + + + +
+ +
+ + + + +
+
+
+ +
+ + +
diff --git a/src/app/workspace/workspace-create/workspace-create.component.spec.ts b/src/app/workspace/workspace-create/workspace-create.component.spec.ts new file mode 100644 index 00000000..7439dabb --- /dev/null +++ b/src/app/workspace/workspace-create/workspace-create.component.spec.ts @@ -0,0 +1,74 @@ +/* import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' +import { WorkspaceCreateComponent } from './workspace-create.component' +import { TranslateModule, TranslateLoader } from '@ngx-translate/core' + +import { HttpClient } from '@angular/common/http' +import { HttpClientTestingModule } from '@angular/common/http/testing' +import { ReactiveFormsModule } from '@angular/forms' +import { RouterTestingModule } from '@angular/router/testing' +import { NO_ERRORS_SCHEMA } from '@angular/core' +import { PortalFormComponent } from '../portal-form/portal-form.component' +import { By } from '@angular/platform-browser' +import { ConfirmationService, MessageService } from 'primeng/api' +import { DropdownModule } from 'primeng/dropdown' +import { environment } from '../../../environments/environment' +import { APP_CONFIG, AUTH_SERVICE } from '@onecx/portal-integration-angular' +import { PortalInternalAPIService } from '../../generated' + +describe('WorkspaceCreateComponent', () => { + let component: WorkspaceCreateComponent + let fixture: ComponentFixture + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [WorkspaceCreateComponent, PortalFormComponent], + imports: [ + HttpClientTestingModule, + RouterTestingModule, + ReactiveFormsModule, + DropdownModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory2, + deps: [HttpClient] + } + }) + ], + providers: [ + { provide: APP_CONFIG, useValue: environment }, + { provide: AUTH_SERVICE, useClass: IAuthMockService }, + PortalInternalAPIService, + MessageService, + ConfirmationService + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents() + })) + + beforeEach(() => { + fixture = TestBed.createComponent(WorkspaceCreateComponent) + component = fixture.componentInstance + fixture.detectChanges() + }) + + it('should create', () => { + expect(component).toBeTruthy() + }) + + it('should start with values', () => { + expect(component.isIdEmpty).toBe(false, 'off at first') + expect(component.isLoading).toBe(true, 'on at first') + }) + + it('should display portal page', () => { + const item = fixture.debugElement.query(By.directive(PortalPageComponent)) + expect(item).toBeDefined() + }) + + it('should display portal mgmt form', () => { + const items = fixture.debugElement.queryAll(By.directive(PortalFormComponent)) + expect(items[0]).toBeDefined() + }) +}) + */ diff --git a/src/app/workspace/workspace-create/workspace-create.component.ts b/src/app/workspace/workspace-create/workspace-create.component.ts new file mode 100644 index 00000000..8270e935 --- /dev/null +++ b/src/app/workspace/workspace-create/workspace-create.component.ts @@ -0,0 +1,164 @@ +import { Component, Output, EventEmitter, Inject } from '@angular/core' +import { FormControl, FormGroup, Validators } from '@angular/forms' +import { ActivatedRoute, Router } from '@angular/router' +import { TranslateService } from '@ngx-translate/core' +import { /* map, */ Observable, of } from 'rxjs' +import { MessageService } from 'primeng/api' +import { SelectItem } from 'primeng/api/selectitem' +import { FileUpload } from 'primeng/fileupload' + +import { AUTH_SERVICE, IAuthService } from '@onecx/portal-integration-angular' + +import { LogoState } from './logo-state' +// import { setFetchUrls , sortThemeByName } from '../../shared/utils' +import { environment } from '../../../environments/environment' +import { + /* ImageV1APIService, */ + WorkspaceAPIService /* , ThemesAPIService */, + Workspace +} from '../../shared/generated' + +@Component({ + selector: 'app-workspace-create', + templateUrl: './workspace-create.component.html' +}) +export class WorkspaceCreateComponent { + @Output() toggleCreationDialogEvent = new EventEmitter() + + themes$: Observable[]> = of([]) + public formGroup: FormGroup + private portalDto!: Workspace + public hasPermission = false + public selectedLogoFile: File | undefined + public preview = false + public previewSrc: string | undefined + public minimumImageWidth = 150 + public minimumImageHeight = 150 + public LogoState = LogoState + public logoState = LogoState.INITIAL + public portalCreationValiationMsg = false + public fetchingLogoUrl?: string + private apiPrefix = environment.apiPrefix + public urlPattern = '/base-path-to-workspace' + + constructor( + private router: Router, + private route: ActivatedRoute, + private portalApi: WorkspaceAPIService, + // private themeApi: ThemesAPIService, + // private imageApi: ImageV1APIService, + private message: MessageService, + private translate: TranslateService, + @Inject(AUTH_SERVICE) readonly auth: IAuthService + ) { + this.hasPermission = this.auth.hasPermission('WORKSPACE#EDIT_TENANT') + + this.formGroup = new FormGroup({ + name: new FormControl(null, [Validators.required, Validators.minLength(2), Validators.maxLength(50)]), + // themeName: new FormControl(null, [Validators.required]), + homePage: new FormControl(null, [Validators.maxLength(255)]), + logoUrl: new FormControl('', [Validators.maxLength(255)]), + baseUrl: new FormControl(null, [Validators.required, Validators.minLength(2), Validators.pattern('^/.*')]), + footerLabel: new FormControl(null, [Validators.maxLength(255)]), + description: new FormControl(null, [Validators.maxLength(255)]) + }) + /* this.themes$ = this.themeApi + .getThemes() + .pipe( + map((val) => + val.sort(sortThemeByName).map((theme) => ({ label: theme.name, value: theme.name || '', id: theme.id })) + ) + ) */ + + if (this.hasPermission) { + this.formGroup.addControl('tenantId', new FormControl(null)) + } + } + + closeDialog() { + this.formGroup.reset() + this.fetchingLogoUrl = undefined + this.selectedLogoFile = undefined + this.toggleCreationDialogEvent.emit() + } + + savePortal() { + this.createPortalDto() + this.portalApi + .createWorkspace({ + createWorkspaceRequest: { resource: this.portalDto } + }) + .pipe() + .subscribe({ + next: (fetchedPortal) => { + this.message.add({ + severity: 'success', + summary: this.translate.instant('ACTIONS.CREATE.MESSAGE.CREATE_OK').replace('{{TYPE}}', 'Workspace') + }) + this.portalCreationValiationMsg = false + this.closeDialog() + this.router.navigate(['./' + fetchedPortal.resource?.name], { relativeTo: this.route }) + }, + error: (err: { error: { message: any } }) => { + this.message.add({ + severity: 'error', + summary: this.translate.instant('ACTIONS.CREATE.MESSAGE.CREATE_NOK').replace('{{TYPE}}', 'Workspace'), + detail: err.error.message + }) + } + }) + } + + private createPortalDto(): void { + this.portalDto = { ...this.formGroup.value } + } + + // former used to check the size of the image + // the size should be limited due performance reasons! + public onSelect(event: Event, uploader: FileUpload): void { + this.selectedLogoFile = uploader.files[0] + this.checkDimension(this.selectedLogoFile, uploader) + } + + /* eslint-disable @typescript-eslint/no-unused-vars */ /* TODO: is uploader needed */ + private checkDimension(file: File, uploader: FileUpload): void { + const reader = new FileReader() + const img = new Image() + + reader.onload = (e: any) => { + img.src = e.target.result.toString() + + img.onload = () => { + const elem = document.createElement('canvas') + elem.width = 150 + elem.height = 150 + const ctx = elem.getContext('2d') + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + ctx!.drawImage(img, 0, 0, 150, 150) + elem.toBlob((blob) => { + if (blob) { + this.selectedLogoFile = new File([blob], 'untitled', { type: blob.type }) + } + }) + this.preview = true + this.previewSrc = elem.toDataURL() + } + } + reader.readAsDataURL(file) + } + + /* onFileUpload(ev: Event, fieldType: 'logo') { + if (ev.target && (ev.target as HTMLInputElement).files) { + const files = (ev.target as HTMLInputElement).files + if (files) { + Array.from(files).forEach((file) => { + this.imageApi.uploadImage({ image: file }).subscribe((data) => { + this.formGroup.controls[fieldType + 'Url'].setValue(data.imageUrl) + this.fetchingLogoUrl = setFetchUrls(this.apiPrefix, this.formGroup.controls[fieldType + 'Url'].value) + this.message.add({ severity: 'info', summary: 'File Uploaded', detail: fieldType + ' image' }) + }) + }) + } + } + } */ +} diff --git a/src/app/workspace/workspace-detail/menu/iconservice.ts b/src/app/workspace/workspace-detail/menu/iconservice.ts new file mode 100644 index 00000000..45ec40a3 --- /dev/null +++ b/src/app/workspace/workspace-detail/menu/iconservice.ts @@ -0,0 +1,13 @@ +import { Injectable } from '@angular/core' + +const ICON_NAMES = + 'sort-alt-slash,arrows-h,arrows-v,pound,prime,chart-pie,reddit,code,sync,shopping-bag,server,database,hashtag,bookmark-fill,filter-fill,heart-fill,flag-fill,circle,circle-fill,bolt,history,box,at,arrow-up-right,arrow-up-left,arrow-down-left,arrow-down-right,telegram,stop-circle,stop,whatsapp,building,qrcode,car,instagram,linkedin,send,slack,moon,sun,youtube,vimeo,flag,wallet,map,link,credit-card,discord,percentage,euro,book,shield,paypal,amazon,phone,filter-slash,facebook,github,twitter,step-backward-alt,step-forward-alt,forward,backward,fast-backward,fast-forward,pause,play,compass,id-card,ticket,file-o,reply,directions-alt,directions,thumbs-up,thumbs-down,sort-numeric-down-alt,sort-numeric-up-alt,sort-alpha-down-alt,sort-alpha-up-alt,sort-numeric-down,sort-numeric-up,sort-alpha-down,sort-alpha-up,sort-alt,sort-amount-up,sort-amount-down,sort-amount-down-alt,sort-amount-up-alt,palette,undo,desktop,sliders-v,sliders-h,search-plus,search-minus,file-excel,file-pdf,check-square,chart-line,user-edit,exclamation-circle,android,google,apple,microsoft,heart,mobile,tablet,key,shopping-cart,comments,comment,briefcase,bell,paperclip,share-alt,envelope,volume-down,volume-up,volume-off,eject,money-bill,images,image,sign-in,sign-out,wifi,sitemap,chart-bar,camera,dollar,lock-open,table,map-marker,list,eye-slash,eye,folder-open,folder,video,inbox,lock,unlock,tags,tag,power-off,save,question-circle,question,copy,file,clone,calendar-times,calendar-minus,calendar-plus,ellipsis-v,ellipsis-h,bookmark,globe,replay,filter,print,align-right,align-left,align-center,align-justify,cog,cloud-download,cloud-upload,cloud,pencil,users,clock,user-minus,user-plus,trash,window-minimize,window-maximize,external-link,refresh,user,exclamation-triangle,calendar,chevron-circle-left,chevron-circle-down,chevron-circle-right,chevron-circle-up,angle-double-down,angle-double-left,angle-double-right,angle-double-up,angle-down,angle-left,angle-right,angle-up,upload,download,ban,star-fill,star,chevron-left,chevron-right,chevron-down,chevron-up,caret-left,caret-right,caret-down,caret-up,search,check,check-circle,times,times-circle,plus,plus-circle,minus,minus-circle,circle-on,circle-off,sort-down,sort-up,sort,step-backward,step-forward,th-large,arrow-down,arrow-left,arrow-right,arrow-up,bars,arrow-circle-down,arrow-circle-left,arrow-circle-right,arrow-circle-up,info,info-circle,home,spinner' + +@Injectable({ providedIn: 'any' }) +export class IconService { + constructor() { + this.icons = ICON_NAMES.split(',') + } + + icons: string[] +} diff --git a/src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.html b/src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.html new file mode 100644 index 00000000..72c5138c --- /dev/null +++ b/src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.html @@ -0,0 +1,45 @@ +
+
+ + +
+ + + + +
+ + {{ node.label }} + diff --git a/src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.scss b/src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.scss new file mode 100644 index 00000000..726cfc02 --- /dev/null +++ b/src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.scss @@ -0,0 +1,36 @@ +:host ::ng-deep { + .p-tree { + .p-tree-wrapper { + padding-right: 1rem; + } + .p-tree-container .p-treenode { + padding: 0rem; + &:hover { + cursor: pointer; + } + .p-treenode-content .p-tree-toggler { + height: 1.7rem; + } + .p-treenode-content:focus { + outline: 0 none; + outline-offset: 0; + box-shadow: inset 0 0 0 0.1rem var(--primary-color); + } + } + .p-treenode-droppoint-active { + background-color: var(--primary-color); + } + } + .reduced-field-size { + height: 2.3rem; + } + .lang-not-exists { + color: var(--danger-button-bg) !important; + } + .item-disabled { + opacity: 0.5; + } + .invisible { + visibility: hidden; + } +} diff --git a/src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.spec.ts b/src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.spec.ts new file mode 100644 index 00000000..d3ed1ac4 --- /dev/null +++ b/src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.spec.ts @@ -0,0 +1,197 @@ +import { NO_ERRORS_SCHEMA, SimpleChanges, SimpleChange } from '@angular/core' +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' +import { HttpClient } from '@angular/common/http' +import { HttpClientTestingModule } from '@angular/common/http/testing' +import { TranslateLoader, TranslateModule } from '@ngx-translate/core' + +import { HttpLoaderFactory } from 'src/app/shared/shared.module' +import { MenuTreeComponent } from './menu-tree.component' +import { MenuTreeService } from 'src/app/services/menu-tree.service' +import { MenuStateService, MenuState } from 'src/app/services/menu-state.service' + +const state: MenuState = { + pageSize: 0, + showDetails: false, + rootFilter: true, + treeMode: true, + treeExpansionState: new Map() +} + +describe('MenuTreeComponent', () => { + let component: MenuTreeComponent + let fixture: ComponentFixture + + const treeServiceSpy = jasmine.createSpyObj('MenuTreeService', ['calculateNewNodesPositions']) + const stateServiceSpy = jasmine.createSpyObj('MenuStateService', ['getState']) + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [MenuTreeComponent], + imports: [ + HttpClientTestingModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }) + ], + schemas: [NO_ERRORS_SCHEMA], + providers: [ + { provide: MenuTreeService, useValue: treeServiceSpy }, + { provide: MenuStateService, useValue: stateServiceSpy } + ] + }).compileComponents() + treeServiceSpy.calculateNewNodesPositions.calls.reset() + stateServiceSpy.getState.calls.reset() + })) + + beforeEach(() => { + fixture = TestBed.createComponent(MenuTreeComponent) + component = fixture.componentInstance + fixture.detectChanges() + }) + + it('should create', () => { + expect(component).toBeTruthy() + }) + + it('should set menuTreeNodes onChanges if portalDetail & changes correct: langExists false', () => { + stateServiceSpy.getState.and.returnValue(state) + const changes: SimpleChanges = { + updateTree: new SimpleChange(null, component.updateTree, true) + } + component.portalMenuItems = [ + { key: 'key', i18n: { ['lang']: 'en' }, children: [{ key: 'key' }], disabled: true }, + { key: 'key2', badge: 'angle-double-down' } + ] + + component.ngOnChanges(changes) + + expect(component.treeExpanded).toBeTrue() + }) + + it('should expand tree nodes on expandAll', () => { + const mockExpansionState: Map = new Map() + stateServiceSpy.getState.and.returnValue({ + treeExpansionState: mockExpansionState, + pageSize: 0, + showDetails: false, + rootFilter: true, + treeMode: true + }) + component.menuTreeNodes = [ + { key: '1', expanded: false, children: [{ key: '1-1', children: [{ key: '1-1-1' }] }] }, + { key: '2' } + ] + + component.expandAll() + + expect(stateServiceSpy.getState().treeExpansionState.get('1')).toBeTrue() + }) + + it('should collapse tree nodes on collapseAll', () => { + const mockExpansionState: Map = new Map() + stateServiceSpy.getState.and.returnValue({ + treeExpansionState: mockExpansionState, + pageSize: 0, + showDetails: false, + rootFilter: true, + treeMode: true + }) + component.menuTreeNodes = [ + { key: '1', expanded: true, children: [{ key: '1-1', children: [{ key: '1-1-1' }] }] }, + { key: '2' } + ] + + component.collapseAll() + + expect(stateServiceSpy.getState().treeExpansionState.get('1')).toBeFalse() + }) + + it('should update menu items onDrop: return before pushing items', () => { + const event = { + dragNode: { key: 'draggedNodeId', parent: { key: 'oldParentNodeId' } }, + dropNode: { key: 'newParentNodeId', children: [{ key: 'draggedNodeId' }], parent: { key: 'parent key' } } + } + treeServiceSpy.calculateNewNodesPositions.and.returnValue([{ id: 'id', position: 1 }]) + component.portalMenuItems = [ + { key: 'key', i18n: { ['lang']: 'en' }, children: [{ key: 'key' }], disabled: true }, + { key: 'key2', badge: 'angle-double-down' } + ] + + component.onDrop(event) + + expect(treeServiceSpy.calculateNewNodesPositions).toHaveBeenCalledWith( + 'oldParentNodeId', + 'newParentNodeId', + component.menuTreeNodes + ) + }) + + it('should update menu items onDrop: other branches: complete updating the structure', () => { + const event = { + dragNode: { key: 'draggedNodeId', parent: { key: 'oldParentNodeId' } }, + dropNode: { key: 'newParentNodeId', children: [{ key: 'otherdraggedNodeId' }], parent: { key: 'parent key' } } + } + treeServiceSpy.calculateNewNodesPositions.and.returnValue([{ id: 'id', position: 1 }]) + spyOn(component.updateMenuStructureEmitter, 'emit') + component.portalMenuItems = [ + { key: 'key', id: 'id', position: 1, i18n: { ['lang']: 'en' }, children: [{ key: 'key' }], disabled: true }, + { key: 'key2', badge: 'angle-double-down' } + ] + const expectedItems = [ + { + key: 'key', + id: 'id', + parentItemId: undefined, + i18n: { lang: 'en' }, + position: 1, + disabled: true, + portalExit: undefined + } + ] + + component.onDrop(event) + + expect(component.updateMenuStructureEmitter.emit).toHaveBeenCalledWith(expectedItems) + }) + + it('should set treeExpansionState onHierarchyViewChange', () => { + const mockExpansionState: Map = new Map() + stateServiceSpy.getState.and.returnValue({ + treeExpansionState: mockExpansionState, + pageSize: 0, + showDetails: false, + rootFilter: true, + treeMode: true + }) + const event = { node: { key: 'node', expanded: true } } + spyOn(mockExpansionState, 'set').and.callThrough() + + component.onHierarchyViewChange(event) + + expect(stateServiceSpy.getState().treeExpansionState.set).toHaveBeenCalledWith(event.node.key, event.node.expanded) + }) + + it('should set languagePreviewValue and mapToTree onLanguagePreviewChange', () => { + const lang = 'de' + component.portalMenuItems = [ + { key: 'key', id: 'id', position: 1, i18n: { ['lang']: 'en' }, children: [{ key: 'key' }], disabled: true }, + { key: 'key2', badge: 'angle-double-down' } + ] + const mockExpansionState: Map = new Map() + stateServiceSpy.getState.and.returnValue({ + treeExpansionState: mockExpansionState, + pageSize: 0, + showDetails: false, + rootFilter: true, + treeMode: true + }) + + component.onLanguagesPreviewChange(lang) + + expect(component.languagesPreviewValue).toEqual(lang) + }) +}) diff --git a/src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.ts b/src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.ts new file mode 100644 index 00000000..690be99f --- /dev/null +++ b/src/app/workspace/workspace-detail/menu/menu-tree/menu-tree.component.ts @@ -0,0 +1,145 @@ +import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core' +import { SelectItem, TreeNode } from 'primeng/api' + +import { MenuItem } from '../../../../shared/generated' +import { MenuTreeService } from '../../../../services/menu-tree.service' +import { MenuStateService } from '../../../../services/menu-state.service' + +@Component({ + selector: 'app-menu-tree', + templateUrl: './menu-tree.component.html', + styleUrls: ['./menu-tree.component.scss'] +}) +export class MenuTreeComponent implements OnChanges { + @Input() public selectedPortalId?: string + @Input() public portalMenuItems!: MenuItem[] + @Input() public languagesPreview!: SelectItem[] + @Input() public updateTree = false + @Output() public updateMenuStructureEmitter = new EventEmitter() + + public menuTreeNodes!: TreeNode[] + public treeExpanded = false + public languagesPreviewValue = 'en' + + constructor(private stateService: MenuStateService, private treeService: MenuTreeService) {} + + public ngOnChanges(changes: SimpleChanges): void { + if (changes['portalMenuItems'] || changes['updateTree']) { + this.menuTreeNodes = this.mapToTree(this.portalMenuItems, this.languagesPreviewValue) + this.treeExpanded = true + } + } + expandAll() { + this.menuTreeNodes.forEach((node) => { + this.expandRecursive(node, true) + }) + } + + collapseAll() { + this.menuTreeNodes.forEach((node) => { + this.expandRecursive(node, false) + }) + } + + private expandRecursive(node: TreeNode, isExpand: boolean) { + node.expanded = isExpand + this.stateService.getState().treeExpansionState.set(node.key || '', node.expanded) + if (node.children) { + node.children.forEach((childNode) => { + this.expandRecursive(childNode, isExpand) + }) + } + } + + private mapToTree(items: MenuItem[], lang: string): TreeNode[] { + items.sort((a, b) => (a.position || 0) - (b.position || 0)) + return items.map((mi) => { + const langExists = mi.i18n && Object.keys(mi.i18n).length > 0 && mi.i18n[lang] + return { + children: mi.children ? this.mapToTree(mi.children, lang) : undefined, + data: mi, + droppable: true, + key: mi.id, + label: mi.i18n && langExists ? mi.i18n[lang] : mi.name, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + expanded: this.stateService.getState().treeExpansionState.get(mi.id!), + icon: + (mi.disabled ? 'item-disabled ' : ' ') + + (mi.badge + ? 'pi pi-' + mi.badge + (langExists ? '' : ' lang-not-exists') + : mi.children && mi.children.length > 0 + ? 'pi pi-folder' + : 'pi pi-file invisible') + } + }) + } + + private flatten(mi: MenuItem): MenuItem[] { + const res = + mi.children && mi.children.length > 0 ? mi.children.flatMap((pi: MenuItem) => this.flatten(pi)).concat(mi) : [mi] + return res + } + + public onDrop(event: { dragNode: TreeNode; dropNode: TreeNode }): void { + const draggedNodeId = event.dragNode.key + const oldParentNodeId = event.dragNode.parent ? event.dragNode.parent.key : undefined + + // find new parent id + let newParentNodeId: string | undefined + if (event.dropNode.children && event.dropNode.children.map((child) => child.key).includes(draggedNodeId)) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + newParentNodeId = event.dropNode.key! + } else if (event.dropNode.parent) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + newParentNodeId = event.dropNode.parent.key! + } + + const newNodesPositions = this.treeService.calculateNewNodesPositions( + oldParentNodeId, + newParentNodeId, + this.menuTreeNodes + ) + const flatMenuItem = this.portalMenuItems.flatMap((pi) => this.flatten(pi)) + + // prepare menu items to update + const updatedMenuItems: MenuItem[] = [] + for (const updatedNode of newNodesPositions) { + const updateMenuItem = flatMenuItem.find((item: MenuItem) => item.id === updatedNode.id) + if (!updateMenuItem) { + return + } + if (updatedNode.id !== draggedNodeId) { + updatedMenuItems.push({ + key: updateMenuItem.key, + id: updateMenuItem.id, + parentItemId: updateMenuItem.parentItemId, + i18n: updateMenuItem.i18n, + position: updatedNode.position, + disabled: updateMenuItem.disabled, + workspaceExit: updateMenuItem.workspaceExit + }) + } else { + updatedMenuItems.push({ + key: updateMenuItem.key, + id: updateMenuItem.id, + parentItemId: newParentNodeId, + i18n: updateMenuItem.i18n, + position: updatedNode.position, + disabled: updateMenuItem.disabled, + workspaceExit: updateMenuItem.workspaceExit + }) + } + } + + this.updateMenuStructureEmitter.emit(updatedMenuItems) + } + + public onHierarchyViewChange(event: { node: { key: string; expanded: boolean } }): void { + this.stateService.getState().treeExpansionState.set(event.node.key, event.node.expanded) + } + + public onLanguagesPreviewChange(lang: string) { + this.languagesPreviewValue = lang + this.menuTreeNodes = this.mapToTree(this.portalMenuItems, this.languagesPreviewValue) + } +} diff --git a/src/app/workspace/workspace-detail/menu/menu.component.html b/src/app/workspace/workspace-detail/menu/menu.component.html new file mode 100644 index 00000000..63450574 --- /dev/null +++ b/src/app/workspace/workspace-detail/menu/menu.component.html @@ -0,0 +1,650 @@ + + + + + + +
+ +
+ +
+ + +
+ + +
+ + +
+
+ + + +
+
+ + + + + + + +
+ +
+
+ + + + + {{ 'ACTIONS.LABEL' | translate }} + Pos + + {{ 'PORTAL.MENU.I18N' | translate }} + + PM + URL + + + + + + + + + {{ rowData.name }} + + +
+ + + + +
+ + + {{ rowData.positionPath }} + + + + + + + + + + {{ limitText(rowData.url, 100) }} + + + +
+
+
+
+
+ + + + + +
+
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ + + + +
+ +
+ + + + + +
+
+ + +
+ +
+ + + + +
+
+ + + +
+ + {{ ico.label || 'dummy-for-renderer' }} +
+
+ +
+ + {{ ico.label }} +
+
+
+ +
+
+
+ + + + + +
+ +
+ + +
+ +
+ + + + +
+ +
+ + + + +
+ +
+ + + + +
+
+
+
+ +
+ + + + + +
+
+
+ {{ 'PORTAL.MENU.DETAIL.I18N.ADD_LANGUAGE' | translate }} +
+ + +
+
+
+ +
+ + +
+
+
+ + + +
+
+
+
{{ ('ACTIONS.DELETE.MESSAGE' | translate).replace('{{ITEM}}', menuItem?.name) }}
+
{{ 'ACTIONS.DELETE.MESSAGE_INFO' | translate }}
+
+
+ +
+ + +
+
+
+ + + + + + + +
+ +
+
+ + + +
    +
  • {{ 'PORTAL.MENU.ACTION.REORDER.TOOLTIP' | translate }}
  • +
  • {{ 'PORTAL.MENU.ACTION.PREVIEW.TOOLTIP' | translate }}
  • +
  • {{ 'PORTAL.MENU.ACTION.PREVIEW2.TOOLTIP' | translate }}
  • +
+ + +
+ +
+
diff --git a/src/app/workspace/workspace-detail/menu/menu.component.scss b/src/app/workspace/workspace-detail/menu/menu.component.scss new file mode 100644 index 00000000..bdb03fc0 --- /dev/null +++ b/src/app/workspace/workspace-detail/menu/menu.component.scss @@ -0,0 +1,182 @@ +:host ::ng-deep { + .p-dialog .p-dialog-content { + padding-bottom: 0; + overflow-y: hidden; + } + + .p-tree .p-tree-container .p-treenode .p-treenode-content { + padding: 0 0 !important; + .p-tree-toggler { + margin-right: 0.1rem; + } + } + .p-treetable { + .p-treetable-header { + padding: 1rem; // var(--table-header-padding); + } + .p-treetable-wrapper { + padding: var(--data-view-content-padding); + } + table { + width: unset; + .p-treetable-thead > tr { + > th { + padding: 0.5rem 0.7rem; + font-weight: var(--table-header-cell-font-weight); + } + > th:first-of-type { + background-color: var(--table-body-row-bg); + border-color: transparent; + } + } + .p-treetable-tbody > tr { + > td { + padding: 0 0.3rem; + align-items: center !important; + .p-treetable-toggler { + margin-right: unset; + } + button.p-button { + &.p-button-icon-only { + width: unset !important; + } + &.p-button-rounded { + height: unset !important; + } + &[disabled] { + opacity: 0.6; + } + } + } + > td:first-of-type { + padding: 0 0.8rem 0rem 0.2rem; + display: flex !important; + } + > td:nth-of-type(2) { + padding: 0 0.8rem; + } + } + } + } + .p-button.p-button-icon-only { + padding: 0.3rem; + &.p-button-rounded { + height: unset; + } + } + .input-field-correction .p-inputtext { + padding-top: 1rem !important; + padding-bottom: 0.5rem !important; + &.p-dropdown-label { + white-space: nowrap; + } + } + .p-dropdown-panel .p-dropdown-items .p-dropdown-item { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + min-height: 2rem; + } + + .p-dialog.p-dialog { + height: auto !important; + } + + .danger-action-text { + color: var(--danger-button-bg); + } + .checkbox-label { + color: var(--emphasis-medium); + transition-duration: var(--transition-duration); + } + + .p-fileupload { + .p-fileupload-buttonbar, + .p-fileupload-content { + background-color: var(--surface-100) !important; + } + .p-fileupload-content { + padding: 0.5rem; + .p-fileupload-row { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 0; + > div { + width: unset; + &:first-child { + display: none; + } + } + } + } + } + + .p-tabview-panel { + margin-top: 0.7rem; + } + .data-view-control, + .data-view-control * { + color: var(--emphasis-medium); + } + + .invisible { + visibility: hidden; + } + .button-min-height { + min-height: 33.2px; + } + + @media screen and (max-width: 276px) { + .xs\:hidden { + display: none !important; + } + } + + @media (max-width: 367px) { + .hidden-xs { + display: none !important; + } + } + @media (max-width: 567px) { + .hidden-sm { + display: none !important; + } + } + @media (max-width: 768px) { + .hidden-md { + display: none !important; + } + } + @media (max-width: 992px) { + .hidden-lg { + display: none !important; + } + } + @media (min-width: 1200px) { + .hidden-xl { + display: none !important; + } + } + /* + @media (max-width: 767px) { + .hidden-xs { + display: none !important; + } + } + @media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } + } + @media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } + } + @media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } + } +*/ +} diff --git a/src/app/workspace/workspace-detail/menu/menu.component.spec.ts b/src/app/workspace/workspace-detail/menu/menu.component.spec.ts new file mode 100644 index 00000000..b34c28f2 --- /dev/null +++ b/src/app/workspace/workspace-detail/menu/menu.component.spec.ts @@ -0,0 +1,864 @@ +import { NO_ERRORS_SCHEMA, Component } from '@angular/core' +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' +import { HttpClient, HttpErrorResponse } from '@angular/common/http' +import { FormsModule, FormControl, FormGroup } from '@angular/forms' +import { Location } from '@angular/common' +import { HttpClientTestingModule } from '@angular/common/http/testing' +import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router' +import { TranslateLoader, TranslateModule } from '@ngx-translate/core' +import { of, throwError } from 'rxjs' + +import { PortalMessageService, ConfigurationService, AUTH_SERVICE } from '@onecx/portal-integration-angular' +import { HttpLoaderFactory } from 'src/app/shared/shared.module' +import { MenuComponent } from './menu.component' +import { MenuStateService, MenuState } from 'src/app/services/menu-state.service' + +import { + PortalDTO, + PortalMenuItemDTO, + PortalInternalAPIService, + MenuItemsInternalAPIService, + ThemesAPIService, + MenuItemDetailsDTO, + Scope +} from '../../../shared/generated' +import FileSaver from 'file-saver' + +const portal: PortalDTO = { + portalName: 'name', + themeName: 'theme', + themeId: 'id', + baseUrl: '/some/base/url', + id: 'id' +} + +const mockMenuItems: PortalMenuItemDTO[] = [ + { + name: 'menu name', + key: 'key', + i18n: { ['en']: 'en' }, + children: [{ name: 'child name', key: 'key' }] + }, + { + name: 'menu2 name', + key: 'key', + i18n: { ['en']: 'en' } + } +] + +const mockItem = { + key: '1-1', + id: 'id1', + positionPath: '1-1', + regMfeAligned: true, + parentItemName: '1', + first: true, + last: false, + prevId: undefined, + disabled: true, + parentItemId: 'some parent id', + name: 'name', + position: 1, + portalExit: true, + url: 'url', + badge: 'badge', + scope: Scope.Portal, + description: 'description' +} + +const state: MenuState = { + pageSize: 0, + showDetails: false, + rootFilter: true, + treeMode: true, + treeExpansionState: new Map(), + portalMenuItems: [] +} + +const form = new FormGroup({ + parentItemId: new FormControl('some parent id'), + key: new FormControl('key'), + name: new FormControl('name'), + position: new FormControl('1'), + disabled: new FormControl(false), + portalExit: new FormControl(false), + url: new FormControl('url'), + badge: new FormControl('badge'), + scope: new FormControl('scope'), + description: new FormControl('description') +}) + +describe('MenuComponent', () => { + let component: MenuComponent + let fixture: ComponentFixture + let mockActivatedRoute: Partial + const mockAuthService = jasmine.createSpyObj('IAuthService', ['hasPermission']) + + const msgServiceSpy = jasmine.createSpyObj('PortalMessageService', ['success', 'error']) + const apiServiceSpy = { + getPortalByPortalId: jasmine.createSpy('getPortalByPortalId').and.returnValue(of({})) + } + const menuApiServiceSpy = { + getMenuStructureForPortalId: jasmine.createSpy('getMenuStructureForPortalId').and.returnValue(of(mockMenuItems)), + getMenuItemById: jasmine.createSpy('getMenuItemById').and.returnValue(of(mockMenuItems)), + patchMenuItem: jasmine.createSpy('patchMenuItem').and.returnValue(of(mockMenuItems)), + bulkPatchMenuItems: jasmine.createSpy('bulkPatchMenuItems').and.returnValue(of(mockMenuItems)), + addMenuItemForPortal: jasmine.createSpy('addMenuItemForPortal').and.returnValue(of(mockMenuItems)), + deleteMenuItemById: jasmine.createSpy('deleteMenuItemById').and.returnValue(of({})), + uploadMenuStructure: jasmine.createSpy('uploadMenuStructure').and.returnValue(of({})) + } + const themeApiServiceSpy = jasmine.createSpyObj('ThemesAPIService', ['getThemeById']) + const configServiceSpy = { + getProperty: jasmine.createSpy('getProperty').and.returnValue('123'), + getPortal: jasmine.createSpy('getPortal').and.returnValue({ + themeId: '1234', + portalName: 'test', + baseUrl: '/', + microfrontendRegistrations: [] + }), + lang: 'en' + } + const translateServiceSpy = jasmine.createSpyObj('TranslateService', ['get']) + const stateServiceSpy = jasmine.createSpyObj('MenuStateService', ['getState', 'updateState']) + const locationSpy = jasmine.createSpyObj('Location', ['back']) + + const mockActivatedRouteSnapshot: Partial = { + params: { + id: 'mockId' + } + } + mockActivatedRoute = { + snapshot: mockActivatedRouteSnapshot as ActivatedRouteSnapshot + } + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [MenuComponent], + imports: [ + HttpClientTestingModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }) + ], + schemas: [NO_ERRORS_SCHEMA], + providers: [ + { provide: ActivatedRoute, useValue: mockActivatedRoute }, + { provide: PortalMessageService, useValue: msgServiceSpy }, + { provide: PortalInternalAPIService, useValue: apiServiceSpy }, + { provide: ConfigurationService, useValue: configServiceSpy }, + { provide: MenuItemsInternalAPIService, useValue: menuApiServiceSpy }, + { provide: ThemesAPIService, useValue: themeApiServiceSpy }, + { provide: AUTH_SERVICE, useValue: mockAuthService }, + { provide: MenuStateService, useValue: stateServiceSpy }, + { provide: Location, useValue: locationSpy } + ] + }).compileComponents() + msgServiceSpy.success.calls.reset() + msgServiceSpy.error.calls.reset() + apiServiceSpy.getPortalByPortalId.calls.reset() + menuApiServiceSpy.getMenuItemById.calls.reset() + menuApiServiceSpy.getMenuStructureForPortalId.calls.reset() + menuApiServiceSpy.patchMenuItem.calls.reset() + menuApiServiceSpy.bulkPatchMenuItems.calls.reset() + menuApiServiceSpy.addMenuItemForPortal.calls.reset() + menuApiServiceSpy.deleteMenuItemById.calls.reset() + menuApiServiceSpy.uploadMenuStructure.calls.reset() + themeApiServiceSpy.getThemeById.calls.reset() + translateServiceSpy.get.calls.reset() + stateServiceSpy.getState.calls.reset() + })) + + beforeEach(() => { + stateServiceSpy.getState.and.returnValue(state) + + fixture = TestBed.createComponent(MenuComponent) + component = fixture.componentInstance + // component.menuItems = state.portalMenuItems + fixture.detectChanges() + }) + + it('should create', () => { + expect(component).toBeTruthy() + }) + + it('should have prepared action buttons onInit: onClose, and called it', () => { + component.ngOnInit() + const action = component.actions[0] + action.actionCallback() + + expect(locationSpy.back).toHaveBeenCalled() + }) + + it('should have prepared action buttons onInit: onExportMenu', () => { + spyOn(component, 'onExportMenu') + + component.ngOnInit() + const action = component.actions[1] + action.actionCallback() + + expect(component.onExportMenu).toHaveBeenCalled() + }) + + it('should have prepared action buttons onInit: onImportMenu', () => { + spyOn(component, 'onImportMenu') + + component.ngOnInit() + const action = component.actions[2] + action.actionCallback() + + expect(component.onImportMenu).toHaveBeenCalled() + }) + + it('should call loadMenu onReload', () => { + spyOn(component, 'loadMenu') + + component.onReload() + + expect(component.loadMenu).toHaveBeenCalledWith(true) + }) + + it('should call loadMenu onReloadMenu', () => { + spyOn(component, 'loadMenu') + + component.onReloadMenu() + + expect(component.loadMenu).toHaveBeenCalledWith(true) + }) + + it('should empty menuTreeFiler and reset filter onClearFilterMenuTable', () => { + const mockMenuTreeFilter = { + nativeElement: jasmine.createSpyObj('nativeElement', ['value']) + } + const mockMenuTree = jasmine.createSpyObj('menuTree', ['filterGlobal']) + component.menuTreeFilter = mockMenuTreeFilter + component.menuTree = mockMenuTree + + component.onClearFilterMenuTable() + + expect(mockMenuTreeFilter.nativeElement.value).toBe('') + expect(mockMenuTree.filterGlobal).toHaveBeenCalledWith('', 'contains') + }) + + it('should recursively expand all menu nodes onExpandAll', () => { + component.menuNodes = [ + { key: '1', expanded: false, children: [{ key: '1-1', children: [{ key: '1-1-1' }] }] }, + { key: '2' } + ] + const mockExpansionState: Map = new Map() + stateServiceSpy.getState.and.returnValue({ + treeExpansionState: mockExpansionState, + pageSize: 0, + showDetails: false, + rootFilter: true, + treeMode: true + }) + + component.onExpandAll() + + expect(stateServiceSpy.getState().treeExpansionState.get('1')).toBeTrue() + }) + + it('should recursively collapse all menu nodes onCollapseAll', () => { + component.menuNodes = [ + { key: '1', expanded: true, children: [{ key: '1-1', children: [{ key: '1-1-1' }] }] }, + { key: '2' } + ] + const mockExpansionState: Map = new Map() + stateServiceSpy.getState.and.returnValue({ + treeExpansionState: mockExpansionState, + pageSize: 0, + showDetails: false, + rootFilter: true, + treeMode: true + }) + + component.onCollapseAll() + + expect(stateServiceSpy.getState().treeExpansionState.get('1')).toBeFalse() + }) + + it('should loadData', () => { + apiServiceSpy.getPortalByPortalId.and.returnValue(of(portal)) + + component.loadData() + + expect(component.portal).toBe(portal) + }) + + it('it should handle error response on loadData', () => { + const errorResponse = new HttpErrorResponse({ + error: 'test error', + status: 404, + statusText: 'Not Found' + }) + apiServiceSpy.getPortalByPortalId.and.returnValue(throwError(() => errorResponse)) + + component.loadData() + + expect(component.exceptionKey).toBe('EXCEPTIONS.HTTP_STATUS_404.PORTALS') + }) + + it('it should handle exception on loadData', () => { + apiServiceSpy.getPortalByPortalId.and.returnValue(of(null)) + + component.loadData() + + expect(component.exceptionKey).toBe('EXCEPTIONS.HTTP_STATUS_0.PORTALS') + }) + + it('should loadMenu', () => { + menuApiServiceSpy.getMenuStructureForPortalId.and.returnValue(of(mockMenuItems)) + + component.loadMenu(true) + + expect(msgServiceSpy.success).toHaveBeenCalledWith({ summaryKey: 'ACTIONS.SEARCH.RELOAD.OK' }) + }) + + xit('should call prepareParentNodes with a node array containing children', () => { + menuApiServiceSpy.getMenuStructureForPortalId.and.returnValue( + of([{ key: '1', data: { id: 'id1' }, children: [{ key: '1-1', data: { id: 'id1-1' } }] }]) + ) + + component.loadMenu(true) + + expect(component.parentItems).toContain({ label: '1', value: 'id1' }) + }) + + it('should handle error response on loadMenu', () => { + const errorResponse = new HttpErrorResponse({ + error: 'test error', + status: 404, + statusText: 'Not Found' + }) + menuApiServiceSpy.getMenuStructureForPortalId.and.returnValue(throwError(() => errorResponse)) + + component.loadMenu(true) + + expect(component.exceptionKey).toBe('EXCEPTIONS.HTTP_STATUS_0.PORTALS') + }) + + it('should handle exception on loadMenu', () => { + menuApiServiceSpy.getMenuStructureForPortalId.and.returnValue(of(null)) + + component.loadMenu(true) + + expect(component.exceptionKey).toBe('EXCEPTIONS.HTTP_STATUS_404.MENUS') + }) + + it('should set item onDeleteMenuItem', () => { + const event: MouseEvent = new MouseEvent('type') + const item = { + key: '1-1', + id: 'id1', + positionPath: '1-1', + regMfeAligned: true, + parentItemName: '1', + first: true, + last: false, + prevId: undefined + } + spyOn(event, 'stopPropagation') + + component.onDeleteMenuItem(event, item) + + expect(event.stopPropagation).toHaveBeenCalled() + expect(component.menuItem).toEqual(item) + expect(component.displayDeleteConfirmation).toBeTrue() + }) + + it('should delete menu item', () => { + menuApiServiceSpy.deleteMenuItemById({ portalId: 'id', menuItemId: 'menu id' }) + component.menuNodes = [{ key: '1', data: { id: 'id1' }, children: [{ key: '1-1', data: { id: 'id1-1' } }] }] + component.menuItem = { + key: '1-1', + id: 'id1', + positionPath: '1-1', + regMfeAligned: true, + parentItemName: '1', + first: true, + last: false, + prevId: undefined + } + + component.onMenuDelete() + + expect(component.menuNodes.length).toBe(1) + expect(msgServiceSpy.success).toHaveBeenCalledWith({ summaryKey: 'ACTIONS.DELETE.MENU_DELETE_OK' }) + }) + + it('should display error message on delete menu item', () => { + menuApiServiceSpy.deleteMenuItemById.and.returnValue(throwError(() => new Error())) + + component.onMenuDelete() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ summaryKey: 'ACTIONS.DELETE.MENU_DELETE_NOK' }) + }) + + xit('should get menu item onGoToDetails', () => { + const mockMenuItem: MenuItemDetailsDTO = { + key: 'key', + parentItemId: 'parent id', + name: 'some name', + position: 1 + } + menuApiServiceSpy.getMenuItemById.and.returnValue(of({ mockMenuItem })) + const event: MouseEvent = new MouseEvent('type') + const item = { + key: '1-1', + id: 'id1', + positionPath: '1-1', + regMfeAligned: true, + parentItemName: '1', + first: true, + last: false, + prevId: undefined, + disabled: true, + parentItemId: 'some parent id', + name: 'name', + position: 1, + portalExit: true, + url: 'url', + badge: 'badge', + scope: Scope.Portal, + description: 'description' + } + component.formGroup = form + + component.onGotoDetails(event, item) + + expect(component.displayMenuDetail).toBeTrue() + }) + + it('should toggle disable state and initiate save', () => { + menuApiServiceSpy.patchMenuItem.and.returnValue(of({})) + const item = { + key: '1-1', + id: 'id1', + positionPath: '1-1', + regMfeAligned: true, + parentItemName: '1', + first: true, + last: false, + prevId: undefined, + disabled: true, + parentItemId: 'some parent id', + name: 'name', + position: 1, + portalExit: true, + url: 'url', + badge: 'badge', + scope: Scope.Portal, + description: 'description' + } + const mockEvent = {} + component.formGroup = form + spyOn(component, 'onMenuSave') + + component.onToggleDisable(mockEvent, item) + + expect(component.changeMode).toBe('EDIT') + expect(component.onMenuSave).toHaveBeenCalled() + }) + + it('should getState onHierarchyViewChange', () => { + const mockExpansionState: Map = new Map() + stateServiceSpy.getState.and.returnValue({ + treeExpansionState: mockExpansionState, + pageSize: 0, + showDetails: false, + rootFilter: true, + treeMode: true + }) + const event = { node: { key: 'node', expanded: true } } + spyOn(mockExpansionState, 'set').and.callThrough() + + component.onHierarchyViewChange(event) + + expect(stateServiceSpy.getState().treeExpansionState.set).toHaveBeenCalledWith(event.node.key, event.node.expanded) + + component.onHierarchyViewChange + }) + + it('should update properties onCloseDetailDialog', () => { + component.onCloseDetailDialog() + + expect(component.menuItem).toBeUndefined() + expect(component.displayMenuDetail).toBeFalse() + }) + + it('should update tabIndex onTabPanelChange', () => { + let mockEvent = { index: 3 } + + component.onTabPanelChange(mockEvent) + + expect(component.tabIndex).toBe(mockEvent.index) + }) + + it('should set overlayVisible to true onFocusFieldUrl', () => { + let field = { overlayVisible: false } + + component.onFocusFieldUrl(field) + + expect(field.overlayVisible).toBeTrue() + }) + + it('should remove language from languagesDisplayed, add it to languagesAvailable', () => { + component.languagesDisplayed = [{ label: 'English', value: 'en', data: 'Data' }] + component.languagesAvailable = [{ label: 'German', value: 'de', data: '' }] + + component.onRemoveLanguage('en') + + expect(component.languagesDisplayed.length).toBe(0) + expect(component.languagesAvailable).toEqual(jasmine.arrayContaining([{ label: 'English', value: 'en', data: '' }])) + }) + + it('should add language to languagesDisplayed from languagesAvailable', () => { + component.languagesDisplayed = [] + component.languagesAvailable = [{ label: 'English', value: 'en', data: '' }] + + component.onAddLanguage2({ option: { value: 'en' } }) + + expect(component.languagesDisplayed).toEqual(jasmine.arrayContaining([{ label: 'English', value: 'en', data: '' }])) + expect(component.languagesAvailable.length).toBe(0) + }) + + it('should add language to languagesDisplayed from languagesAvailable using string value', () => { + component.languagesDisplayed = [] + component.languagesAvailable = [{ label: 'English', value: 'en', data: '' }] + + component.onAddLanguage('en') + + expect(component.languagesDisplayed).toEqual(jasmine.arrayContaining([{ label: 'English', value: 'en', data: '' }])) + expect(component.languagesAvailable.length).toBe(0) + }) + + it('should return label of language if in languagesDisplayed', () => { + component.languagesDisplayed = [{ label: 'English', value: 'en', data: '' }] + + const label = component.getLanguageLabel('en') + + expect(label).toBe('English') + }) + + it('if not in languagesDisplayed: return undefined on getLanguageLabel', () => { + component.languagesDisplayed = [] + + const label = component.getLanguageLabel('en') + + expect(label).toBeUndefined() + }) + + it('should return true if language not in languagesDisplayed', () => { + component.languagesDisplayed = [{ label: 'English', value: 'en', data: '' }] + + expect(component.displayLanguageField('de')).toBeTrue() + expect(component.displayLanguageField('en')).toBeFalse() + }) + + it('should return true if an object is empty', () => { + expect(component.isObjectEmpty({})).toBeFalse() + expect(component.isObjectEmpty({ key: 'value' })).toBeTrue() + }) + + it('should handle onCreateMenu correctly', () => { + const mockEvent = jasmine.createSpyObj('MouseEvent', ['stopPropagation']) + const mockParent = { + key: '1-1', + id: 'id1', + positionPath: '1-1', + regMfeAligned: true, + parentItemName: '1', + first: true, + last: false, + prevId: undefined, + name: 'name' + } + component.onCreateMenu(mockEvent, mockParent) + + expect(mockEvent.stopPropagation).toHaveBeenCalled() + expect(component.changeMode).toEqual('CREATE') + expect(component.menuItem).toEqual(mockParent) + expect(component.formGroup.value).toEqual({ + parentItemId: mockParent.id, + position: 0, + portalExit: false, + disabled: false, + key: null, + name: null, + url: null, + badge: null, + scope: null, + description: null + }) + expect(component.displayMenuDetail).toBeTrue() + }) + + it('should save a menu: create', () => { + menuApiServiceSpy.addMenuItemForPortal.and.returnValue(of({})) + component.formGroup = form + component.menuItem = mockItem + component.changeMode = 'CREATE' + component.languagesDisplayed = [{ label: 'English', value: 'en', data: 'data' }] + + component.onMenuSave() + + expect(msgServiceSpy.success).toHaveBeenCalledWith({ summaryKey: 'ACTIONS.CREATE.MESSAGE.MENU_CREATE_OK' }) + }) + + it('should display error message on save menu: create', () => { + menuApiServiceSpy.addMenuItemForPortal.and.returnValue(throwError(() => new Error())) + component.formGroup = form + component.menuItem = mockItem + component.changeMode = 'CREATE' + + component.onMenuSave() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ summaryKey: 'ACTIONS.CREATE.MESSAGE.MENU_CREATE_NOK' }) + }) + + it('should save a menu: edit', () => { + menuApiServiceSpy.patchMenuItem.and.returnValue(of(mockItem)) + component.formGroup = form + component.menuItem = { + key: '1-1', + id: 'id1', + positionPath: '1-1', + regMfeAligned: true, + parentItemName: '1', + first: true, + last: false, + prevId: undefined, + disabled: true, + parentItemId: 'some parent id', + name: 'name', + position: 1, + portalExit: true, + url: 'url', + badge: 'badge', + scope: Scope.Portal, + description: 'description' + } + component.menuItems = mockMenuItems + component.menuNodes = [ + { key: 'key', children: [{ key: 'key', data: { i18n: { en: 'en' } } }], data: { i18n: { en: 'en' } } } + ] + component.changeMode = 'EDIT' + component.displayMenuDetail = true + + component.onMenuSave() + + expect(msgServiceSpy.success).toHaveBeenCalledWith({ summaryKey: 'ACTIONS.EDIT.MESSAGE.MENU_CHANGE_OK' }) + }) + + it('should display error message on save menu: edit', () => { + menuApiServiceSpy.patchMenuItem.and.returnValue(throwError(() => new Error())) + component.formGroup = form + component.menuItem = { + key: '1-1', + id: 'id1', + positionPath: '1-1', + regMfeAligned: true, + parentItemName: '1', + first: true, + last: false, + prevId: undefined, + disabled: true, + parentItemId: 'some parent id', + name: 'name', + position: 1, + portalExit: true, + url: 'url', + badge: 'badge', + scope: Scope.Portal, + description: 'description' + } + component.changeMode = 'EDIT' + + component.onMenuSave() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ summaryKey: 'ACTIONS.EDIT.MESSAGE.MENU_CHANGE_NOK' }) + }) + + it('should export a menu', () => { + menuApiServiceSpy.getMenuStructureForPortalId.and.returnValue(of(mockMenuItems)) + component.portalId = 'id' + component.portal = portal + spyOn(FileSaver, 'saveAs') + + component.onExportMenu() + + expect(FileSaver.saveAs).toHaveBeenCalledWith( + new Blob([], { type: 'text/json' }), + 'workspace_' + component.portal?.portalName + '_menu.json' + ) + }) + + it('should enable menu import onImportMenu', () => { + component.onImportMenu() + + expect(component.displayMenuImport).toBeTrue() + expect(component.menuImportError).toBeFalse() + }) + + it('should hide menu import onImportMenuHide', () => { + component.onImportMenuHide() + + expect(component.displayMenuImport).toBeFalse() + }) + + it('should clear menu import onImportMenuClear', () => { + component.onImportMenuClear() + + expect(component.menuImportError).toBeFalse() + }) + + it('should import menu from a valid file onImportMenuSelect: success', () => { + const validJson = JSON.stringify(mockMenuItems) + const mockFile = new File([validJson], 'test.json', { type: 'application/json' }) + spyOn(mockFile, 'text').and.returnValue(Promise.resolve(validJson)) + const fileList = { 0: mockFile, length: 1, item: () => mockFile } + + component.onImportMenuSelect({ files: fileList }) + + expect(component.menuImportError).toBeFalse() + }) + + it('should import menu from a valid file onImportMenuSelect: invalid data', (done) => { + const validJson = JSON.stringify({ invalid: 'data' }) + const mockFile = new File([validJson], 'test.json', { type: 'application/json' }) + spyOn(mockFile, 'text').and.returnValue(Promise.resolve(validJson)) + const fileList = { 0: mockFile, length: 1, item: () => mockFile } + spyOn(console, 'error') + + component.onImportMenuSelect({ files: fileList }) + + setTimeout(() => { + expect(component.menuImportError).toBeTrue() + expect(console.error).toHaveBeenCalledWith('Menu Import Error: Data not valid', jasmine.anything()) + done() + }, 0) + }) + + it('should import menu from a valid file onImportMenuSelect: parse error', (done) => { + const invalidJson = 'not json' + const mockFile = new File([invalidJson], 'test.json', { type: 'application/json' }) + spyOn(mockFile, 'text').and.returnValue(Promise.resolve(invalidJson)) + const fileList = { 0: mockFile, length: 1, item: () => mockFile } + spyOn(console, 'error') + + component.onImportMenuSelect({ files: fileList }) + + setTimeout(() => { + expect(component.menuImportError).toBeTrue() + /* expect(console.error).toHaveBeenCalledWith( + 'Menu Import Parse Error', + new SyntaxError('Unexpected token \'o\', "not json" is not valid JSON') + ) */ + done() + }, 0) + }) + + it('should handle menu import', () => { + component.portalId = 'id' + spyOn(component, 'ngOnInit') + menuApiServiceSpy.uploadMenuStructure.and.returnValue(of({})) + + component.onMenuImport() + + expect(msgServiceSpy.success).toHaveBeenCalledWith({ summaryKey: 'TREE.STRUCTURE_UPLOAD_SUCCESS' }) + expect(component.ngOnInit).toHaveBeenCalled() + }) + + it('should handle menu import error', () => { + component.portalId = 'id' + menuApiServiceSpy.uploadMenuStructure.and.returnValue(throwError(() => new Error())) + + component.onMenuImport() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ summaryKey: 'TREE.STRUCTURE_UPLOAD_ERROR' }) + }) + + it('should set displayTreeModal to true onDisplayTreeModal', () => { + component.onDisplayTreeModal() + + expect(component.displayTreeModal).toBeTrue() + }) + + it('should set displayTreeModal to false onHideTreeModal', () => { + component.onHideTreeModal() + + expect(component.displayTreeModal).toBeFalse() + }) + + it('should handle successful menu item update', () => { + menuApiServiceSpy.bulkPatchMenuItems.and.returnValue(of({})) + spyOn(component, 'onReloadMenu') + + component.updateMenuItems(mockMenuItems) + + expect(msgServiceSpy.success).toHaveBeenCalledWith({ summaryKey: 'TREE.EDIT_SUCCESS' }) + expect(component.onReloadMenu).toHaveBeenCalled() + }) + + it('should handle menu item update error', () => { + menuApiServiceSpy.bulkPatchMenuItems.and.returnValue(throwError(() => new Error())) + + component.updateMenuItems(mockMenuItems) + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ summaryKey: 'TREE.EDIT_ERROR' }) + }) + + it('should call onStartResizeTree without errors', () => { + const mockEvent = new MouseEvent('click') + + expect(() => component.onStartResizeTree(mockEvent)).not.toThrow() + }) + + it('should set treeHeight on onEndResizeTree call', () => { + const mockClientY = 300 + const mockEvent = { clientY: mockClientY } as MouseEvent + + component.onEndResizeTree(mockEvent) + + expect(component['treeHeight']).toEqual(mockClientY) + }) +}) + +/* Test modification of built-in Angular class registerOnChange at top of the file */ +@Component({ + template: `` +}) +class TestComponent { + value = '' +} + +describe('DefaultValueAccessor prototype modification', () => { + let component: TestComponent + let fixture: ComponentFixture + let inputElement: HTMLInputElement + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [TestComponent], + imports: [FormsModule] + }).compileComponents() + + fixture = TestBed.createComponent(TestComponent) + component = fixture.componentInstance + fixture.detectChanges() + + inputElement = fixture.nativeElement.querySelector('input') + }) + + it('should trim the value on model change', () => { + inputElement.value = ' test ' + inputElement.dispatchEvent(new Event('input')) + fixture.detectChanges() + + expect(component.value).toBe('test') + }) +}) diff --git a/src/app/workspace/workspace-detail/menu/menu.component.ts b/src/app/workspace/workspace-detail/menu/menu.component.ts new file mode 100644 index 00000000..87e1ebc9 --- /dev/null +++ b/src/app/workspace/workspace-detail/menu/menu.component.ts @@ -0,0 +1,866 @@ +import { Component, ElementRef, Inject, OnInit, ViewChild, Renderer2, OnDestroy } from '@angular/core' +import { HttpErrorResponse, HttpHeaders } from '@angular/common/http' +import { Location } from '@angular/common' +import { ActivatedRoute } from '@angular/router' +import { DefaultValueAccessor, FormControl, FormGroup, Validators } from '@angular/forms' + +import { TreeTable } from 'primeng/treetable' +import { TabView } from 'primeng/tabview' +import { Overlay } from 'primeng/overlay' +import { SelectItem, TreeNode } from 'primeng/api' + +import { TranslateService } from '@ngx-translate/core' +import { Observable, Subject, catchError, of, tap, switchMap } from 'rxjs' +import FileSaver from 'file-saver' + +import { + Action, + AUTH_SERVICE, + IAuthService, + ConfigurationService, + PortalMessageService +} from '@onecx/portal-integration-angular' +import { + DeleteMenuItemByIdRequestParams, + MenuItemAPIService, + MenuItem, + // MenuItemsInternalAPIService, + Workspace, + WorkspaceAPIService, + CreateMenuItemRequest, + GetMenuItemsResponse +} from '../../../shared/generated' +import { limitText, dropDownSortItemsByLabel } from '../../../shared/utils' +import { MenuStringConst } from '../../..//model/menu-string-const' +import { MenuStateService } from '../../../services/menu-state.service' +import { IconService } from './iconservice' +// import { filterObjectTree } from '../../../shared/utils' + +/* type MenuItem = MenuItem & { + positionPath: string + regMfeAligned: boolean + parentItemName: string + first: boolean + last: boolean + prevId: string | undefined +} */ +type LanguageItem = SelectItem & { data: string } +type I18N = { [key: string]: string } + +// trim the value (string!) of a form control before passes to the control +const original = DefaultValueAccessor.prototype.registerOnChange +DefaultValueAccessor.prototype.registerOnChange = function (fn) { + return original.call(this, (value) => { + const trimmed = typeof value === 'string' || value instanceof String ? value.trim() : value + return fn(trimmed) + }) +} + +@Component({ + selector: 'app-menu', + templateUrl: './menu.component.html', + styleUrls: ['./menu.component.scss'] +}) +export class MenuComponent implements OnInit, OnDestroy { + @ViewChild('menuTree') menuTree: TreeTable | undefined + @ViewChild('menuTreeFilter') menuTreeFilter: ElementRef = {} as ElementRef + @ViewChild('panelDetail') panelDetail: TabView | undefined + @ViewChild('treeOverlay') treeOverlay: Overlay | undefined + + private readonly destroy$ = new Subject() + private readonly debug = false // to be removed after finalization + // dialog control + public actions: Action[] = [] + public loading = true + public exceptionKey = '' + public dateFormat = 'short' + public tabIndex = 0 + private panelHeight = 0 + private treeHeight = 0 + // portal + public portal?: Workspace + private portal$: Observable = new Observable() + public workspaceName = this.route.snapshot.params['name'] + private mfeRUrls: Array = [] + public mfeRUrlOptions: SelectItem[] = [] + // menu + private menu$: Observable> = new Observable>() + public menuNodes: TreeNode[] = [] + private menuItem$: Observable = new Observable() + public menuItems: MenuItem[] | undefined + public menuItem: MenuItem | undefined + private menuItemStructureDTOArray: Array | undefined + public menuImportError = false + public httpHeaders!: HttpHeaders + // detail + public changeMode: 'EDIT' | 'CREATE' = 'EDIT' + public displayMenuDetail = false + public displayMenuImport = false + public displayDeleteConfirmation = false + public displayTreeModal = false + public formGroup: FormGroup + public iconItems: SelectItem[] = [{ label: '', value: null }] // default value is empty + public parentItems: SelectItem[] = [{ label: '', value: null }] // default value is empty + public scopeItems: SelectItem[] + // public booleanItems: SelectItem[] + private urlPattern = + '(https://www.|http://www.|https://|http://)?[a-zA-Z]{2,}(.[a-zA-Z]{2,})(.[a-zA-Z]{2,})?/[a-zA-Z0-9]{2,}|((https://www.|http://www.|https://|http://)?[a-zA-Z]{2,}(.[a-zA-Z]{2,})(.[a-zA-Z]{2,})?)|(https://www.|http://www.|https://|http://)?[a-zA-Z0-9]{2,}.[a-zA-Z0-9]{2,}.[a-zA-Z0-9]{2,}(.[a-zA-Z0-9]{2,})?' + private posPattern = '[0-9]{1,9}' + // language settings and preview + public languagesAvailable: LanguageItem[] = [] + public languagesDisplayed: LanguageItem[] = [] + public languagesUsed = new Array() + public languagesPreview: SelectItem[] = [] + public languageNames: I18N = { + de: 'Deutsch', + en: 'English', + es: 'Español', + fr: 'Français', + it: 'Italiano', + pl: 'Polski', + sk: 'Slovak' + } + + // utils declarations + limitText = limitText + + constructor( + @Inject(AUTH_SERVICE) readonly auth: IAuthService, + private renderer: Renderer2, + private route: ActivatedRoute, + private location: Location, + private menuApi: MenuItemAPIService, + private workspaceApi: WorkspaceAPIService, + private stateService: MenuStateService, + private config: ConfigurationService, + private icon: IconService, + private translate: TranslateService, + private msgService: PortalMessageService + ) { + this.dateFormat = this.config.lang === 'de' ? 'dd.MM.yyyy HH:mm' : 'short' + this.iconItems.push(...this.icon.icons.map((i) => ({ label: i, value: i }))) + this.iconItems.sort(dropDownSortItemsByLabel) + this.scopeItems = [ + { label: '', value: null }, + { label: MenuStringConst.SCOPE_APP, value: MenuStringConst.SCOPE_APP }, + { label: MenuStringConst.SCOPE_PAGE, value: MenuStringConst.SCOPE_PAGE }, + { label: MenuStringConst.SCOPE_PORTAL, value: MenuStringConst.SCOPE_PORTAL } + ] + this.formGroup = new FormGroup({ + parentItemId: new FormControl(null), + key: new FormControl(null, [Validators.required, Validators.minLength(2), Validators.maxLength(100)]), + name: new FormControl(null, [Validators.required, Validators.minLength(2), Validators.maxLength(100)]), + position: new FormControl(null, [ + Validators.required, + Validators.maxLength(9), + Validators.pattern(this.posPattern) + ]), + disabled: new FormControl(false), + portalExit: new FormControl(false), + url: new FormControl(null, [ + Validators.minLength(2), + Validators.maxLength(255) + /*, Validators.pattern(this.urlPattern)*/ // Trian wish to deactivate this + ]), + badge: new FormControl(undefined), + scope: new FormControl(null), + description: new FormControl(null, [Validators.maxLength(255)]) + }) + const state = this.stateService.getState() + this.menuItems = state.portalMenuItems + } + + public ngOnInit(): void { + this.httpHeaders = new HttpHeaders() + this.httpHeaders.set('Content-Type', 'application/json') + this.translate + .get([ + 'ACTIONS.NAVIGATION.BACK', + 'ACTIONS.NAVIGATION.BACK.TOOLTIP', + 'ACTIONS.EXPORT.LABEL', + 'ACTIONS.EXPORT.MENU', + 'ACTIONS.IMPORT.LABEL', + 'ACTIONS.IMPORT.MENU' + ]) + .subscribe((data) => { + this.prepareActionButtons(data) + }) + this.loadData() + } + + public ngOnDestroy(): void { + this.stateService.updateState({ + portalMenuItems: this.menuItems + }) + } + + public prepareActionButtons(data: any) { + this.actions = [] // provoke change event + this.actions.push( + { + label: data['ACTIONS.NAVIGATION.BACK'], + title: data['ACTIONS.NAVIGATION.BACK.TOOLTIP'], + actionCallback: () => this.onClose(), + icon: 'pi pi-arrow-left', + show: 'always' + }, + { + label: data['ACTIONS.EXPORT.LABEL'], + title: data['ACTIONS.EXPORT.MENU'], + actionCallback: () => this.onExportMenu(), + icon: 'pi pi-download', + show: 'always', + permission: 'MENU#EXPORT' + }, + { + label: data['ACTIONS.IMPORT.LABEL'], + title: data['ACTIONS.IMPORT.MENU'], + actionCallback: () => this.onImportMenu(), + icon: 'pi pi-upload', + show: 'always', + permission: 'MENU#IMPORT' + } + ) + } + + /** + * UI ACTIONS + */ + public onReload(): void { + this.loadMenu(true) + } + public onClearFilterMenuTable(): void { + if (this.menuTreeFilter) this.menuTreeFilter.nativeElement.value = '' + if (this.menuTree) this.menuTree.filterGlobal('', 'contains') + } + public onExpandAll(): void { + this.menuNodes.forEach((node) => { + this.expandRecursive(node, true) + }) + this.menuNodes = [...this.menuNodes] + } + public onCollapseAll(): void { + this.menuNodes.forEach((node) => { + this.expandRecursive(node, false) + }) + this.menuNodes = [...this.menuNodes] + } + private expandRecursive(node: TreeNode, isExpand: boolean) { + node.expanded = isExpand + this.stateService.getState().treeExpansionState.set(node.key || '', node.expanded) + if (node.children) { + node.children.forEach((childNode) => { + this.expandRecursive(childNode, isExpand) + }) + } + } + private restoreRecursive(node: TreeNode) { + node.expanded = this.stateService.getState().treeExpansionState.get(node.key || '') + if (node.children) { + node.children.forEach((childNode) => { + this.restoreRecursive(childNode) + }) + } + } + private restoreTree(): void { + this.menuNodes.forEach((node) => { + this.restoreRecursive(node) + }) + this.menuNodes = [...this.menuNodes] + } + + public onHierarchyViewChange(event: { node: { key: string; expanded: boolean } }): void { + this.stateService.getState().treeExpansionState.set(event.node.key, event.node.expanded) + } + + public onGotoMenuMgmt(): void { + this.log('gotoMenu for portal ' + this.portal?.name) + } + public onCloseDetailDialog(): void { + this.resetDetailDialog() + this.menuItem = undefined + this.displayMenuDetail = false + } + private resetDetailDialog(): void { + this.tabIndex = 0 + this.languagesDisplayed = [] + } + private onClose(): void { + this.location.back() + } + public onTabPanelChange(e: any): void { + this.tabIndex = e.index + } + public onFocusFieldUrl(field: any): void { + field.overlayVisible = true + } + + public onShowDetailDialog(): void { + this.resetDetailDialog() + // same height on all TABs + if (this.panelHeight === 0) this.panelHeight = this.panelDetail?.el.nativeElement.offsetHeight + this.renderer.setStyle(this.panelDetail?.el.nativeElement, 'display', 'block') + this.renderer.setStyle(this.panelDetail?.el.nativeElement, 'height', this.panelHeight + 'px') + // + // prepare i18n panel: load defaults + this.languagesDisplayed = [ + { label: this.languageNames['de'], value: 'de', data: '' }, + { label: this.languageNames['en'], value: 'en', data: '' } + ] + this.languagesAvailable = [ + { label: this.languageNames['es'], value: 'es', data: '' }, + { label: this.languageNames['fr'], value: 'fr', data: '' }, + { label: this.languageNames['it'], value: 'it', data: '' }, + { label: this.languageNames['pl'], value: 'pl', data: '' }, + { label: this.languageNames['sk'], value: 'sk', data: '' } + ] + if (this.menuItem?.i18n) { + for (const k in this.menuItem?.i18n) { + if (this.languagesDisplayed.filter((l) => l.value === k).length === 0) this.onAddLanguage(k) + } + for (const l of this.languagesDisplayed) { + if (this.menuItem?.i18n && this.menuItem?.i18n[l.value]) l.data = this.menuItem?.i18n[l.value] + } + this.languagesDisplayed.sort(dropDownSortItemsByLabel) + } + } + public onRemoveLanguage(val: string) { + this.languagesAvailable.push(this.languagesDisplayed.filter((l) => l.value === val)[0]) + this.languagesAvailable.filter((l) => l.value === val)[0].data = '' + this.languagesAvailable = this.languagesAvailable.filter((l) => l).sort(dropDownSortItemsByLabel) + this.languagesDisplayed = this.languagesDisplayed.filter((l) => l.value !== val) + } + public onAddLanguage2(ev: any): void { + this.languagesDisplayed.push(this.languagesAvailable.filter((l) => l.value === ev.option.value)[0]) + this.languagesAvailable = this.languagesAvailable.filter((l) => l.value !== ev.option.value) + } + public onAddLanguage(val: string): void { + this.languagesDisplayed.push(this.languagesAvailable.filter((l) => l.value === val)[0]) + this.languagesAvailable = this.languagesAvailable.filter((l) => l.value !== val) + } + public getLanguageLabel(val: any): string | undefined { + if (this.languagesDisplayed.length > 0) { + const l = this.languagesDisplayed.filter((l) => l.value === val) + return l.length === 1 ? l[0].label : undefined + } + return undefined + } + public displayLanguageField(lang: string) { + return !this.languagesDisplayed.some((l) => l.value === lang) + } + public isObjectEmpty(obj: object) { + return Object.keys(obj).length > 0 + } + + /** + * DATA + */ + public loadData(): void { + this.exceptionKey = '' + this.loading = true + + this.menuItem$ = this.workspaceApi.getWorkspaceByName({ name: this.workspaceName }).pipe( + switchMap((portal) => { + console.log('PORTAL', portal) + this.portal = portal as Workspace + return this.menuApi.getMenuItemsForWorkspaceById({ id: portal?.resource?.id! }).pipe( + catchError((error) => { + console.error('Error fetching data:', error) + return of(null) + }) + ) + }), + catchError(() => { + return of(null) + }), + tap((menu) => { + this.menu$ = of(menu) as Observable + }) + ) + this.menuItem$.subscribe({ + complete: () => { + this.loadMenu(false) + this.loading = false + } + }) + // // this.portal.microfrontendRegistrations = new Set(Array.from(portal.microfrontendRegistrations ?? [])) + // // this.mfeRUrls = Array.from(this.portal.microfrontendRegistrations || []).map((mfe) => mfe.baseUrl || '') + // // this.mfeRUrlOptions = Array.from(this.portal.microfrontendRegistrations ?? []) + // // .map((mfe) => ({ + // // label: mfe.baseUrl, + // // value: mfe.baseUrl || '' + // // })) + // // .sort(dropDownSortItemsByLabel) + // this.loadMenu(false) + // } else { + // this.exceptionKey = 'EXCEPTIONS.HTTP_STATUS_0.PORTALS' + // console.error('getAllPortals() => unknown response:', portal) + // } + // this.loading = false + // }) + } + + public onReloadMenu(): void { + this.loadMenu(true) + } + public loadMenu(restore: boolean): void { + this.menu$.subscribe((menu) => { + console.log('MENU', menu) + this.loading = true + if (menu instanceof HttpErrorResponse) { + this.exceptionKey = 'EXCEPTIONS.HTTP_STATUS_' + menu.status + '.MENUS' + console.error('getMenuStructureForPortalId():', menu) + } else if (menu instanceof Array) { + this.menuNodes = this.mapToTreeNodes(menu, undefined) + this.log('getMenuStructureForPortalId:', menu) + this.menuItems = menu + this.menuItem = undefined + this.preparePreviewLanguages() + this.prepareParentNodes(this.menuNodes) + this.parentItems.sort(dropDownSortItemsByLabel) + if (restore) { + this.restoreTree() + this.msgService.success({ summaryKey: 'ACTIONS.SEARCH.RELOAD.OK' }) + } + } else { + this.exceptionKey = 'EXCEPTIONS.HTTP_STATUS_0.MENUS' + console.error('getMenuStructureForPortalId() => unknown response:', menu) + } + this.loading = false + }) + } + private prepareParentNodes(nodes: TreeNode[]): void { + nodes.forEach((m) => { + this.parentItems.push({ label: m.key, value: m.data.id } as SelectItem) + if (m.children && m.children.length > 0) this.prepareParentNodes(m.children) + }) + } + private preparePreviewLanguages(): void { + this.languagesUsed = [] + this.prepareUsedLanguage(this.menuNodes) + this.log('languagesUsed:', this.languagesUsed) + this.languagesPreview = [] + this.languagesUsed.forEach((l) => this.languagesPreview.push({ label: this.languageNames[l], value: l })) + this.languagesPreview.sort(dropDownSortItemsByLabel) + this.log('languagesPreview:', this.languagesPreview) + } + + /** + * DELETE + */ + public onDeleteMenuItem($event: MouseEvent, item: MenuItem): void { + $event.stopPropagation() + this.menuItem = item + this.displayDeleteConfirmation = true + } + public onMenuDelete(): void { + this.displayDeleteConfirmation = false + this.menuApi + .deleteMenuItemById({ + id: this.workspaceName, + menuItemId: this.menuItem?.id + } as DeleteMenuItemByIdRequestParams) + .subscribe({ + next: () => { + this.msgService.success({ summaryKey: 'ACTIONS.DELETE.MENU_DELETE_OK' }) + this.removeNodeFromTree(this.menuNodes, this.menuItem?.key) + this.menuNodes = [...this.menuNodes] // refresh UI + this.menuItem = undefined + this.preparePreviewLanguages() + }, + error: (err: { error: any }) => { + this.msgService.error({ summaryKey: 'ACTIONS.DELETE.MENU_DELETE_NOK' }) + console.error(err.error) + } + }) + } + /** remove node and sub nodes (recursively) in the tree + */ + private removeNodeFromTree(nodes: TreeNode[], key?: string): boolean { + if (!key) return false + let stop = false + nodes.forEach((n, i) => { + if (!stop) { + if (n.key === key) { + nodes.splice(i, 1) + stop = true + } + } + if (!stop && n.children && n.children?.length > 0) stop = this.removeNodeFromTree(n.children, key) + }) + return stop + } + + /** + * VIEW & EDIT + */ + public onGotoDetails($event: MouseEvent, item: MenuItem): void { + $event.stopPropagation() + if (item.id === undefined) return + this.changeMode = 'EDIT' + // get data + this.menuItem$ = this.menuApi + .getMenuItemById({ id: this.workspaceName as string, menuItemId: item.id }) + .pipe(catchError((error) => of(error))) + this.menuItem$.subscribe({ + next: (m) => { + this.menuItem = m as MenuItem + this.fillForm(this.menuItem) + this.displayMenuDetail = true + }, + error: (err) => { + this.msgService.error({ summaryKey: 'DETAIL.ERROR_FIND_MENU' }) + console.error(err.error) + } + }) + } + + // direct change node on click in tree + public onToggleDisable(ev: any, node: MenuItem): void { + this.changeMode = 'EDIT' + this.menuItem = node + this.menuItem.disabled = !node.disabled + this.fillForm(this.menuItem) + this.onMenuSave() + } + + private fillForm(m: MenuItem) { + this.formGroup.reset() + this.formGroup.setValue({ + parentItemId: m.parentItemId, + url: m.url, + key: m.key, + name: m.name, + position: m.position, + description: m.description, + scope: m.scope, + badge: m.badge, + disabled: m.disabled, + portalExit: m.workspaceExit + }) + } + + /** + * CREATE + */ + public onCreateMenu($event: MouseEvent, parent: MenuItem): void { + $event.stopPropagation() + this.changeMode = 'CREATE' + this.menuItem = parent + this.formGroup.reset() + this.formGroup.patchValue({ + parentItemId: parent.id, + position: 0, + portalExit: false, + disabled: false + }) + this.displayMenuDetail = true + } + + public onMenuSave(): void { + if (this.formGroup.valid) { + if (this.menuItem) { + this.menuItem.parentItemId = this.formGroup.controls['parentItemId'].value + this.menuItem.key = this.formGroup.controls['key'].value + this.menuItem.url = this.formGroup.controls['url'].value + this.menuItem.name = this.formGroup.controls['name'].value + this.menuItem.badge = + this.formGroup.controls['badge'].value === null ? '' : this.formGroup.controls['badge'].value + this.menuItem.scope = this.formGroup.controls['scope'].value + this.menuItem.position = this.formGroup.controls['position'].value + this.menuItem.disabled = this.formGroup.controls['disabled'].value + this.menuItem.workspaceExit = this.formGroup.controls['portalExit'].value + this.menuItem.description = this.formGroup.controls['description'].value + const i18n: I18N = {} + for (const l of this.languagesDisplayed) { + if (l.data !== '') i18n[l.value] = l.data + } + this.menuItem.i18n = i18n + if (this.changeMode === 'CREATE') { + this.menuItem.id = undefined + } + } + if (this.changeMode === 'CREATE') { + this.menuApi + .createMenuItemForWorkspace({ + id: this.workspaceName, + createMenuItemRequest: this.menuItem as CreateMenuItemRequest + }) + .subscribe({ + next: () => { + this.msgService.success({ summaryKey: 'ACTIONS.CREATE.MESSAGE.MENU_CREATE_OK' }) + this.onCloseDetailDialog() + this.onReloadMenu() + }, + error: (err: { error: any }) => { + this.msgService.error({ summaryKey: 'ACTIONS.CREATE.MESSAGE.MENU_CREATE_NOK' }) + console.error(err.error) + } + }) + } else if (this.changeMode === 'EDIT' && this.menuItem && this.menuItem.id) { + this.menuApi + .patchMenuItems({ + id: this.workspaceName, + patchMenuItemsRequest: [{ resource: this.menuItem }] + }) + .subscribe({ + next: (data) => { + this.msgService.success({ summaryKey: 'ACTIONS.EDIT.MESSAGE.MENU_CHANGE_OK' }) + // update tree node with received data without reload all + if (this.displayMenuDetail) { + this.onCloseDetailDialog() + if (data && data[0].resource?.key) { + const node = this.getNodeByKey(data[0].resource?.key, this.menuNodes) + if (node) { + node.data = data + node.label = data[0].resource?.name + } + if (this.menuItems) { + const item = this.getItemByKey(data[0].resource?.key, this.menuItems) + if (item) { + item.i18n = data[0].resource?.i18n + item.name = data[0].resource?.name + } + } + } + } + this.preparePreviewLanguages() + }, + error: (err: { error: any }) => { + this.msgService.error({ summaryKey: 'ACTIONS.EDIT.MESSAGE.MENU_CHANGE_NOK' }) + console.error(err.error) + } + }) + } + } else console.error('non valid form', this.formGroup) + } + + /**************************************************************************** + * TREE - prepare recursively the tree nodes from menu structure + */ + private mapToTreeNodes(items?: MenuItem[], parent?: MenuItem): TreeNode[] { + if (!items || items.length === 0) { + return [] + } + const nodes: TreeNode[] = [] + items.sort((a, b) => (a.position || 0) - (b.position || 0)) + let pos = 1 + let prevId: string | undefined + for (const item of items) { + const extendedItem = { + ...item, + first: pos === 1, + last: pos === items.length, + prevId: prevId, + // parent info ? + // concat the positions + positionPath: parent ? parent.position + '.' + item.position : item.position, + // true if path is a mfe base path + regMfeAligned: item.url && !item.url.startsWith('http') && !item.workspaceExit ? this.urlMatch(item.url) : false + } as MenuItem + const newNode: TreeNode = this.createTreeNode(extendedItem) + if (item.children && item.children.length > 0 && item.children != null && item.children.toLocaleString() != '') { + newNode.leaf = false + newNode.data.badge = item.badge ? item.badge : 'folder ' + newNode.children = this.mapToTreeNodes(item.children, extendedItem) + } + nodes.push(newNode) + pos++ + prevId = item.id + } + return nodes + } + private prepareUsedLanguage(nodes: TreeNode[]) { + for (const node of nodes) { + if (node.data.i18n && Object.keys(node.data.i18n).length > 0) { + for (const k in node.data.i18n) { + if (!this.languagesUsed.includes(k)) this.languagesUsed.push(k) + } + } + if (node.children && node.children?.length > 0) this.prepareUsedLanguage(node.children) + } + } + + private createTreeNode(item: MenuItem): TreeNode { + return { + data: item, + label: item.name, + expanded: false, + key: item.key, + leaf: true, + children: [] + } + } + private getNodeByKey(key: string, nodes: TreeNode[]): TreeNode | undefined { + for (const node of nodes) { + if (node.key === key) { + return node + } + if (node.children) { + const match = this.getNodeByKey(key, node.children) + if (match) { + return match + } + } + } + return undefined + } + private getItemByKey(key: string, items: MenuItem[]): MenuItem | undefined { + for (const item of items) { + if (item.key === key) { + return item + } + if (item.children) { + const match = this.getItemByKey(key, item.children) + if (match) { + return match + } + } + } + return undefined + } + + // is a menu item (url) supported by reg. MFE ? + private urlMatch(url: string): boolean { + const url2 = url.match(/^.*\/$/) ? url.substring(0, url.length - 1) : url + // direct match + let match = this.mfeRUrls.includes(url) || this.mfeRUrls.includes(url + '/') || this.mfeRUrls.includes(url2) + if (!match) { + for (const i in this.mfeRUrls) { + match = this.mfeRUrls[i].startsWith(url2) || url2.startsWith(this.mfeRUrls[i]) + if (match) break + } + } + return match + } + + /**************************************************************************** + * SERVER responses & internal + */ + private log(text: string, obj?: object): void { + if (this.debug) console.log(text, obj) + } + + /**************************************************************************** + * EXPORT / IMPORT + */ + public onExportMenu(): void { + if (this.workspaceName) { + this.menuApi.getMenuStructureForWorkspaceId({ id: this.workspaceName }).subscribe((data) => { + /* const filteredStructure = fetchedStructure.map((item: any) => + filterObjectTree( + item, + [ + 'creationDate', + 'creationUser', + 'modificationDate', + 'modificationUser', + 'id', + 'parentItemId', + 'portalName' + ], + 'children' + ) + ) as MenuItem[] + filteredStructure.sort((a, b) => (a.position || 0) - (b.position || 0)) */ + const jsonBody = JSON.stringify(data, null, 2) + FileSaver.saveAs(new Blob([jsonBody], { type: 'text/json' }), 'workspace_' + this.portal?.name + '_menu.json') + }) + } + } + public onImportMenu(): void { + this.displayMenuImport = true + this.menuImportError = false + } + public onImportMenuHide(): void { + this.displayMenuImport = false + } + public onImportMenuClear(): void { + this.menuItemStructureDTOArray = undefined + this.menuImportError = false + } + public onImportMenuSelect(event: { files: FileList }): void { + event.files[0].text().then((text) => { + this.menuItemStructureDTOArray = undefined + this.menuImportError = false + try { + const menuItemStructureDTOArray: Array = JSON.parse(text) as Array + if (this.isMenuImportRequestDTO2(menuItemStructureDTOArray)) { + this.menuItemStructureDTOArray = menuItemStructureDTOArray + } else { + console.error('Menu Import Error: Data not valid', menuItemStructureDTOArray) + this.menuItemStructureDTOArray = undefined + this.menuImportError = true + } + } catch (err) { + console.error('Menu Import Parse Error', err) + this.menuImportError = true + } + }) + } + private isMenuImportRequestDTO2(obj: unknown): obj is Array { + const dto = obj as Array + return !!(typeof dto === 'object' && dto && dto.length) + } + + public onMenuImport(): void { + if (this.workspaceName) { + this.menuApi + .exportMenuByWorkspaceName({ + name: this.workspaceName + // menuStructureListDTO: { menuItemStructureDTOS: this.menuItemStructureDTOArray } + }) + .subscribe({ + next: () => { + this.msgService.success({ summaryKey: 'TREE.STRUCTURE_UPLOAD_SUCCESS' }) + this.ngOnInit() + }, + error: (err: any) => { + this.msgService.error({ summaryKey: 'TREE.STRUCTURE_UPLOAD_ERROR' }) + console.error(err) + } + }) + } + } + + /**************************************************************************** + * MENU TREE POPUP - outsourced for reordering and preview + */ + public onDisplayTreeModal() { + this.displayTreeModal = true + } + public onHideTreeModal() { + this.displayTreeModal = false + } + + // triggered by changes of tree structure in tree popup + public updateMenuItems(updatedMenuItems: MenuItem[]): void { + this.menuApi + .patchMenuItems({ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + id: this.workspaceName, + patchMenuItemsRequest: [{ resource: updatedMenuItems[0] }] // WARNING: SHOULD BE WHOLE ARRAY??? + // menuItemDetailsDTO: updatedMenuItems + }) + .subscribe({ + next: () => { + this.msgService.success({ summaryKey: 'TREE.EDIT_SUCCESS' }) + }, + error: (err: any) => { + this.msgService.error({ summaryKey: 'TREE.EDIT_ERROR' }) + console.error(err) + }, + complete: () => { + this.onReloadMenu() + } + }) + } + + public onStartResizeTree(ev: MouseEvent) { + // console.log('start:', ev) + } + public onEndResizeTree(ev: MouseEvent) { + // console.log('end:', ev) + this.treeHeight = ev.clientY + } +} diff --git a/src/app/workspace/workspace-detail/menu/menu.module.ts b/src/app/workspace/workspace-detail/menu/menu.module.ts new file mode 100644 index 00000000..4d0e39e6 --- /dev/null +++ b/src/app/workspace/workspace-detail/menu/menu.module.ts @@ -0,0 +1,53 @@ +import { CUSTOM_ELEMENTS_SCHEMA, Inject, NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +// import { HttpClient } from '@angular/common/http' +import { FormsModule } from '@angular/forms' +import { RouterModule, Routes } from '@angular/router' +import { ConfirmationService, TreeDragDropService } from 'primeng/api' +import { ConfirmDialogModule } from 'primeng/confirmdialog' +import { FileUploadModule } from 'primeng/fileupload' +import { TreeTableModule } from 'primeng/treetable' +// import { TranslateModule, TranslateLoader } from '@ngx-translate/core' + +import { MFE_INFO, MfeInfo, PortalCoreModule } from '@onecx/portal-integration-angular' + +import { SharedModule /* , HttpLoaderFactory */ } from '../../../shared/shared.module' +import { MenuTreeService } from '../../../services/menu-tree.service' +import { MenuTreeComponent } from './menu-tree/menu-tree.component' +import { MenuComponent } from './menu.component' + +const routes: Routes = [ + { + path: '', + component: MenuComponent + } +] + +@NgModule({ + declarations: [MenuComponent, MenuTreeComponent], + imports: [ + CommonModule, + SharedModule, + [RouterModule.forChild(routes)], + PortalCoreModule.forMicroFrontend(), + FormsModule, + FileUploadModule, + ConfirmDialogModule, + TreeTableModule + // TranslateModule.forChild({ + // isolate: true, + // loader: { + // provide: TranslateLoader, + // useFactory: HttpLoaderFactory, + // deps: [HttpClient, MFE_INFO] + // } + // }) + ], + providers: [ConfirmationService, PortalCoreModule, MenuTreeService, TreeDragDropService], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class MenuModule { + constructor(@Inject(MFE_INFO) mfeInfo: MfeInfo) { + console.log(`Portal Detail Menu Module constructor ${JSON.stringify(mfeInfo)}`) + } +} diff --git a/src/app/workspace/workspace-detail/mfe-registrations/mfe-registrations.component.html b/src/app/workspace/workspace-detail/mfe-registrations/mfe-registrations.component.html new file mode 100644 index 00000000..75a895bc --- /dev/null +++ b/src/app/workspace/workspace-detail/mfe-registrations/mfe-registrations.component.html @@ -0,0 +1,300 @@ + + + + + + diff --git a/src/app/workspace/workspace-detail/mfe-registrations/mfe-registrations.component.scss b/src/app/workspace/workspace-detail/mfe-registrations/mfe-registrations.component.scss new file mode 100644 index 00000000..d9c37a23 --- /dev/null +++ b/src/app/workspace/workspace-detail/mfe-registrations/mfe-registrations.component.scss @@ -0,0 +1,19 @@ +:host ::ng-deep { + .p-dialog.portal-mfe-registration .p-dialog-content { + padding-top: 1rem; + padding-bottom: 0; + .p-inputgroup .p-float-label:first-child { + width: unset; + } + .p-inputtext.slash { + border-left: 0; + border-right: 0; + } + .p-float-label, + .p-float-label .p-dropdown { + .p-inputtext { + padding: 11px 8px 7px 8px; + } + } + } +} diff --git a/src/app/workspace/workspace-detail/mfe-registrations/mfe-registrations.component.ts b/src/app/workspace/workspace-detail/mfe-registrations/mfe-registrations.component.ts new file mode 100644 index 00000000..54b31cc3 --- /dev/null +++ b/src/app/workspace/workspace-detail/mfe-registrations/mfe-registrations.component.ts @@ -0,0 +1,246 @@ +// /* eslint-disable @typescript-eslint/no-non-null-assertion */ +// import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core' +// import { FormControl, Validators } from '@angular/forms' +// import { Table } from 'primeng/table' +// import { TranslateService } from '@ngx-translate/core' + +// import { +// MicrofrontendDTOv1, +// MicrofrontendV1APIService, +// MicrofrontendRegistrationDTO, +// MicrofrontendRegistrationInternalAPIService, +// PortalDTO +// } from '../../../shared/generated' +// import { DropDownChangeEvent } from '../../../shared/utils' +// import { PortalMessageService } from '@onecx/portal-integration-angular' + +// export type MfeRegistered = MicrofrontendRegistrationDTO & { +// remoteEntry?: string +// remoteName?: string + +// exposedModule?: string +// displayName?: string +// } + +// @Component({ +// selector: 'app-mfe-registrations', +// templateUrl: './mfe-registrations.component.html', +// styleUrls: ['./mfe-registrations.component.scss'] +// }) +// export class MfeRegistrationsComponent implements OnInit { +// @Input() portalDetail!: PortalDTO +// @Input() editMode = false + +// @ViewChild('mfeRTable') mfeRTable: Table | undefined +// @ViewChild('mfeRTableFilterInput') mfeRTableFilter: ElementRef | undefined + +// public mfeMap: Map = new Map() +// public mfeAList: MicrofrontendDTOv1[] = [] // list of all MFEs +// public mfeRList: MfeRegistered[] = [] // list of registered MFEs +// public mfeRColumns: object[] = [] +// public mfeRTablePageReport = '' +// public mfeRTableFilterColumns = '' +// public mfeLoading = true +// apiLoading = false +// displayRegisterDialog = false +// displayDeregisterDialog = false +// urlPathPattern = '([^:]*)' +// mfeIdFC = new FormControl(null, [Validators.required]) +// baseUrlFC = new FormControl(null, [Validators.pattern(this.urlPathPattern)]) +// selectedMfe: MicrofrontendDTOv1 | undefined + +// constructor( +// private mfeApi: MicrofrontendV1APIService, +// private mfeRegApi: MicrofrontendRegistrationInternalAPIService, +// private translate: TranslateService, +// private msgService: PortalMessageService +// ) { +// mfeApi.getMicrofrontends().subscribe({ +// next: (mfes) => { +// mfes.reduce((mfeMap, mfe) => mfeMap.set(mfe.id!, mfe), this.mfeMap) +// this.mfeAList = mfes.sort(this.sortMfesByDisplayName) +// if (this.mfeAList.length > 0) this.selectedMfe = this.mfeMap.get(this.mfeAList[0].id!) +// this.loadMfeRegistered() +// }, +// error: (err) => { +// this.msgService.error({ summaryKey: 'PORTAL.MFES.MESSAGES.MFE_LOAD_ERROR', detailKey: err.error.message }) +// this.mfeLoading = false +// console.error(err) +// } +// }) +// } + +// ngOnInit() { +// this.mfeRColumns = [ +// { field: 'baseUrl', header: 'BASE_URL', isSpecial: true }, +// { field: 'remoteBaseUrl', header: 'REMOTE_BASE_URL', isSpecial: true }, +// { field: 'displayName', header: 'DISPLAY_NAME' }, +// { field: 'appId', header: 'APP_ID' }, +// { field: 'actions', header: 'DEREGISTER', isSpecial: true, noSort: true } +// ] +// this.translate +// .get(['PORTAL.MFE.DISPLAY_NAME', 'PORTAL.MFE.REMOTE_BASE_URL', 'PORTAL.MFE.BASE_URL', 'PORTAL.MFE.APP_ID']) +// .subscribe((data) => { +// this.mfeRTableFilterColumns = [ +// data['PORTAL.MFE.DISPLAY_NAME'], +// data['PORTAL.MFE.REMOTE_BASE_URL'], +// data['PORTAL.MFE.BASE_URL'], +// data['PORTAL.MFE.APP_ID'] +// ].join(', ') +// }) +// this.onPaginationMfeRTable() +// } + +// public loadMfeRegistered(): void { +// this.mfeRList = Array.from(this.portalDetail.microfrontendRegistrations || []).map((mfeR) => { +// // a registration without mfe could happen on portal imports => invalid +// if (this.mfeMap.has(mfeR.mfeId!)) { +// const mfeA = this.mfeMap.get(mfeR.mfeId!) +// if (mfeA) { +// const mfeAInfo = { +// displayName: mfeA['displayName'], +// remoteName: mfeA['remoteName'], +// remoteBaseUrl: mfeA['remoteBaseUrl'], +// moduleType: mfeA['moduleType'] +// } +// return { ...mfeR, ...mfeAInfo } +// } +// } +// return mfeR +// }) +// this.mfeLoading = false +// this.selectedMfe = undefined +// this.mfeRList = this.mfeRList.sort(this.sortMfesByBaseUrl) +// } + +// public onClearFilterMfeRTable(): void { +// if (this.mfeRTableFilter) { +// this.mfeRTableFilter.nativeElement.value = '' +// } +// this.mfeRTable?.clear() +// this.loadMfeRegistered() +// } +// public onPaginationMfeRTable(): void { +// if (this.mfeRTable) { +// this.mfeRTablePageReport = this.preparePageReport(this.mfeRList.length, this.mfeRTable.rows) +// console.log('REPORT', this.mfeRTablePageReport) +// } +// } +// private preparePageReport(n: number, rows: number): string { +// if (n === undefined || rows === undefined) return '' +// let ext = '0' +// if (n > 0) ext = (n === 1 ? '1' : 'n') + '_' + (n <= rows ? '1' : 'n') +// return ext +// } + +// public onSelectMfe(ev: DropDownChangeEvent): void { +// if (ev && ev.value) { +// if (this.mfeMap.has(ev.value)) { +// this.selectedMfe = this.mfeMap.get(ev.value) +// } +// } +// } +// public onCloseDialog(): void { +// this.displayRegisterDialog = false +// this.baseUrlFC.reset() +// this.mfeIdFC.reset() +// } + +// public onRegisterMfe(): void { +// this.apiLoading = true +// const selectedModule = this.mfeMap.get(this.mfeIdFC.value!) as MicrofrontendDTOv1 +// // sanitize the URL +// // the overall minimum length is 1, so that the mfe url path could be empty +// let mfeBaseUrl: string = this.portalDetail.baseUrl ? this.portalDetail.baseUrl : '' +// if (this.baseUrlFC.value) { +// if (this.portalDetail.baseUrl && this.portalDetail.baseUrl !== '/') mfeBaseUrl = mfeBaseUrl + '/' +// mfeBaseUrl = mfeBaseUrl + this.baseUrlFC.value +// while (mfeBaseUrl.indexOf('//') > -1) mfeBaseUrl = mfeBaseUrl.replace(/\/\//g, '/') +// if (mfeBaseUrl.substring(mfeBaseUrl.length - 1) === '/') +// mfeBaseUrl = mfeBaseUrl.substring(0, mfeBaseUrl.length - 1) +// } else { +// mfeBaseUrl = mfeBaseUrl + '$' +// } +// this.mfeRegApi +// .registerMicrofrontend({ +// portalId: this.portalDetail.id!, +// microfrontendRegistrationRequestDTO: { +// baseUrl: mfeBaseUrl, +// mfeId: this.mfeIdFC.value! +// } +// }) +// .subscribe({ +// next: (data) => { +// if (!this.portalDetail.microfrontendRegistrations) { +// this.portalDetail.microfrontendRegistrations = new Set() +// } +// this.portalDetail.microfrontendRegistrations.add(data) +// this.mfeMap.set(selectedModule.id!, selectedModule) +// this.loadMfeRegistered() +// this.msgService.success({ summaryKey: 'PORTAL.MFES.MESSAGES.MFE_REGISTRATION_OK' }) +// this.apiLoading = false +// this.displayRegisterDialog = false +// this.baseUrlFC.reset() +// this.mfeIdFC.reset() +// }, +// error: (err) => { +// this.msgService.error({ +// summaryKey: 'PORTAL.MFES.MESSAGES.MFE_REGISTRATION_NOK', +// detailKey: +// err.error.message.indexOf('already exists') > 0 +// ? 'PORTAL.MFES.MESSAGES.MFE_ALREADY_EXISTS' +// : err.error.message +// }) +// this.apiLoading = false +// console.error(err) +// } +// }) +// } + +// public onDeregister(mfe: MicrofrontendDTOv1): void { +// if (!mfe || !mfe?.id) return +// this.selectedMfe = mfe +// this.displayDeregisterDialog = true +// } + +// public deregisterMfe(): void { +// if (!(this.selectedMfe && this.selectedMfe?.id)) return +// this.mfeRegApi +// .deleteMicrofrontendRegistration({ +// mfeRegId: this.selectedMfe.id, +// portalId: this.portalDetail.id! +// }) +// .subscribe({ +// next: () => { +// this.displayDeregisterDialog = false +// if (!this.portalDetail.microfrontendRegistrations) { +// this.portalDetail.microfrontendRegistrations = new Set() +// } +// if (this.portalDetail.microfrontendRegistrations.size > 0) { +// this.portalDetail.microfrontendRegistrations.forEach((mfe) => { +// if (mfe.id === this.selectedMfe?.id) { +// this.portalDetail.microfrontendRegistrations?.delete(mfe) +// } +// }) +// this.loadMfeRegistered() +// } +// this.msgService.success({ summaryKey: 'PORTAL.MFES.MESSAGES.MFE_DEREGISTRATION_OK' }) +// }, +// error: (err) => { +// this.msgService.error({ summaryKey: 'PORTAL.MFES.MESSAGES.MFE_DEREGISTRATION_NOK' }) +// console.error(err) +// } +// }) +// } + +// public sortMfesByDisplayName(a: MicrofrontendDTOv1, b: MicrofrontendDTOv1): number { +// return (a.displayName ? (a.displayName as string).toUpperCase() : '').localeCompare( +// b.displayName ? (b.displayName as string).toUpperCase() : '' +// ) +// } +// public sortMfesByBaseUrl(a: MicrofrontendRegistrationDTO, b: MicrofrontendRegistrationDTO): number { +// return (a.baseUrl ? (a.baseUrl as string).toUpperCase() : '').localeCompare( +// b.baseUrl ? (b.baseUrl as string).toUpperCase() : '' +// ) +// } +// } diff --git a/src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.html b/src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.html new file mode 100644 index 00000000..12b7afd2 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.html @@ -0,0 +1,110 @@ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
diff --git a/src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.scss b/src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.scss new file mode 100644 index 00000000..075b0057 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.scss @@ -0,0 +1,3 @@ +@import '/src/_mixins.scss'; + +@include make-disabled-form-readable-input; diff --git a/src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.spec.ts b/src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.spec.ts new file mode 100644 index 00000000..21145d4a --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.spec.ts @@ -0,0 +1,193 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core' +import { ComponentFixture, TestBed, fakeAsync, waitForAsync } from '@angular/core/testing' +import { HttpClient } from '@angular/common/http' +import { HttpClientTestingModule } from '@angular/common/http/testing' +import { TranslateLoader, TranslateModule } from '@ngx-translate/core' +import { FormControl, FormGroup } from '@angular/forms' +import { of, throwError } from 'rxjs' + +import { PortalMessageService } from '@onecx/portal-integration-angular' +import { HttpLoaderFactory } from 'src/app/shared/shared.module' +import { WorkspaceContactComponent } from './workspace-contact.component' +import { PortalDTO, PortalInternalAPIService } from '../../../shared/generated' + +const portal: PortalDTO = { + portalName: 'name', + themeName: 'theme', + themeId: 'id', + baseUrl: '/some/base/url', + id: 'id' +} + +const formGroup = new FormGroup({ + country: new FormControl('country'), + city: new FormControl('city'), + postalCode: new FormControl('postalCode'), + street: new FormControl('street'), + streetNo: new FormControl('streetNo') +}) + +describe('WorkspaceContactComponent', () => { + let component: WorkspaceContactComponent + let fixture: ComponentFixture + + const msgServiceSpy = jasmine.createSpyObj('PortalMessageService', ['success', 'error']) + const apiServiceSpy = { + updatePortal: jasmine.createSpy('updatePortal').and.returnValue(of({})) + } + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [WorkspaceContactComponent], + imports: [ + HttpClientTestingModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }) + ], + schemas: [NO_ERRORS_SCHEMA], + providers: [ + { provide: PortalMessageService, useValue: msgServiceSpy }, + { provide: PortalInternalAPIService, useValue: apiServiceSpy } + ] + }).compileComponents() + msgServiceSpy.success.calls.reset() + msgServiceSpy.error.calls.reset() + apiServiceSpy.updatePortal.calls.reset() + })) + + beforeEach(() => { + fixture = TestBed.createComponent(WorkspaceContactComponent) + component = fixture.componentInstance + fixture.detectChanges() + }) + + it('should create', () => { + expect(component).toBeTruthy() + }) + + it('should disable formGroup if editMode false', () => { + component.editMode = false + component.formGroup = formGroup + component.portalDetail = portal + component.portalDetail.address = { + country: 'detail country', + city: 'detail city', + postalCode: 'detail postalCode', + street: 'detail street', + streetNo: 'detail streetNo' + } + + component.ngOnChanges() + + expect(component.formGroup.disabled).toBeTrue() + }) + + it('should setFormData onChanges: no address', () => { + component.editMode = true + component.formGroup = formGroup + component.portalDetail = portal + component.portalDetail.address = undefined + + component.ngOnChanges() + + expect(component.formGroup.controls['street'].value).toEqual(undefined) + }) + + it('should setFormData onChanges: address', () => { + component.formGroup = formGroup + component.portalDetail = portal + component.portalDetail.address = { + country: 'detail country', + city: 'detail city', + postalCode: 'detail postalCode', + street: 'detail street', + streetNo: 'detail streetNo' + } + + component.ngOnChanges() + + expect(component.formGroup.controls['street'].value).toEqual('detail street') + }) + + it('should update portal onSubmit', () => { + apiServiceSpy.updatePortal.and.returnValue(of({})) + component.formGroup = new FormGroup({ + phoneNumber: new FormControl('123456789'), + country: new FormControl('Some country'), + city: new FormControl('Some city'), + postalCode: new FormControl('12345'), + street: new FormControl('Some street'), + streetNo: new FormControl('123') + }) + component.portalDetail = portal + component.portalDetail.address = { + country: 'detail country', + city: 'detail city', + postalCode: 'detail postalCode', + street: 'detail street', + streetNo: 'detail streetNo' + } + + component.onSubmit() + + expect(msgServiceSpy.success).toHaveBeenCalledWith({ summaryKey: 'ACTIONS.EDIT.MESSAGE.CHANGE_OK' }) + }) + + it('should display error msg if update api call fails', fakeAsync(() => { + apiServiceSpy.updatePortal.and.returnValue(throwError(() => new Error())) + component.formGroup = new FormGroup({ + phoneNumber: new FormControl('123456789'), + country: new FormControl('Some country'), + city: new FormControl('Some city'), + postalCode: new FormControl('12345'), + street: new FormControl('Some street'), + streetNo: new FormControl('123') + }) + component.portalDetail = portal + component.portalDetail.address = { + country: 'detail country', + city: 'detail city', + postalCode: 'detail postalCode', + street: 'detail street', + streetNo: 'detail streetNo' + } + + component.onSubmit() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ + summaryKey: 'ACTIONS.EDIT.MESSAGE.CHANGE_NOK' + }) + })) + + xit('should display error msg if formGroup invalid', () => { + const address = {} + component.portalDetail = { ...portal, address: address } + + component.onSubmit() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ + summaryKey: 'GENERAL.FORM_VALIDATION' + }) + }) + + it('should update portal onSubmit: no address', () => { + apiServiceSpy.updatePortal.and.returnValue(of({})) + const newPortal: PortalDTO = { + portalName: 'name', + themeName: 'theme', + themeId: 'id', + baseUrl: '/some/base/url', + id: 'id' + } + component.portalDetail = { ...newPortal, address: undefined } + + component.onSubmit() + + expect(component.portalDetail.address).toBeDefined() + }) +}) diff --git a/src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.ts b/src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.ts new file mode 100644 index 00000000..30e4af93 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-contact/workspace-contact.component.ts @@ -0,0 +1,94 @@ +import { Component, Input, OnChanges } from '@angular/core' +import { FormControl, FormGroup } from '@angular/forms' + +import { Workspace, WorkspaceAPIService } from 'src/app/shared/generated' +import { clonePortalWithMicrofrontendsArray } from '../../../shared/utils' +import { PortalMessageService } from '@onecx/portal-integration-angular' + +@Component({ + selector: 'app-workspace-contact', + templateUrl: './workspace-contact.component.html', + styleUrls: ['./workspace-contact.component.scss'] +}) +export class WorkspaceContactComponent implements OnChanges { + @Input() portalDetail!: Workspace + @Input() editMode = false + + public formGroup: FormGroup + + constructor(private api: WorkspaceAPIService, private msgService: PortalMessageService) { + this.formGroup = new FormGroup({ + companyName: new FormControl(null), + phoneNumber: new FormControl(null), + country: new FormControl(null), + city: new FormControl(null), + postalCode: new FormControl(null), + street: new FormControl(null), + streetNo: new FormControl(null) + }) + } + + public ngOnChanges(): void { + this.setFormData() + this.editMode ? this.formGroup.enable() : this.formGroup.disable() + } + + setFormData(): void { + Object.keys(this.formGroup.controls).forEach((element) => { + if (['street', 'streetNo', 'city', 'postalCode', 'country'].includes(element) && this.portalDetail.address) { + this.formGroup.controls[element].setValue((this.portalDetail.address as any)[element]) + } else { + this.formGroup.controls[element].setValue((this.portalDetail as any)[element]) + } + }) + } + + onSubmit(): void { + if (this.formGroup.valid) { + Object.assign(this.portalDetail, this.getPortalChangesFromForm()) + this.api + .updateWorkspace({ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + id: this.portalDetail.id!, + updateWorkspaceRequest: { resource: clonePortalWithMicrofrontendsArray(this.portalDetail) } + }) + .subscribe({ + next: () => { + this.msgService.success({ summaryKey: 'ACTIONS.EDIT.MESSAGE.CHANGE_OK' }) + }, + error: () => { + this.msgService.error({ + summaryKey: 'ACTIONS.EDIT.MESSAGE.CHANGE_NOK' /* , detailKey: err.error.message */ + }) + } + }) + this.editMode = false + } else { + this.msgService.error({ summaryKey: 'GENERAL.FORM_VALIDATION' }) + console.log('INVALID FORM => contact-info') + } + } + + //return the values that are different in form than in PortalDTO + private getPortalChangesFromForm(): any[] { + const changes: any = { + address: {} + } + + Object.keys(this.formGroup.controls).forEach((key) => { + if (['street', 'streetNo', 'city', 'postalCode', 'country'].includes(key)) { + if (!this.portalDetail.address) { + this.portalDetail.address = {} + } + if (this.formGroup.value[key] !== undefined) { + changes['address'][key] = this.formGroup.value[key] + } + } else { + if (this.formGroup.value[key] !== undefined) { + changes[key] = this.formGroup.value[key] + } + } + }) + return changes + } +} diff --git a/src/app/workspace/workspace-detail/workspace-detail.component.html b/src/app/workspace/workspace-detail/workspace-detail.component.html new file mode 100644 index 00000000..7c655a2f --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-detail.component.html @@ -0,0 +1,140 @@ + + + + + + + +
+ +
+
+ + +
+ +
+
+ + +
+ +
+
+ + + + +
+ +
+
+ + +
+ +
+
+
+
+ + +
{{ 'ACTIONS.EXPORT.PORTAL' | translate }}
+
+ +
+ +
+ + +
+
+
+ + +
+
+
+
{{ this.portalDeleteMessage }}
+
{{ 'ACTIONS.DELETE.MESSAGE_INFO' | translate }}
+
+
+ +
+ + +
+
+
+
diff --git a/src/app/workspace/workspace-detail/workspace-detail.component.scss b/src/app/workspace/workspace-detail/workspace-detail.component.scss new file mode 100644 index 00000000..36ec3116 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-detail.component.scss @@ -0,0 +1,11 @@ +:host ::ng-deep { + @media (max-width: 991px) { + .p-dialog.p-dialog { + max-height: unset !important; + height: unset !important; + } + } + .danger-action-text { + color: var(--danger-button-bg); + } +} diff --git a/src/app/workspace/workspace-detail/workspace-detail.component.spec.ts b/src/app/workspace/workspace-detail/workspace-detail.component.spec.ts new file mode 100644 index 00000000..6e655758 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-detail.component.spec.ts @@ -0,0 +1,402 @@ +import { NO_ERRORS_SCHEMA, Component } from '@angular/core' +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' +import { Location } from '@angular/common' +import { HttpClient, HttpEventType, HttpHeaders, HttpResponse } from '@angular/common/http' +import { HttpClientTestingModule } from '@angular/common/http/testing' +import { Router } from '@angular/router' +import { RouterTestingModule } from '@angular/router/testing' +import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router' +import { TranslateLoader, TranslateModule } from '@ngx-translate/core' +import { of, throwError } from 'rxjs' + +import { PortalMessageService, ConfigurationService, AUTH_SERVICE } from '@onecx/portal-integration-angular' +import { HttpLoaderFactory } from 'src/app/shared/shared.module' +import { WorkspaceDetailComponent } from './workspace-detail.component' +import { WorkspacePropsComponent } from './workspace-props/workspace-props.component' +import { WorkspaceContactComponent } from './workspace-contact/workspace-contact.component' +import { WorkspaceRolesComponent } from './workspace-roles/workspace-roles.component' +import { WorkspaceImagesComponent } from './workspace-images/workspace-images.component' +import { + PortalDTO, + PortalMenuItemDTO, + PortalInternalAPIService, + MenuItemsInternalAPIService, + ThemesAPIService, + ThemeDTO +} from '../../shared/generated' + +class MockRouter { + navigate = jasmine.createSpy('navigate') +} + +const portal: PortalDTO = { + portalName: 'name', + themeName: 'theme', + themeId: 'id', + baseUrl: '/some/base/url', + id: 'id' +} + +const mockMenuItems: PortalMenuItemDTO[] = [ + { + name: 'menu name' + }, + { + name: 'menu2 name' + } +] + +const menuHttpResponse: HttpResponse = { + body: mockMenuItems, + status: 200, + statusText: 'OK', + headers: new HttpHeaders(), + url: 'mock-url', + ok: true, + type: HttpEventType.Response, + clone: () => menuHttpResponse +} + +const themeHttpResponse: HttpResponse = { + body: { name: 'theme' }, + status: 200, + statusText: 'OK', + headers: new HttpHeaders(), + url: 'mock-url', + ok: true, + type: HttpEventType.Response, + clone: () => themeHttpResponse +} + +@Component({ template: '' }) +class MockMenuComponent {} + +class MockWorkspacePropsComponent { + public onSubmit(): void {} +} + +class MockWorkspaceContactComponent { + public onSubmit(): void {} +} + +class MockWorkspaceRolesComponent { + public onSubmit(): void {} +} + +class MockWorkspaceImagesComponent { + public onSubmit(): void {} +} + +describe('WorkspaceDetailComponent', () => { + let component: WorkspaceDetailComponent + let fixture: ComponentFixture + let mockActivatedRoute: Partial + let mockRouter = new MockRouter() + const mockAuthService = jasmine.createSpyObj('IAuthService', ['hasPermission']) + + const msgServiceSpy = jasmine.createSpyObj('PortalMessageService', ['success', 'error']) + const apiServiceSpy = { + getPortalByPortalId: jasmine.createSpy('getPortalByPortalId').and.returnValue(of({})), + deletePortal: jasmine.createSpy('deletePortal').and.returnValue(of({})) + } + const menuApiServiceSpy = { + getMenuStructureForPortalId: jasmine.createSpy('getMenuStructureForPortalId').and.returnValue(of(mockMenuItems)) + } + const themeApiServiceSpy = jasmine.createSpyObj('ThemesAPIService', ['getThemeById']) + const configServiceSpy = { + getProperty: jasmine.createSpy('getProperty').and.returnValue('123'), + getPortal: jasmine.createSpy('getPortal').and.returnValue({ + themeId: '1234', + portalName: 'test', + baseUrl: '/', + microfrontendRegistrations: [] + }), + lang: 'en' + } + const translateServiceSpy = jasmine.createSpyObj('TranslateService', ['get']) + const locationSpy = jasmine.createSpyObj('Location', ['back']) + + const mockActivatedRouteSnapshot: Partial = { + params: { + id: 'mockId' + } + } + mockActivatedRoute = { + snapshot: mockActivatedRouteSnapshot as ActivatedRouteSnapshot + } + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [WorkspaceDetailComponent], + imports: [ + HttpClientTestingModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }), + RouterTestingModule.withRoutes([{ path: 'menu', component: MockMenuComponent }]) + ], + schemas: [NO_ERRORS_SCHEMA], + providers: [ + { provide: ActivatedRoute, useValue: mockActivatedRoute }, + { provide: Router, useValue: mockRouter }, + { provide: PortalMessageService, useValue: msgServiceSpy }, + { provide: PortalInternalAPIService, useValue: apiServiceSpy }, + { provide: ConfigurationService, useValue: configServiceSpy }, + { provide: MenuItemsInternalAPIService, useValue: menuApiServiceSpy }, + { provide: ThemesAPIService, useValue: themeApiServiceSpy }, + { provide: AUTH_SERVICE, useValue: mockAuthService }, + { provide: Location, useValue: locationSpy } + ] + }).compileComponents() + msgServiceSpy.success.calls.reset() + msgServiceSpy.error.calls.reset() + apiServiceSpy.getPortalByPortalId.calls.reset() + apiServiceSpy.deletePortal.calls.reset() + menuApiServiceSpy.getMenuStructureForPortalId.calls.reset() + themeApiServiceSpy.getThemeById.calls.reset() + translateServiceSpy.get.calls.reset() + locationSpy.back.calls.reset() + })) + + beforeEach(() => { + fixture = TestBed.createComponent(WorkspaceDetailComponent) + component = fixture.componentInstance + fixture.detectChanges() + }) + + function initializeComponent(): void { + fixture = TestBed.createComponent(WorkspaceDetailComponent) + component = fixture.componentInstance + fixture.detectChanges() + } + + it('should create', () => { + expect(component).toBeTruthy() + }) + + it('should set German date format', () => { + configServiceSpy.lang = 'de' + + initializeComponent() + + expect(component.dateFormat).toEqual('dd.MM.yyyy HH:mm:ss') + }) + + it('should set selectedIndex onChange', () => { + const event = { + index: 1 + } + + component.onChange(event) + + expect(component.selectedIndex).toEqual(1) + }) + + it('should getPortalData onInit', () => { + apiServiceSpy.getPortalByPortalId.and.returnValue(of([portal])) + spyOn(component, 'onPortalData') + + component.ngOnInit() + + expect(component.onPortalData).toHaveBeenCalled() + }) + + it('should display error msg if get api call fails', () => { + apiServiceSpy.getPortalByPortalId.and.returnValue(throwError(() => new Error())) + + component.ngOnInit() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ + summaryKey: 'SEARCH.ERROR', + detailKey: 'PORTAL.NOT_EXIST_MESSAGE' + }) + }) + + it('should delete portal on confirmDeletePortal', () => { + apiServiceSpy.deletePortal.and.returnValue(of({})) + component.portalDownloadVisible = true + + component.confirmDeletePortal() + + expect(msgServiceSpy.success).toHaveBeenCalledWith({ summaryKey: 'ACTIONS.DELETE.MESSAGE_OK' }) + expect(component.portalDownloadVisible).toBeFalse() + }) + + it('should display error msg if delete api call fails', () => { + apiServiceSpy.deletePortal.and.returnValue(throwError(() => new Error())) + + component.confirmDeletePortal() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ + summaryKey: 'ACTIONS.DELETE.MESSAGE_NOK' + }) + }) + + it('should export a portal', () => { + component.portalDetail = portal + component.importThemeCheckbox = true + menuApiServiceSpy.getMenuStructureForPortalId.and.returnValue(of(mockMenuItems)) + themeApiServiceSpy.getThemeById.and.returnValue(of(themeHttpResponse)) + + component.onExportWorkspace() + + expect(component.portalDownloadVisible).toBeFalse() + }) + + it('should display error if themeNotSpecified on export', () => { + component.portalDetail = portal + component.portalDetail.themeId = '' + component.importThemeCheckbox = true + menuApiServiceSpy.getMenuStructureForPortalId.and.returnValue(of(mockMenuItems)) + themeApiServiceSpy.getThemeById.and.returnValue(throwError(() => new Error())) + + component.onExportWorkspace() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ + summaryKey: 'DETAIL.THEME_NOT_SPECIFIED_MESSAGE' + }) + }) + + it('should display error if portalNotFound on export', () => { + component.portalDetail = undefined + + component.onExportWorkspace() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ + summaryKey: 'DETAIL.PORTAL_NOT_FOUND' + }) + }) + + it('should have prepared action buttons onInit: close', () => { + apiServiceSpy.getPortalByPortalId.and.returnValue(of([portal])) + + component.ngOnInit() + const action = component.actions[0] + action.actionCallback() + + expect(locationSpy.back).toHaveBeenCalled() + }) + + it('should have prepared action buttons onInit: manageMenu', () => { + apiServiceSpy.getPortalByPortalId.and.returnValue(of([portal])) + spyOn(component, 'manageMenu') + + component.ngOnInit() + const action = component.actions[1] + action.actionCallback() + + expect(component.manageMenu).toHaveBeenCalled() + }) + + it('should have prepared action buttons onInit: toggleEditMode', () => { + apiServiceSpy.getPortalByPortalId.and.returnValue(of([portal])) + + component.editMode = false + component.ngOnInit() + const action = component.actions[2] + action.actionCallback() + + expect(component.editMode).toBeTrue() + }) + + it('should have prepared action buttons onInit: updatePortal props', () => { + apiServiceSpy.getPortalByPortalId.and.returnValue(of([portal])) + component.portalPropsComponent = new MockWorkspacePropsComponent() as unknown as WorkspacePropsComponent + component.selectedIndex = 0 + + component.ngOnInit() + const action = component.actions[3] + action.actionCallback() + + expect(component.editMode).toBeFalse() + }) + + it('should have prepared action buttons onInit: updatePortal contact', () => { + apiServiceSpy.getPortalByPortalId.and.returnValue(of([portal])) + component.portalContactComponent = new MockWorkspaceContactComponent() as unknown as WorkspaceContactComponent + component.selectedIndex = 1 + + component.ngOnInit() + const action = component.actions[3] + action.actionCallback() + + expect(component.editMode).toBeFalse() + }) + + it('should have prepared action buttons onInit: updatePortal roles', () => { + apiServiceSpy.getPortalByPortalId.and.returnValue(of([portal])) + component.portalRolesComponent = new MockWorkspaceRolesComponent() as unknown as WorkspaceRolesComponent + component.selectedIndex = 4 + + component.ngOnInit() + const action = component.actions[3] + action.actionCallback() + + expect(component.editMode).toBeFalse() + }) + + it('should have prepared action buttons onInit: updatePortal images', () => { + apiServiceSpy.getPortalByPortalId.and.returnValue(of([portal])) + component.portalImagesComponent = new MockWorkspaceImagesComponent() as unknown as WorkspaceImagesComponent + component.selectedIndex = 5 + + component.ngOnInit() + const action = component.actions[3] + action.actionCallback() + + expect(component.editMode).toBeFalse() + }) + + it('should have prepared action buttons onInit: updatePortal: default', () => { + apiServiceSpy.getPortalByPortalId.and.returnValue(of([portal])) + component.selectedIndex = 99 + spyOn(console, 'error') + + component.ngOnInit() + const action = component.actions[3] + action.actionCallback() + + expect(console.error).toHaveBeenCalledWith("Couldn't assign tab to component") + }) + + it('should have prepared action buttons onInit: portalDownloadVisible', () => { + apiServiceSpy.getPortalByPortalId.and.returnValue(of([portal])) + + component.ngOnInit() + const action = component.actions[4] + action.actionCallback() + + expect(component.portalDownloadVisible).toBeTrue() + }) + + it('should have prepared action buttons onInit: toggleEditMode', () => { + apiServiceSpy.getPortalByPortalId.and.returnValue(of([portal])) + const toggleEditModeSpy = spyOn(component, 'toggleEditMode').and.callThrough() + + component.ngOnInit() + const action = component.actions[5] + action.actionCallback() + + expect(toggleEditModeSpy).toHaveBeenCalled() + }) + + it('should have prepared action buttons onInit: portalDeleteVisible', () => { + apiServiceSpy.getPortalByPortalId.and.returnValue(of([portal])) + + component.ngOnInit() + const action = component.actions[6] + action.actionCallback() + + expect(component.portalDeleteVisible).toBeTrue() + }) + + it('should correctly navigate on manageMenu', () => { + component.manageMenu() + + expect(mockRouter.navigate).toHaveBeenCalledWith(['./menu'], { relativeTo: mockActivatedRoute }) + }) +}) diff --git a/src/app/workspace/workspace-detail/workspace-detail.component.ts b/src/app/workspace/workspace-detail/workspace-detail.component.ts new file mode 100644 index 00000000..fd2d3ee7 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-detail.component.ts @@ -0,0 +1,449 @@ +import { Component, Inject, OnInit, ViewChild } from '@angular/core' +import { DatePipe, Location } from '@angular/common' +import { ActivatedRoute /* , ExtraOptions */, Router } from '@angular/router' +// import { /* concatMap, */ Observable } from 'rxjs' +import { TranslateService } from '@ngx-translate/core' +import FileSaver from 'file-saver' + +import { + Action, + AUTH_SERVICE, + ConfigurationService, + IAuthService, + ObjectDetailItem, + PortalMessageService +} from '@onecx/portal-integration-angular' +import { + WorkspaceSnapshot, + // ImportRequestDTOv1ThemeImportData, + MenuItemAPIService, + Workspace, + WorkspaceAPIService + + // ThemeDTO, + // ThemesAPIService +} from '../../shared/generated' +import { environment } from '../../../environments/environment' + +import { WorkspacePropsComponent } from './workspace-props/workspace-props.component' +import { WorkspaceRolesComponent } from './workspace-roles/workspace-roles.component' +import { WorkspaceInternComponent } from './workspace-intern/workspace-intern.component' +import { WorkspaceImagesComponent } from './workspace-images/workspace-images.component' +import { WorkspaceContactComponent } from './workspace-contact/workspace-contact.component' + +// import { filterObject, filterObjectTree } from '../../shared/utils' + +@Component({ + selector: 'app-workspace-detail', + templateUrl: './workspace-detail.component.html', + styleUrls: ['./workspace-detail.component.scss'] +}) +export class WorkspaceDetailComponent implements OnInit { + @ViewChild(WorkspacePropsComponent, { static: false }) + portalPropsComponent!: WorkspacePropsComponent + + @ViewChild(WorkspaceContactComponent, { static: false }) + portalContactComponent!: WorkspaceContactComponent + + @ViewChild(WorkspaceRolesComponent, { static: false }) + portalRolesComponent!: WorkspaceRolesComponent + + @ViewChild(WorkspaceInternComponent, { static: false }) + portalInternComponent!: WorkspaceInternComponent + + @ViewChild(WorkspaceImagesComponent, { static: false }) + portalImagesComponent!: WorkspaceImagesComponent + + private apiPrefix = environment.apiPrefix + actions: Action[] = [] + editMode = false + headerImageUrl?: string + importThemeCheckbox = false + isLoading = false + objectDetails: ObjectDetailItem[] = [] + portalDeleteMessage = '' + portalDeleteVisible = false + portalDetail?: Workspace + portalDownloadVisible = false + portalId: string = '' + portalName = this.route.snapshot.params['name'] + selectedIndex = 0 + dateFormat = 'medium' + + constructor( + public route: ActivatedRoute, + private router: Router, + private location: Location, + private config: ConfigurationService, + private menuApi: MenuItemAPIService, + // private themeApi: ThemesAPIService, + private workspaceApi: WorkspaceAPIService, + private translate: TranslateService, + private msgService: PortalMessageService, + @Inject(AUTH_SERVICE) readonly auth: IAuthService + ) { + this.dateFormat = this.config.lang === 'de' ? 'dd.MM.yyyy HH:mm:ss' : 'medium' + console.log('SNAP', this.route.snapshot.toString()) + } + + ngOnInit() { + this.getPortalData() + } + + public onChange($event: any) { + this.selectedIndex = $event.index + } + + public onPortalData(portal: Workspace) { + this.portalDetail = portal + this.preparePageHeaderImage() + this.translate + .get([ + 'ACTIONS.NAVIGATION.BACK', + 'ACTIONS.NAVIGATION.BACK.TOOLTIP', + 'MENU.HEADER', + 'MENU.SUBHEADER', + 'ACTIONS.CANCEL', + 'ACTIONS.TOOLTIPS.CANCEL', + 'ACTIONS.SAVE', + 'ACTIONS.TOOLTIPS.SAVE', + 'ACTIONS.EXPORT.LABEL', + 'ACTIONS.EXPORT.PORTAL', + 'ACTIONS.EDIT.LABEL', + 'ACTIONS.EDIT.TOOLTIP', + 'ACTIONS.DELETE.LABEL', + 'ACTIONS.DELETE.TOOLTIP', + 'ACTIONS.DELETE.MESSAGE' + ]) + .subscribe((data) => { + this.preparePageHeaderActions(data) + }) + this.translate + .get(['PORTAL.ITEM.HOME_PAGE', 'PORTAL.ITEM.BASE_URL', 'PORTAL.ITEM.THEME', 'DETAIL.CREATION_DATE']) + .subscribe((data) => { + this.preparePageObjectDetails(data) + }) + } + + private async getPortalData() { + this.workspaceApi + .getWorkspaceByName({ name: this.portalName }) + .pipe() + .subscribe({ + next: (portal) => { + // Convert microfrontends to Set to avoid typeerrors + // portal.microfrontendRegistrations = new Set(Array.from(portal.microfrontendRegistrations ?? [])) + if (portal.resource) { + this.portalId = portal.resource.id || '' + this.onPortalData(portal.resource) + } + }, + error: () => { + this.msgService.error({ summaryKey: 'SEARCH.ERROR', detailKey: 'PORTAL.NOT_EXIST_MESSAGE' }) + close() // if portal not found then go back + } + }) + } + + private updatePortal() { + // Trigger update on the form of the currently selected tab + switch (this.selectedIndex) { + case 0: { + this.portalPropsComponent.onSubmit() + break + } + case 1: { + this.portalContactComponent.onSubmit() + break + } + case 4: { + this.portalRolesComponent.onSubmit() + break + } + case 5: { + this.portalImagesComponent.onSubmit() + break + } + default: { + console.error("Couldn't assign tab to component") + break + } + } + this.toggleEditMode('view') + } + + confirmDeletePortal() { + this.deletePortal() + this.portalDownloadVisible = false + } + + private deletePortal() { + this.workspaceApi.deleteWorkspace({ id: this.portalId }).subscribe( + () => { + this.msgService.success({ summaryKey: 'ACTIONS.DELETE.MESSAGE_OK' }) + this.close() + }, + () => { + this.msgService.error({ summaryKey: 'ACTIONS.DELETE.MESSAGE_NOK' /* , detailKey: err.error.message */ }) + } + ) + } + + private close(): void { + this.location.back() + } + + private toggleEditMode(forcedMode?: 'edit' | 'view'): void { + if (forcedMode) this.editMode = forcedMode === 'edit' ? true : false + else this.editMode = !this.editMode + this.translate + .get([ + 'ACTIONS.NAVIGATION.BACK', + 'ACTIONS.NAVIGATION.BACK.TOOLTIP', + 'MENU.HEADER', + 'MENU.SUBHEADER', + 'ACTIONS.CANCEL', + 'ACTIONS.TOOLTIPS.CANCEL', + 'ACTIONS.SAVE', + 'ACTIONS.TOOLTIPS.SAVE', + 'ACTIONS.EXPORT.LABEL', + 'ACTIONS.EXPORT.PORTAL', + 'ACTIONS.EDIT.LABEL', + 'ACTIONS.EDIT.TOOLTIP', + 'ACTIONS.DELETE.LABEL', + 'ACTIONS.DELETE.TOOLTIP', + 'ACTIONS.DELETE.MESSAGE' + ]) + .subscribe((data) => { + this.preparePageHeaderActions(data) + }) + } + + public onExportWorkspace() { + if (!this.portalDetail) { + this.portalNotFoundError() + return + } + + this.workspaceApi + .exportWorkspaces({ + exportWorkspacesRequest: { includeMenus: true, names: [this.portalDetail.name] } + }) + .subscribe({ + next: (snapshot) => { + this.savePortalToFile(snapshot) + }, + error: () => {} + }) + // get workspace object with filtered properties + // const portalExport: WorkspaceSnapshot = { + // portal: filterObject(this.portalDetail, [ + // 'creationDate', + // 'creationUser', + // 'modificationDate', + // 'modificationUser', + // 'id', + // 'themeId', + // 'tenantId', + // 'parentItemId' + // ]) as Workspace + // } + + // const menuStructure$ = this.menuApi.getMenuStructureForWorkspaceId({ id: this.portalId }) + // let finalMenuStructure$$ = menuStructure$ + + if (this.importThemeCheckbox) { + if (this.portalDetail.theme) { + /* const theme$ = this.themeApi.getThemeById({ id: this.portalDetail.themeId }) + finalMenuStructure$$ = theme$.pipe( + concatMap((theme) => { + const themeImportData = filterObject(theme, [ + 'creationDate', + 'creationUser', + 'modificationDate', + 'modificationUser', + 'id', + 'portalId', + 'tenantId', + 'portals' + ]) as ImportRequestDTOv1ThemeImportData + portalExport.themeImportData = themeImportData + this.saveThemeToFile(themeImportData) + return menuStructure$ + }) + ) */ + } else { + this.themeNotSpecifiedError() + return + } + } + // this.exportWorkspace(finalMenuStructure$$, portalExport) + // this.savePortalToFile(portalExport) + this.portalDownloadVisible = false + } + + // private exportWorkspace( + // finalMenuStructure$$: Observable>, + // portalExport: WorkspaceSnapshot + // ) { + /* finalMenuStructure$$.subscribe({ + next: (structure) => { + // get menu structure object with filtered properties + const items = structure.map((item) => + filterObjectTree( + item, + [ + 'creationDate', + 'creationUser', + 'modificationDate', + 'modificationUser', + 'id', + 'themeId', + 'parentItemId', + 'portalId', + 'tenantId' + ], + 'children' + ) + ) as EximWorkspaceMenuItem[] + // sort explicitly because filtering destroys the order on first level + if (portalExport.workspaces && portalExport.workspaces[0].menu?.menu?.menuItems) { + portalExport.workspaces[0].menu?.menu?.menuItems = items.sort((a, b) => (a.position || 0) - (b.position || 0)) + } + portalExport[0].synchronizePermissions = false + + }, + error: () => this.themeNotSpecifiedError() */ + // }) + // } + + // private saveThemeToFile(theme: ThemeDTO) { + // const themeJSON = JSON.stringify(theme, null, 2) + // FileSaver.saveAs(new Blob([themeJSON], { type: 'text/json' }), `${this.portalDetail?.themeName + '_Theme'}.json`) + // } + + private savePortalToFile(portalExport: WorkspaceSnapshot) { + const portalJson = JSON.stringify(portalExport, null, 2) + FileSaver.saveAs(new Blob([portalJson], { type: 'text/json' }), `${this.portalDetail?.name || 'Workspace'}.json`) + } + + private portalNotFoundError() { + this.msgService.error({ summaryKey: 'DETAIL.PORTAL_NOT_FOUND' }) + } + + private themeNotSpecifiedError() { + this.msgService.error({ summaryKey: 'DETAIL.THEME_NOT_SPECIFIED_MESSAGE' }) + } + + private preparePageObjectDetails(data: any) { + this.objectDetails = [ + { + label: data['PORTAL.ITEM.HOME_PAGE'], + value: this.portalDetail?.homePage + }, + { + label: data['PORTAL.ITEM.BASE_URL'], + value: this.portalDetail?.baseUrl + }, + { + label: data['PORTAL.ITEM.THEME'], + value: this.portalDetail?.theme + }, + { + label: data['DETAIL.CREATION_DATE'], + value: this.portalDetail?.creationDate, + valuePipe: DatePipe, + valuePipeArgs: this.dateFormat + } + ] + } + + private preparePageHeaderImage() { + if (this.portalDetail?.logoUrl && !this.portalDetail.logoUrl.match(/^(http|https)/g)) { + this.headerImageUrl = this.apiPrefix + this.portalDetail.logoUrl + } else { + this.headerImageUrl = this.portalDetail?.logoUrl + } + } + + private preparePageHeaderActions(data: any) { + this.actions = [] + this.actions.push( + { + label: data['ACTIONS.NAVIGATION.BACK'], + title: data['ACTIONS.NAVIGATION.BACK.TOOLTIP'], + actionCallback: () => this.close(), + icon: 'pi pi-arrow-left', + show: 'always', + permission: 'WORKSPACE#SEARCH' + }, + { + label: data['MENU.HEADER'], + title: data['MENU.SUBHEADER'], + actionCallback: () => this.manageMenu(), + icon: 'pi pi-sitemap', + show: 'always', + permission: 'WORKSPACE_MENU#VIEW', + conditional: true, + showCondition: this.portalDetail != null && !this.editMode + }, + { + label: data['ACTIONS.CANCEL'], + title: data['ACTIONS.TOOLTIPS.CANCEL'], + actionCallback: () => this.toggleEditMode(), + icon: 'pi pi-times', + show: 'always', + permission: 'WORKSPACE#VIEW', + conditional: true, + showCondition: this.editMode + }, + { + label: data['ACTIONS.SAVE'], + title: data['ACTIONS.TOOLTIPS.SAVE'], + actionCallback: () => this.updatePortal(), + icon: 'pi pi-save', + show: 'always', + permission: 'WORKSPACE#SAVE', + conditional: true, + showCondition: this.editMode + }, + { + label: data['ACTIONS.EXPORT.LABEL'], + title: data['ACTIONS.EXPORT.PORTAL'], + actionCallback: () => (this.portalDownloadVisible = true), + icon: 'pi pi-download', + show: 'always', + permission: 'WORKSPACE#EXPORT', + conditional: true, + showCondition: this.portalDetail != null && !this.editMode + }, + { + label: data['ACTIONS.EDIT.LABEL'], + title: data['ACTIONS.EDIT.TOOLTIP'], + actionCallback: () => this.toggleEditMode(), + icon: 'pi pi-pencil', + show: 'always', + permission: 'WORKSPACE#EDIT', + conditional: true, + showCondition: this.portalDetail != null && !this.editMode + }, + { + label: data['ACTIONS.DELETE.LABEL'], + title: data['ACTIONS.DELETE.TOOLTIP'].replace('{{TYPE}}', 'Workspace'), + actionCallback: () => { + this.portalDeleteVisible = true + this.portalDeleteMessage = data['ACTIONS.DELETE.MESSAGE'].replace('{{ITEM}}', this.portalDetail?.name) + }, + icon: 'pi pi-trash', + show: 'asOverflow', + permission: 'WORKSPACE#DELETE', + conditional: true, + showCondition: this.portalDetail != null && !this.editMode + } + ) + } + + public manageMenu(): void { + this.router.navigate(['./menu'], { relativeTo: this.route }) + } +} diff --git a/src/app/workspace/workspace-detail/workspace-detail.module.ts b/src/app/workspace/workspace-detail/workspace-detail.module.ts new file mode 100644 index 00000000..775b6ac2 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-detail.module.ts @@ -0,0 +1,75 @@ +import { CUSTOM_ELEMENTS_SCHEMA, Inject, NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +// import { HttpClient } from '@angular/common/http' +import { FormsModule } from '@angular/forms' +import { RouterModule, Routes } from '@angular/router' +import { ConfirmationService } from 'primeng/api' +// import { TranslateModule, TranslateLoader } from '@ngx-translate/core' + +import { MFE_INFO, MfeInfo, PortalCoreModule } from '@onecx/portal-integration-angular' + +import { SharedModule /* , HttpLoaderFactory */ } from '../../shared/shared.module' +import { LabelResolver } from '../../shared/label.resolver' +import { WorkspaceDetailComponent } from './workspace-detail.component' +import { WorkspacePropsComponent } from './workspace-props/workspace-props.component' +import { WorkspaceRolesComponent } from './workspace-roles/workspace-roles.component' +import { WorkspaceInternComponent } from './workspace-intern/workspace-intern.component' +import { WorkspaceImagesComponent } from './workspace-images/workspace-images.component' +import { WorkspaceContactComponent } from './workspace-contact/workspace-contact.component' +// import { WorkspaceSubjectComponent } from './workspace-subjects/workspace-subjects.component' +import { LogoComponent } from './workspace-images/logo/logo.component' +// import { MfeRegistrationsComponent } from './mfe-registrations/mfe-registrations.component' + +const routes: Routes = [ + { + path: '', + component: WorkspaceDetailComponent + }, + { + path: 'menu', + loadChildren: () => import('./menu/menu.module').then((m) => m.MenuModule), + data: { + breadcrumb: 'BREADCRUMBS.MENU', + breadcrumbFn: (data: any) => `${data.labeli18n}` + }, + resolve: { + labeli18n: LabelResolver + } + } +] + +@NgModule({ + declarations: [ + WorkspaceDetailComponent, + WorkspacePropsComponent, + WorkspaceContactComponent, + WorkspaceInternComponent, + WorkspaceRolesComponent, + WorkspaceImagesComponent, + // WorkspaceSubjectComponent, + // MfeRegistrationsComponent, + LogoComponent + ], + imports: [ + CommonModule, + SharedModule, + [RouterModule.forChild(routes)], + PortalCoreModule.forMicroFrontend(), + FormsModule + // TranslateModule.forChild({ + // isolate: true, + // loader: { + // provide: TranslateLoader, + // useFactory: HttpLoaderFactory, + // deps: [HttpClient, MFE_INFO] + // } + // }) + ], + providers: [ConfirmationService], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class WorkspaceDetailModule { + constructor(@Inject(MFE_INFO) mfeInfo: MfeInfo) { + console.log(`Workspace Detail Module constructor ${JSON.stringify(mfeInfo)}`) + } +} diff --git a/src/app/workspace/workspace-detail/workspace-images/logo/logo.component.html b/src/app/workspace/workspace-detail/workspace-images/logo/logo.component.html new file mode 100644 index 00000000..fdad650a --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-images/logo/logo.component.html @@ -0,0 +1,52 @@ +Logo Url + + + diff --git a/src/app/workspace/workspace-detail/workspace-images/logo/logo.component.scss b/src/app/workspace/workspace-detail/workspace-images/logo/logo.component.scss new file mode 100644 index 00000000..6c5992ce --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-images/logo/logo.component.scss @@ -0,0 +1,14 @@ +.image-st { + height: 50px; + object-fit: contain; +} + +.image-preview { + max-height: 50px; + max-width: 100px; + box-shadow: 0 0 2px #000000; +} + +.component-container { + display: flex; +} diff --git a/src/app/workspace/workspace-detail/workspace-images/logo/logo.component.ts b/src/app/workspace/workspace-detail/workspace-images/logo/logo.component.ts new file mode 100644 index 00000000..61426bdc --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-images/logo/logo.component.ts @@ -0,0 +1,28 @@ +import { Component, Input, OnChanges, SimpleChanges } from '@angular/core' +import { environment } from '../../../../../environments/environment' + +@Component({ + selector: 'app-logo', + templateUrl: './logo.component.html', + styleUrls: ['./logo.component.scss'] +}) +export class LogoComponent implements OnChanges { + @Input() logoUrl?: string + public apiPrefix = environment.apiPrefix + public imageFound = true + + public ngOnChanges(changes: SimpleChanges): void { + if (changes['logoUrl']) { + this.imageFound = true + + // if logo Url does not start with a http, then it stored in the backend. So we need to put prefix in front + if (this.logoUrl && !this.logoUrl.match(/^(http|https)/g)) { + this.logoUrl = this.apiPrefix + this.logoUrl + } + } + } + + showFallbackImage() { + this.imageFound = false + } +} diff --git a/src/app/workspace/workspace-detail/workspace-images/workspace-images.component.html b/src/app/workspace/workspace-detail/workspace-images/workspace-images.component.html new file mode 100644 index 00000000..b21f6122 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-images/workspace-images.component.html @@ -0,0 +1,91 @@ + + + + {{ 'PORTAL.ITEM.IMAGE_URL' | translate }} + + + + + + + + +
{{ control['value']['url'] }}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ +
diff --git a/src/app/workspace/workspace-detail/workspace-images/workspace-images.component.scss b/src/app/workspace/workspace-detail/workspace-images/workspace-images.component.scss new file mode 100644 index 00000000..16488023 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-images/workspace-images.component.scss @@ -0,0 +1,45 @@ +//set border when screen ist larger than 460px-width +@media (min-width: 740px) { + .table-row-elm-edit { + width: 66%; + } +} + +@media (max-width: 460px) { + //handle buttons from import-tool + :host ::ng-deep p-fileUpload div div.p-fileupload-buttonbar { + display: flex; + justify-content: space-between; + } +} + +.table-header { + width: 40%; +} + +.add-button { + padding: 0.5rem 0.5rem; +} + +.div-edit-buttons { + padding: 1em; + display: flex; +} + +.table-row-elm-non-edit { + padding: 22px; + max-width: 800px !important; +} + +.table-row-elm-edit { + width: 100%; +} + +.input-field { + border-color: #d3d3d3; + width: 100%; +} + +.table-row { + border: 0; +} diff --git a/src/app/workspace/workspace-detail/workspace-images/workspace-images.component.ts b/src/app/workspace/workspace-detail/workspace-images/workspace-images.component.ts new file mode 100644 index 00000000..889a65d9 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-images/workspace-images.component.ts @@ -0,0 +1,162 @@ +import { Component, Input, Output, EventEmitter, SimpleChanges, OnChanges } from '@angular/core' +import { FormArray, FormBuilder, FormControl, FormControlState, FormGroup } from '@angular/forms' +import { TranslateService } from '@ngx-translate/core' +import { MessageService } from 'primeng/api' + +import { /* ImageV1APIService, */ WorkspaceAPIService, Workspace } from '../../../shared/generated' +import { clonePortalWithMicrofrontendsArray } from '../../../shared/utils' +import { LogoState } from '../../workspace-create/logo-state' + +export interface PortalImageForm { + url: FormControl +} + +@Component({ + selector: 'app-workspace-images', + templateUrl: './workspace-images.component.html', + styleUrls: ['./workspace-images.component.scss'] +}) +export class WorkspaceImagesComponent implements OnChanges { + @Input() portalDetail!: Workspace + @Input() editMode = false + @Output() changeEditMode = new EventEmitter() + @Output() switchToEditMode = new EventEmitter() + + public formArray!: FormArray> + public LogoState = LogoState + public logoState = LogoState.INITIAL + + constructor( + private messageService: MessageService, + private translate: TranslateService, + private api: WorkspaceAPIService, + private fb: FormBuilder /* // private imageApi: ImageV1APIService */ + ) { + this.formArray = this.fb.array([] as FormGroup[]) + } + public ngOnChanges(changes: SimpleChanges): void { + if (this.portalDetail && changes['portalDetail']) { + this.setFormData() + } + + //when we go into edit-mode, then we add one empty input-field. + if (changes['editMode'] && this.editMode) { + const group = new FormGroup({ + url: new FormControl('') + }) + this.formArray.push(group) + } + + //when we leave edit Mode, remove all empty rows + if (changes['editMode'] && !this.editMode) { + this.removeEmptyRows() + } + } + + public setFormData(): void { + if (this.portalDetail && this.portalDetail.subjectLinks) { + this.portalDetail.imageUrls?.forEach((url: string | FormControlState | null | undefined) => { + const group = new FormGroup({ + url: new FormControl(url === undefined ? null : url) + }) + this.formArray.push(group) + }) + } + } + + public deleteSubject(formArrayIndex: any): void { + this.formArray.removeAt(formArrayIndex) + } + + public addImageEntry() { + const group = new FormGroup({ + url: new FormControl('') + }) + this.formArray.push(group) + } + + public onSubmit() { + if (this.formArray.valid) { + //clear formArray of all empty entries + this.removeEmptyRows() + this.portalDetail.imageUrls = this.formArray.value.map((el) => el.url) as unknown as Array + this.api + .updateWorkspace({ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + id: this.portalDetail.id!, + updateWorkspaceRequest: { resource: clonePortalWithMicrofrontendsArray(this.portalDetail) } + }) + .subscribe({ + next: () => { + this.messageService.add({ severity: 'success', summary: 'Portal updated' }) + }, + + error: (err: { error: any }) => { + this.messageService.add({ severity: 'danger', summary: 'Failed to update portal', detail: err.error }) + } + }) + } else { + this.messageService.add({ + severity: 'error', + summary: this.translate.instant('GENERAL.FORM_VALIDATION') + }) + console.log('INVALID FORM') + } + } + + // REMEMBER TO CHANGE BACK IN HTML TOO! + onFileUpload() { + // onFileUpload(event: { files: File[] }) { + /* for (const file of event.files) { + this.imageApi.uploadImage({ image: file }).subscribe((data: { imageUrl: any }) => { + this.logoState = LogoState.INITIAL + + this.formArray.at(this.lengthFormGroup() - 1).patchValue({ url: data.imageUrl }) + + this.portalDetail.imageUrls + ? this.portalDetail.imageUrls.add(data.imageUrl || '') + : (this.portalDetail.imageUrls = new Set(data.imageUrl || '')) + + if (this.portalDetail.id) { + this.api + .updatePortal({ + portalId: this.portalDetail.id, + updatePortalDTO: clonePortalWithMicrofrontendsArray(this.portalDetail) + }) + .subscribe({ + next: () => { + this.messageService.add({ + severity: 'success', + summary: this.translate.instant('LOGO.UPLOAD_SUCCESS') + }) + this.addImageEntry() + }, + error: (err: { error: any }) => { + this.messageService.add({ + severity: 'danger', + summary: this.translate.instant('LOGO.UPLOAD_FAIL'), + detail: err.error + }) + } + }) + } + }) + } */ + } + + public selectPhoto(): void { + this.logoState = LogoState.SELECT + } + + lengthFormGroup(): number { + return Object.keys(this.formArray.controls).length + } + + private removeEmptyRows() { + for (let i = this.lengthFormGroup() - 1; i >= 0; i--) { + if (this.formArray.controls[i].value['url'] === '') { + this.formArray.removeAt(i) + } + } + } +} diff --git a/src/app/workspace/workspace-detail/workspace-intern/workspace-intern.component.html b/src/app/workspace/workspace-detail/workspace-intern/workspace-intern.component.html new file mode 100644 index 00000000..0d486a06 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-intern/workspace-intern.component.html @@ -0,0 +1,65 @@ +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
diff --git a/src/app/workspace/workspace-detail/workspace-intern/workspace-intern.component.spec.ts b/src/app/workspace/workspace-detail/workspace-intern/workspace-intern.component.spec.ts new file mode 100644 index 00000000..5bcf7664 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-intern/workspace-intern.component.spec.ts @@ -0,0 +1,48 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core' +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' +import { HttpClient } from '@angular/common/http' +import { HttpClientTestingModule } from '@angular/common/http/testing' +import { TranslateLoader, TranslateModule } from '@ngx-translate/core' + +import { HttpLoaderFactory } from 'src/app/shared/shared.module' +import { WorkspaceInternComponent } from './workspace-intern.component' + +describe('WorkspaceInternComponent', () => { + let component: WorkspaceInternComponent + let fixture: ComponentFixture + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [WorkspaceInternComponent], + imports: [ + HttpClientTestingModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }) + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents() + })) + + beforeEach(() => { + fixture = TestBed.createComponent(WorkspaceInternComponent) + component = fixture.componentInstance + + component.portalDetail = { + portalName: 'name', + themeName: 'theme', + themeId: 'id', + baseUrl: '/some/base/url', + id: 'id' + } + fixture.detectChanges() + }) + + it('should create', () => { + expect(component).toBeTruthy() + }) +}) diff --git a/src/app/workspace/workspace-detail/workspace-intern/workspace-intern.component.ts b/src/app/workspace/workspace-detail/workspace-intern/workspace-intern.component.ts new file mode 100644 index 00000000..3215027a --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-intern/workspace-intern.component.ts @@ -0,0 +1,15 @@ +import { Component, Input } from '@angular/core' +import { TranslateService } from '@ngx-translate/core' + +import { Workspace } from 'src/app/shared/generated' + +@Component({ + selector: 'app-workspace-intern', + templateUrl: './workspace-intern.component.html' +}) +export class WorkspaceInternComponent { + @Input() portalDetail!: Workspace + @Input() dateFormat = 'medium' + + constructor(private translate: TranslateService) {} +} diff --git a/src/app/workspace/workspace-detail/workspace-props/workspace-props.component.html b/src/app/workspace/workspace-detail/workspace-props/workspace-props.component.html new file mode 100644 index 00000000..47cfeaf0 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-props/workspace-props.component.html @@ -0,0 +1,221 @@ +
+
+
+
+
+ + + + +
+ +
+ + + + +
+ + + +
+
+ + + + + + + + + +
+ +
+ + + +
+ + + + + + + +
+ + + + + + + + + + + + +
+
+
+
diff --git a/src/app/workspace/workspace-detail/workspace-props/workspace-props.component.scss b/src/app/workspace/workspace-detail/workspace-props/workspace-props.component.scss new file mode 100644 index 00000000..c7c41cee --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-props/workspace-props.component.scss @@ -0,0 +1,23 @@ +@import '/src/_mixins.scss'; + +@include make-disabled-form-readable-input; +@include make-disabled-form-readable-dropdown; + +:host ::ng-deep { + .inputgroup-dropdown-with-link { + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .input-field-correction .p-inputtext { + padding-top: 1rem !important; + padding-bottom: 0.5rem !important; + } + .pseudo-button:hover { + background: var(--button-hover-bg) !important; + cursor: pointer; + * { + background: var(--button-hover-bg) !important; + } + } +} diff --git a/src/app/workspace/workspace-detail/workspace-props/workspace-props.component.spec.ts b/src/app/workspace/workspace-detail/workspace-props/workspace-props.component.spec.ts new file mode 100644 index 00000000..8807f979 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-props/workspace-props.component.spec.ts @@ -0,0 +1,191 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core' +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' +import { HttpClient } from '@angular/common/http' +import { FormControl, FormGroup, Validators } from '@angular/forms' +import { HttpClientTestingModule } from '@angular/common/http/testing' +import { TranslateLoader, TranslateModule } from '@ngx-translate/core' +import { of, throwError } from 'rxjs' + +import { + AUTH_SERVICE, + ConfigurationService, + PortalMessageService, + ThemeService +} from '@onecx/portal-integration-angular' +import { HttpLoaderFactory } from 'src/app/shared/shared.module' +import { WorkspacePropsComponent } from './workspace-props.component' +import { PortalInternalAPIService, ThemesAPIService } from '../../../shared/generated' + +const portalDetail = { + portalName: 'name', + themeName: 'theme', + themeId: 'id', + baseUrl: '/some/base/url', + id: 'id' +} + +const formGroup = new FormGroup({ + portalName: new FormControl('name', [Validators.required, Validators.minLength(2), Validators.maxLength(50)]), + themeName: new FormControl('theme name', [Validators.required]), + baseUrl: new FormControl('/url', [Validators.required, Validators.minLength(1), Validators.pattern('^/.*')]), + tenantId: new FormControl('') +}) + +describe('WorkspacePropsComponent', () => { + let component: WorkspacePropsComponent + let fixture: ComponentFixture + const mockAuthService = jasmine.createSpyObj('IAuthService', ['hasPermission']) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + + const msgServiceSpy = jasmine.createSpyObj('PortalMessageService', ['success', 'error']) + const apiServiceSpy = { + updatePortal: jasmine.createSpy('updatePortal').and.returnValue(of([])) + } + const themeAPIServiceSpy = { + getThemes: jasmine.createSpy('getThemes').and.returnValue(of({})), + getThemeById: jasmine.createSpy('getThemeById').and.returnValue(of({})) + } + const configServiceSpy = { + getProperty: jasmine.createSpy('getProperty').and.returnValue('123'), + getPortal: jasmine.createSpy('getPortal').and.returnValue({ + themeId: '1234', + portalName: 'test', + id: 'id', + baseUrl: '/', + microfrontendRegistrations: [] + }) + } + const themeService = jasmine.createSpyObj('ThemeService', ['apply']) + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [WorkspacePropsComponent], + imports: [ + HttpClientTestingModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }) + ], + schemas: [NO_ERRORS_SCHEMA], + providers: [ + { provide: PortalMessageService, useValue: msgServiceSpy }, + { provide: ConfigurationService, useValue: configServiceSpy }, + { provide: PortalInternalAPIService, useValue: apiServiceSpy }, + { provide: ThemesAPIService, useValue: themeAPIServiceSpy }, + { provide: AUTH_SERVICE, useValue: mockAuthService } + ] + }).compileComponents() + msgServiceSpy.success.calls.reset() + msgServiceSpy.error.calls.reset() + apiServiceSpy.updatePortal.calls.reset() + themeAPIServiceSpy.getThemes.calls.reset() + themeAPIServiceSpy.getThemeById.calls.reset() + themeService.apply.calls.reset() + })) + + beforeEach(() => { + fixture = TestBed.createComponent(WorkspacePropsComponent) + component = fixture.componentInstance + component.portalDetail = portalDetail + // component.formGroup = formGroup + fixture.detectChanges() + }) + + function initializeComponent(): void { + fixture = TestBed.createComponent(WorkspacePropsComponent) + component = fixture.componentInstance + component.portalDetail = portalDetail + fixture.detectChanges() + } + + it('should create and get themes', () => { + themeAPIServiceSpy.getThemes.and.returnValue(of([])) + + expect(component).toBeTruthy() + }) + + it('should add tenantId to formGroup if permission', () => { + mockAuthService.hasPermission.and.callFake((permission: string) => { + return permission === 'WORKSPACE_TENANT#VIEW' + }) + + initializeComponent() + + expect(component.formGroup.contains('tenantId')).toBe(true) + }) + + it('should setFormData and set editMode onChanges', () => { + component.editMode = false + + component.ngOnChanges() + + expect(component.formGroup.disabled).toBeTrue() + }) + + it('should update portal onSubmit', () => { + apiServiceSpy.updatePortal.and.returnValue(of({})) + themeAPIServiceSpy.getThemeById.and.returnValue(of({})) + themeService.apply + component.formGroup = formGroup + + component.onSubmit() + + expect(msgServiceSpy.success).toHaveBeenCalledWith({ summaryKey: 'ACTIONS.EDIT.MESSAGE.CHANGE_OK' }) + }) + + it('should set tenantId to null if empty onSubmit', () => { + apiServiceSpy.updatePortal.and.returnValue(of({})) + themeAPIServiceSpy.getThemeById.and.returnValue(of({})) + component.formGroup = formGroup + themeService.apply + + component.onSubmit() + + expect(component.formGroup.controls['tenantId'].value).toBeNull() + }) + + it('should display error msg if update api call fails', () => { + apiServiceSpy.updatePortal.and.returnValue(throwError(() => new Error())) + component.formGroup = formGroup + + component.onSubmit() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ + summaryKey: 'ACTIONS.EDIT.MESSAGE.CHANGE_NOK' + }) + }) + + it('should display error msg if update api call fails', () => { + component.formGroup = formGroup + component.formGroup.controls['baseUrl'].setValue('url') + + component.onSubmit() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ + summaryKey: 'GENERAL.FORM_VALIDATION' + }) + }) + + it('should open new window onGoToTheme if ctrl key true', () => { + const fakeEvent = new MouseEvent('click', { ctrlKey: true }) + spyOn(window, 'open') + const expectedUrl = window.document.location.href + 'theme' + + component.onGotoTheme(fakeEvent, 'theme') + + expect(window.open).toHaveBeenCalledWith(expectedUrl, '_blank') + }) + + xit('should navigate onGoToTheme if ctrl key false', () => { + const fakeEvent = new MouseEvent('click', { ctrlKey: false }) + spyOn(window, 'open') + + component.onGotoTheme(fakeEvent, 'theme') + + expect(window.open).not.toHaveBeenCalled() + }) +}) diff --git a/src/app/workspace/workspace-detail/workspace-props/workspace-props.component.ts b/src/app/workspace/workspace-detail/workspace-props/workspace-props.component.ts new file mode 100644 index 00000000..63c1bc35 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-props/workspace-props.component.ts @@ -0,0 +1,193 @@ +import { Component, Input, Inject, OnChanges, Output, EventEmitter } from '@angular/core' +import { FormControl, FormGroup, Validators } from '@angular/forms' +import { SelectItem } from 'primeng/api' +import { /* map, */ Observable, of } from 'rxjs' +import { ActivatedRoute, Router } from '@angular/router' + +import { + AUTH_SERVICE, + ConfigurationService, + IAuthService, + // Theme, + ThemeService, + PortalMessageService +} from '@onecx/portal-integration-angular' + +import { + // ImageV1APIService, + WorkspaceAPIService /* , ThemeDTO, ThemesAPIService */ +} from '../../../shared/generated' +import { Workspace } from '../../../shared/generated' +import { environment } from '../../../../environments/environment' +import { LogoState } from '../../workspace-create/logo-state' +import { + clonePortalWithMicrofrontendsArray, + setFetchUrls, + copyToClipboard + // sortThemeByName +} from '../../../shared/utils' + +@Component({ + selector: 'app-workspace-props', + templateUrl: './workspace-props.component.html', + styleUrls: ['./workspace-props.component.scss'] +}) +export class WorkspacePropsComponent implements OnChanges { + @Input() portalDetail!: Workspace + @Input() editMode = false + @Output() portalUpdated = new EventEmitter() + + public formGroup: FormGroup + + public mfeRList: { label: string | undefined; value: string }[] = [] + public themes$: Observable[]> = of([]) + public hasTenantViewPermission = false + public hasTenantEditPermission = false + public urlPattern = '/base-path-to-portal' + public copyToClipboard = copyToClipboard // make available from utils + + //Logo + public preview = false + public previewSrc: string | undefined + public selectedFile: File | undefined + public minimumImageWidth = 150 + public minimumImageHeight = 150 + public LogoState = LogoState + public logoState = LogoState.INITIAL + public fetchingLogoUrl?: string + private apiPrefix = environment.apiPrefix + + constructor( + private workspaceApi: WorkspaceAPIService, + // private themeApi: ThemesAPIService, + // private imageApi: ImageV1APIService, + private themeService: ThemeService, + private config: ConfigurationService, + private msgService: PortalMessageService, + public route: ActivatedRoute, + private router: Router, + @Inject(AUTH_SERVICE) readonly auth: IAuthService + ) { + this.hasTenantViewPermission = this.auth.hasPermission('WORKSPACE_TENANT#VIEW') + this.hasTenantEditPermission = this.auth.hasPermission('WORKSPACE_TENANT#EDIT') + + this.formGroup = new FormGroup({ + name: new FormControl(null, [Validators.required, Validators.minLength(2), Validators.maxLength(50)]), + themeName: new FormControl(null /* [Validators.required] */), + baseUrl: new FormControl(null, [Validators.required, Validators.minLength(1), Validators.pattern('^/.*')]), + homePage: new FormControl(null, [Validators.maxLength(255)]), + logoUrl: new FormControl('', [Validators.maxLength(255)]), + rssFeedUrl: new FormControl(null, [Validators.maxLength(255)]), + footerLabel: new FormControl(null, [Validators.maxLength(255)]), + description: new FormControl(null, [Validators.maxLength(255)]) + }) + if (this.hasTenantViewPermission) { + this.formGroup.addControl('tenantId', new FormControl(null)) + } + + /* this.themes$ = this.themeApi + .getThemes() + .pipe( + map((val) => + val.sort(sortThemeByName).map((theme) => ({ label: theme.name, value: theme.name || '', id: theme.id })) + ) + ) */ + } + + public ngOnChanges(): void { + this.setFormData() + this.editMode ? this.formGroup.enable() : this.formGroup.disable() + } + + public setFormData(): void { + // prepare list of registered MFEs to be used as homepage dropdown + // this.mfeRList = Array.from(this.portalDetail.microfrontendRegistrations ?? []).map((mfe: any) => ({ + // label: mfe.baseUrl, + // value: mfe.baseUrl || '' + // })) + // fill form + Object.keys(this.formGroup.controls).forEach((element) => { + this.formGroup.controls[element].setValue((this.portalDetail as any)[element]) + this.formGroup.controls['themeName'].setValue(this.portalDetail.theme) + }) + this.fetchingLogoUrl = setFetchUrls(this.apiPrefix, this.formGroup.value.logoUrl) + } + + public onSubmit() { + if (this.formGroup.valid) { + Object.assign(this.portalDetail, this.getPortalChangesFromForm()) + this.workspaceApi + .updateWorkspace({ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + id: this.portalDetail.id!, + updateWorkspaceRequest: { resource: clonePortalWithMicrofrontendsArray(this.portalDetail) } + }) + .subscribe({ + next: () => { + this.msgService.success({ summaryKey: 'ACTIONS.EDIT.MESSAGE.CHANGE_OK' }) + //If the Portal we update, is the current-global-portal, then we also update the global theme. + // if (this.portalDetail.id === this.config.getPortal().id && this.portalDetail.theme) { + // get theme and apply the variables in current portal + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + /* this.themeApi.getThemeById({ id: this.portalDetail.themeId! }).subscribe({ + next: (theme: ThemeDTO) => { + this.themeService.apply(theme as Theme) + } + }) */ + // } + this.portalUpdated.emit(this.portalDetail) + }, + error: () => { + this.msgService.error({ + summaryKey: 'ACTIONS.EDIT.MESSAGE.CHANGE_NOK' /* , detailKey: err.error.message */ + }) + } + }) + this.editMode = false + // check if name changed, then route to getByName - if other property changed, dont route + } else { + this.msgService.error({ summaryKey: 'GENERAL.FORM_VALIDATION' }) + } + } + + //return the values that are different in form than in PortalDTO + private getPortalChangesFromForm(): any { + if (this.formGroup.value['tenantId'] !== undefined && this.formGroup.value['tenantId'] === '') { + this.formGroup.controls['tenantId'].setValue(null) + } + const changes: any = {} + Object.keys(this.formGroup.controls).forEach((key) => { + if (this.formGroup.value[key] !== undefined) { + if (this.formGroup.value[key] !== (this.portalDetail as any)[key]) { + changes[key] = this.formGroup.value[key] + } + } + }) + return changes + } + + /* onFileUpload(ev: Event, fieldType: 'logo') { + if (ev.target && (ev.target as HTMLInputElement).files) { + const files = (ev.target as HTMLInputElement).files + if (files) { + Array.from(files).forEach((file) => { + this.imageApi.uploadImage({ image: file }).subscribe((data) => { + this.formGroup.controls[fieldType + 'Url'].setValue(data.imageUrl) + this.fetchingLogoUrl = setFetchUrls(this.apiPrefix, this.formGroup.controls[fieldType + 'Url'].value) + this.msgService.info({ summaryKey: 'IMAGE.UPLOADED', detailKey: 'IMAGE.LOGO' }) + }) + }) + } + } + } + // REMEMBER HTML TOO! + public onGotoTheme(ev: MouseEvent, uri: string) { + ev.stopPropagation() + const url = window.document.location.href + uri + if (ev.ctrlKey) { + window.open(url, '_blank') + } else { + window.document.location.href = url + } + } */ +} diff --git a/src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.html b/src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.html new file mode 100644 index 00000000..3ab55c91 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.html @@ -0,0 +1,74 @@ +
+
+ + +
+
+ +
+ + + +
+
{{ role['value'] }}
+ +
+
+
+
+
+
+ +
+ {{ role }} +
+
+
+
+ +
+ + + + + +
+ + +
+
+
diff --git a/src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.scss b/src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.scss new file mode 100644 index 00000000..592ec826 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.scss @@ -0,0 +1,20 @@ +:host ::ng-deep { + // reduced card layout for single line role name + .role-section { + padding: var(--data-view-content-padding); + } + .view-role-card { + line-height: 2.43rem; + } + .p-card.p-component { + margin: 0.3rem; + } + .p-card .p-card-content { + padding-top: 0; + padding-bottom: 0; + } + + .no-items-to-display { + margin-top: 0.5rem; + } +} diff --git a/src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.spec.ts b/src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.spec.ts new file mode 100644 index 00000000..f923d2c1 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.spec.ts @@ -0,0 +1,132 @@ +import { NO_ERRORS_SCHEMA, SimpleChanges, SimpleChange } from '@angular/core' +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' +import { HttpClient } from '@angular/common/http' +import { FormControl, Validators } from '@angular/forms' +import { HttpClientTestingModule } from '@angular/common/http/testing' +import { TranslateLoader, TranslateModule } from '@ngx-translate/core' +import { of, throwError } from 'rxjs' + +import { PortalMessageService } from '@onecx/portal-integration-angular' +import { HttpLoaderFactory } from 'src/app/shared/shared.module' +import { WorkspaceRolesComponent } from './workspace-roles.component' +import { PortalDTO, PortalInternalAPIService } from '../../../shared/generated' + +const portal: PortalDTO = { + portalName: 'name', + themeName: 'theme', + themeId: 'id', + baseUrl: '/some/base/url', + id: 'id', + portalRoles: ['role'] +} + +describe('WorkspaceRolesComponent', () => { + let component: WorkspaceRolesComponent + let fixture: ComponentFixture + + const msgServiceSpy = jasmine.createSpyObj('PortalMessageService', ['success', 'error']) + const apiServiceSpy = { + updatePortal: jasmine.createSpy('updatePortal').and.returnValue(of({})) + } + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [WorkspaceRolesComponent], + imports: [ + HttpClientTestingModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }) + ], + schemas: [NO_ERRORS_SCHEMA], + providers: [ + { provide: PortalMessageService, useValue: msgServiceSpy }, + { provide: PortalInternalAPIService, useValue: apiServiceSpy } + ] + }).compileComponents() + msgServiceSpy.success.calls.reset() + msgServiceSpy.error.calls.reset() + apiServiceSpy.updatePortal.calls.reset() + })) + + beforeEach(() => { + fixture = TestBed.createComponent(WorkspaceRolesComponent) + component = fixture.componentInstance + component.portalDetail = portal + fixture.detectChanges() + }) + + it('should create', () => { + expect(component).toBeTruthy() + }) + + it('should setFormData onChanges if portalDetail & changes correct', () => { + spyOn(component, 'setFormData') + const changes: SimpleChanges = { + portalDetail: new SimpleChange(null, component.portalDetail, true) + } + + component.ngOnChanges(changes) + + expect(component.setFormData).toHaveBeenCalled() + }) + + it('should setFormData onChanges if portalDetail & changes correct', () => { + component.setFormData() + + if (component.portalDetail.portalRoles) { + expect(component.formArray.length).toBe(component.portalDetail.portalRoles.length) + } + }) + + it('should toggleAddDialog', () => { + component.addDisplay = true + + component.toggleAddDialog() + + expect(component.addDisplay).toBeFalse() + }) + + it('should update roles on addPortalRole', () => { + apiServiceSpy.updatePortal.and.returnValue(of({})) + component.newPortalRole = 'new role' + + component.addPortalRole() + + expect(msgServiceSpy.success).toHaveBeenCalledWith({ summaryKey: 'ACTIONS.EDIT.MESSAGE.CHANGE_OK' }) + }) + + it('should update roles on deleteRole', () => { + apiServiceSpy.updatePortal.and.returnValue(of({})) + + component.deleteRole(0) + + expect(msgServiceSpy.success).toHaveBeenCalledWith({ summaryKey: 'ACTIONS.EDIT.MESSAGE.CHANGE_OK' }) + expect(component.portalDetail.portalRoles).toEqual([]) + }) + + it('should display error msg if update api call fails', () => { + apiServiceSpy.updatePortal.and.returnValue(throwError(() => new Error())) + + component.addPortalRole() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ + summaryKey: 'ACTIONS.EDIT.MESSAGE.CHANGE_NOK' + }) + }) + + it('should display error msg if form invalid', () => { + const newControl = new FormControl('role', Validators.minLength(5)) + component.formArray.push(newControl as never) + + component.onSubmit() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ + summaryKey: 'GENERAL.FORM_VALIDATION' + }) + }) +}) diff --git a/src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.ts b/src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.ts new file mode 100644 index 00000000..df160ccf --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-roles/workspace-roles.component.ts @@ -0,0 +1,87 @@ +import { Component, Input, SimpleChanges, OnChanges } from '@angular/core' +import { FormArray, FormControl } from '@angular/forms' + +import { WorkspaceAPIService } from '../../../shared/generated' +import { Workspace } from '../../../shared/generated' +import { clonePortalWithMicrofrontendsArray } from '../../../shared/utils' +import { PortalMessageService } from '@onecx/portal-integration-angular' + +@Component({ + selector: 'app-workspace-roles', + templateUrl: './workspace-roles.component.html', + styleUrls: ['./workspace-roles.component.scss'] +}) +export class WorkspaceRolesComponent implements OnChanges { + @Input() portalDetail!: Workspace + @Input() editMode = false + addDisplay = false + formArray = new FormArray([]) + newPortalRole = '' + + constructor(private workspaceApi: WorkspaceAPIService, private msgService: PortalMessageService) {} + + public ngOnChanges(changes: SimpleChanges): void { + if (this.portalDetail && changes['portalDetail']) { + this.setFormData() + } + } + + setFormData(): void { + this.portalDetail.workspaceRoles?.forEach((element: any) => { + const control = new FormControl(element) + this.formArray.push(control as never) + }) + } + + toggleAddDialog(): void { + this.addDisplay = !this.addDisplay + } + + addPortalRole(): void { + const newControl = new FormControl(this.newPortalRole) + this.formArray.push(newControl as never) + this.newPortalRole = '' + this.addDisplay = false + this.onSubmit() + } + + deleteRole(roleIndex: number): void { + this.formArray.removeAt(roleIndex) + this.onSubmit() + } + + public onSubmit() { + if (this.formArray.valid) { + const portal = clonePortalWithMicrofrontendsArray(this.portalDetail) + // clone form array and use the clone + const array: string[] = [] + this.formArray.value.forEach((role) => array.push(role)) + portal.workspaceRoles = array + this.workspaceApi + .updateWorkspace({ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + id: this.portalDetail.id!, + updateWorkspaceRequest: { resource: portal } + }) + .subscribe({ + next: () => { + this.msgService.success({ summaryKey: 'ACTIONS.EDIT.MESSAGE.CHANGE_OK' }) + // add in UI + this.portalDetail.workspaceRoles = this.formArray.value + }, + error: () => { + // console.error('ERR', err) + // const duplicate = err.error.message.indexOf('contains duplicated roles') > 0 + this.msgService.error({ + summaryKey: 'ACTIONS.EDIT.MESSAGE.CHANGE_NOK' + // detailKey: duplicate ? 'DETAIL.NEW_ROLE_DUPLICATED' : err.error.message + }) + // cleanup the form + this.formArray.removeAt(this.formArray.length - 1) + } + }) + } else { + this.msgService.error({ summaryKey: 'GENERAL.FORM_VALIDATION' }) + } + } +} diff --git a/src/app/workspace/workspace-detail/workspace-subjects/workspace-subjects.component.html b/src/app/workspace/workspace-detail/workspace-subjects/workspace-subjects.component.html new file mode 100644 index 00000000..63a9d3ac --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-subjects/workspace-subjects.component.html @@ -0,0 +1,47 @@ + diff --git a/src/app/workspace/workspace-detail/workspace-subjects/workspace-subjects.component.scss b/src/app/workspace/workspace-detail/workspace-subjects/workspace-subjects.component.scss new file mode 100644 index 00000000..ab4577fb --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-subjects/workspace-subjects.component.scss @@ -0,0 +1,24 @@ +:host ::ng-deep { + .table-header { + width: 40%; + } + .add-button { + padding: 0.5rem 0.5rem; + font-weight: 400; + font-size: large; + } + .div-edit-buttons { + padding: 1em; + display: flex; + flex-direction: row-reverse; + } + .inputs-wide { + width: 100%; + } + #table-row-elm { + padding: 22px; + } + .input-field { + border-color: #d3d3d3; + } +} diff --git a/src/app/workspace/workspace-detail/workspace-subjects/workspace-subjects.component.ts b/src/app/workspace/workspace-detail/workspace-subjects/workspace-subjects.component.ts new file mode 100644 index 00000000..af767681 --- /dev/null +++ b/src/app/workspace/workspace-detail/workspace-subjects/workspace-subjects.component.ts @@ -0,0 +1,108 @@ +// import { Component, Input, Output, SimpleChanges, EventEmitter, OnChanges } from '@angular/core' +// import { PortalDTO } from '../../../shared/generated/model/portalDTO' +// import { FormArray, FormBuilder, FormControl, FormControlState, FormGroup } from '@angular/forms' + +// import { PortalInternalAPIService, SubjectLinkDTOv1 } from '../../../shared/generated' +// import { clonePortalWithMicrofrontendsArray } from '../../../shared/utils' +// import { PortalMessageService } from '@onecx/portal-integration-angular' + +// export interface PortalSubjectForm { +// label: FormControl +// url: FormControl +// } +// @Component({ +// selector: 'app-workspace-subjects', +// templateUrl: './workspace-subjects.component.html', +// styleUrls: ['./workspace-subjects.component.scss'] +// }) +// export class WorkspaceSubjectComponent implements OnChanges { +// @Input() portalDetail!: PortalDTO +// @Input() editMode = false +// @Output() changeEditMode = new EventEmitter() +// public formArray!: FormArray> + +// constructor( +// private api: PortalInternalAPIService, +// private fb: FormBuilder, +// private msgService: PortalMessageService +// ) { +// this.formArray = this.fb.array([] as FormGroup[]) +// } +// public ngOnChanges(changes: SimpleChanges): void { +// if (this.portalDetail && changes['portalDetail']) { +// this.setFormData() +// } +// } + +// public setFormData(): void { +// if (this.portalDetail && this.portalDetail.subjectLinks) { +// this.portalDetail.subjectLinks?.forEach( +// (element: { +// label: string | FormControlState | null | undefined +// url: string | FormControlState | null | undefined +// }) => { +// const group = new FormGroup({ +// label: new FormControl(element.label === undefined ? null : element.label), +// url: new FormControl(element.url === undefined ? null : element.url) +// }) +// this.formArray.push(group) +// } +// ) +// } +// } + +// public deleteSubject(formArrayIndex: any): void { +// this.formArray.removeAt(formArrayIndex) +// } + +// public saveForm(): void { +// this.editMode = false +// this.changeEditMode.emit() +// let i = this.formArray.controls.length - 1 +// for (i; i >= 0; i--) { +// if (this.formArray.controls[i]['value']['label'] === '' && this.formArray.controls[i]['value']['url'] === '') { +// this.deleteSubject(i) +// } +// } +// } + +// public addSubjectLink() { +// const group = new FormGroup({ +// label: new FormControl(''), +// url: new FormControl('') +// }) +// this.formArray.push(group) +// } + +// public onSubmit() { +// if (this.formArray.valid) { +// this.portalDetail.subjectLinks = new Set( +// this.formArray.value.map((el) => { +// return { +// url: el.url, +// label: el.label +// } as SubjectLinkDTOv1 +// }) +// ) +// this.api +// .updatePortal({ +// // eslint-disable-next-line @typescript-eslint/no-non-null-assertion +// portalId: this.portalDetail.id!, +// updatePortalDTO: clonePortalWithMicrofrontendsArray(this.portalDetail) +// }) +// .subscribe({ +// next: () => { +// this.msgService.success({ summaryKey: 'ACTIONS.EDIT.CHANGE_OK' }) +// }, +// error: () => { +// this.msgService.error({ summaryKey: 'ACTIONS.EDIT.CHANGE_NOK' }) +// } +// }) +// this.editMode = false +// this.changeEditMode.emit() +// } else { +// this.msgService.error({ summaryKey: 'GENERAL.FORM_VALIDATION' }) +// console.log('INVALID FORM') +// } +// } +// } diff --git a/src/app/workspace/workspace-import/choose-file/choose-file.component.html b/src/app/workspace/workspace-import/choose-file/choose-file.component.html new file mode 100644 index 00000000..a71cb9c4 --- /dev/null +++ b/src/app/workspace/workspace-import/choose-file/choose-file.component.html @@ -0,0 +1,27 @@ +
+ + +
diff --git a/src/app/workspace/workspace-import/choose-file/choose-file.component.scss b/src/app/workspace/workspace-import/choose-file/choose-file.component.scss new file mode 100644 index 00000000..3c71aaf8 --- /dev/null +++ b/src/app/workspace/workspace-import/choose-file/choose-file.component.scss @@ -0,0 +1,17 @@ +:host ::ng-deep { + .p-fileupload .p-fileupload-content { + padding: 0.5rem; + } + .p-fileupload-row { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 0; + > div { + width: unset; + &:first-child { + display: none; + } + } + } +} diff --git a/src/app/workspace/workspace-import/choose-file/choose-file.component.spec.ts b/src/app/workspace/workspace-import/choose-file/choose-file.component.spec.ts new file mode 100644 index 00000000..2d6e7b4a --- /dev/null +++ b/src/app/workspace/workspace-import/choose-file/choose-file.component.spec.ts @@ -0,0 +1,289 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core' +import { ComponentFixture, TestBed, tick, waitForAsync, fakeAsync } from '@angular/core/testing' +import { HttpClient } from '@angular/common/http' +import { HttpClientTestingModule } from '@angular/common/http/testing' +import { TranslateLoader, TranslateModule } from '@ngx-translate/core' +import { of, throwError } from 'rxjs' + +import { PortalMessageService } from '@onecx/portal-integration-angular' +import { HttpLoaderFactory } from 'src/app/shared/shared.module' +import { ChooseFileComponent } from './choose-file.component' +import { PortalInternalAPIService } from '../../../shared/generated' + +describe('ChooseFileComponent', () => { + let component: ChooseFileComponent + let fixture: ComponentFixture + + const msgServiceSpy = jasmine.createSpyObj('PortalMessageService', ['success', 'error']) + const apiServiceSpy = { + portalImportRequest: jasmine.createSpy('portalImportRequest').and.returnValue(of({})) + } + const translateServiceSpy = jasmine.createSpyObj('TranslateService', ['get']) + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ChooseFileComponent], + imports: [ + HttpClientTestingModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }) + ], + schemas: [NO_ERRORS_SCHEMA], + providers: [ + { provide: PortalMessageService, useValue: msgServiceSpy }, + { provide: PortalInternalAPIService, useValue: apiServiceSpy } + ] + }).compileComponents() + msgServiceSpy.success.calls.reset() + msgServiceSpy.error.calls.reset() + apiServiceSpy.portalImportRequest.calls.reset() + translateServiceSpy.get.calls.reset() + })) + + beforeEach(() => { + fixture = TestBed.createComponent(ChooseFileComponent) + component = fixture.componentInstance + fixture.detectChanges() + }) + + it('should create', () => { + expect(component).toBeTruthy() + }) + + it('should call toggleImportDialogEvent onClose', () => { + spyOn(component.importFileSelected, 'emit') + const portal = { + portal: { + portalName: 'name', + tenantId: '', + microfrontendRegistrations: new Set([{ version: 1 }]) + } + } + component.importRequestDTO = portal + + component.uploadHandler() + + expect(component.importFileSelected.emit).toHaveBeenCalledOnceWith(component.importRequestDTO) + }) + + it('should select a file onSelect, get translations and set importDTO', (done) => { + translateServiceSpy.get.and.returnValue(of({})) + const file = new File(['file content'], 'test.txt', { type: 'text/plain' }) + const fileList: FileList = { + 0: file, + length: 1, + item: (index: number) => file + } + spyOn(file, 'text').and.returnValue( + Promise.resolve( + '{"portal": {"portalName": "name", "portalRoles": ["role"], "tenantId": "id",\ + "microfrontendRegistrations": [{"version": "1"}]},\ + "menuItems": [{"name": "menu", "key": "key", "position": 1, "disabled": true, "portalExit": true}]}' + ) + ) + const event = { files: fileList } + const portal = { + portal: { + portalName: 'name', + portalRoles: ['role'], + tenantId: 'id', + microfrontendRegistrations: new Set([{ version: 1 }]) + }, + menuItems: [{ name: 'menu', key: 'key', position: 1, disabled: true, portalExit: true }] + } + component.importRequestDTO = portal + + component.onSelect(event) + + setTimeout(() => { + expect(file.text).toHaveBeenCalled() + done() + }) + expect(component.importRequestDTO).toEqual(portal) + }) + + it('should catch an import error', fakeAsync(() => { + translateServiceSpy.get.and.returnValue(throwError(() => new Error())) + + const file = new File(['file content'], 'test.txt', { type: 'text/plain' }) + const fileList: FileList = { + 0: file, + length: 1, + item: (index: number) => file + } + spyOn(file, 'text').and.returnValue(Promise.resolve('{"portal"}')) + const event = { files: fileList } + + component.onSelect(event) + + tick() + + expect(component.importError).toBeTrue() + })) + + it('should behave correctly onClear', () => { + component.onClear() + + expect(component.importRequestDTO).toBeNull() + expect(component.importError).toBeFalse() + expect(component.validationErrorCause).toEqual('') + }) + + it('should validate a request DTO: missing portal error', () => { + const obj = { + menuItems: [{ name: 'menu', key: 'key', position: 1, disabled: true, portalExit: true }] + } + const data = { 'PORTAL_IMPORT.VALIDATION_PORTAL_MISSING': 'missing' } + + ;(component as any).isPortalImportRequestDTO(obj, data) + + expect(component.validationErrorCause).toEqual('undefinedmissing') + }) + + it('should validate a request DTO: missing portal name error', () => { + const obj = { + portal: { + portalRoles: ['role'], + microfrontendRegistrations: new Set([{ version: 1 }]) + }, + menuItems: [{ name: 'menu', key: 'key', position: 1, disabled: true, portalExit: true }] + } + const data = { 'PORTAL_IMPORT.VALIDATION_PORTAL_NAME_MISSING': 'name missing' } + + ;(component as any).isPortalImportRequestDTO(obj, data) + + expect(component.validationErrorCause).toEqual('undefinedname missing') + }) + + it('should validate a request DTO: missing roles error', () => { + const obj = { + portal: { + portalName: ['name'], + microfrontendRegistrations: new Set([{ version: 1 }]) + }, + menuItems: [{ name: 'menu', key: 'key', position: 1, disabled: true, portalExit: true }] + } + const data = { 'PORTAL_IMPORT.VALIDATION_PORTAL_ROLES_MISSING': 'roles missing' } + + ;(component as any).isPortalImportRequestDTO(obj, data) + + expect(component.validationErrorCause).toEqual('undefinedroles missing') + }) + + it('should validate a request DTO: missing theme name error', () => { + const obj = { + portal: { + portalName: ['name'], + portalRoles: ['role'], + microfrontendRegistrations: new Set([{ version: 1 }]) + }, + menuItems: [{ name: 'menu', key: 'key', position: 1, disabled: true, portalExit: true }], + themeImportData: { name: '' } + } + const data = { 'PORTAL_IMPORT.VALIDATION_THEME_NAME_MISSING': 'theme name missing' } + + ;(component as any).isPortalImportRequestDTO(obj, data) + + expect(component.validationErrorCause).toEqual('undefinedtheme name missing') + }) + + it('should validate a request DTO: missing menu item key error', () => { + const obj = { + portal: { + portalName: ['name'], + portalRoles: ['role'], + microfrontendRegistrations: new Set([{ version: 1 }]) + }, + menuItems: [{ name: 'menu', position: 1, disabled: true, portalExit: true }] + } + const data = { 'PORTAL_IMPORT.VALIDATION_MENU_ITEM_KEY_MISSING': 'menu item key missing' } + + ;(component as any).isPortalImportRequestDTO(obj, data) + + expect(component.validationErrorCause).toEqual('undefinedmenu item key missing') + }) + + it('should validate a request DTO: missing menu item name error', () => { + const obj = { + portal: { + portalName: ['name'], + portalRoles: ['role'], + microfrontendRegistrations: new Set([{ version: 1 }]) + }, + menuItems: [{ key: 'menu', position: 1, disabled: true, portalExit: true }] + } + const data = { 'PORTAL_IMPORT.VALIDATION_MENU_ITEM_NAME_MISSING': 'menu item name missing' } + + ;(component as any).isPortalImportRequestDTO(obj, data) + + expect(component.validationErrorCause).toEqual('undefinedmenu item name missing') + }) + + it('should validate a request DTO: wrong position error', () => { + const obj = { + portal: { + portalName: ['name'], + portalRoles: ['role'], + microfrontendRegistrations: new Set([{ version: 1 }]) + }, + menuItems: [{ name: 'menu', key: 'key', position: 'one', disabled: true, portalExit: true }] + } + const data = { 'PORTAL_IMPORT.VALIDATION_MENU_ITEM_WRONG_POSITION': 'wrong position' } + + ;(component as any).isPortalImportRequestDTO(obj, data) + + expect(component.validationErrorCause).toEqual('undefinedwrong position') + }) + + it('should validate a request DTO: wrong disabled error', () => { + const obj = { + portal: { + portalName: ['name'], + portalRoles: ['role'], + microfrontendRegistrations: new Set([{ version: 1 }]) + }, + menuItems: [{ name: 'menu', key: 'key', position: 1, disabled: 'true', portalExit: true }] + } + const data = { 'PORTAL_IMPORT.VALIDATION_MENU_ITEM_WRONG_DISABLED': 'wrong disabled' } + + ;(component as any).isPortalImportRequestDTO(obj, data) + + expect(component.validationErrorCause).toEqual('undefinedwrong disabled') + }) + + it('should validate a request DTO: wrong portal exit error', () => { + const obj = { + portal: { + portalName: ['name'], + portalRoles: ['role'], + microfrontendRegistrations: new Set([{ version: 1 }]) + }, + menuItems: [{ name: 'menu', key: 'key', position: 1, disabled: true, portalExit: 'true' }] + } + const data = { 'PORTAL_IMPORT.VALIDATION_MENU_ITEM_WRONG_PORTALEXIT': 'wrong portal exit' } + + ;(component as any).isPortalImportRequestDTO(obj, data) + + expect(component.validationErrorCause).toEqual('undefinedwrong portal exit') + }) + + it('should validate a request DTO: menu absent error', () => { + const obj = { + portal: { + portalName: ['name'], + portalRoles: ['role'], + microfrontendRegistrations: new Set([{ version: 1 }]) + } + } + const data = { 'PORTAL_IMPORT.VALIDATION_MENU_NOT_EXIST': 'menu absent' } + + ;(component as any).isPortalImportRequestDTO(obj, data) + + expect(component.validationErrorCause).toEqual('undefinedmenu absent') + }) +}) diff --git a/src/app/workspace/workspace-import/choose-file/choose-file.component.ts b/src/app/workspace/workspace-import/choose-file/choose-file.component.ts new file mode 100644 index 00000000..410c8d8a --- /dev/null +++ b/src/app/workspace/workspace-import/choose-file/choose-file.component.ts @@ -0,0 +1,152 @@ +import { Component, EventEmitter, OnInit, Output } from '@angular/core' +import { HttpHeaders } from '@angular/common/http' +import { TranslateService } from '@ngx-translate/core' +import { WorkspaceSnapshot, EximWorkspaceMenuItem } from '../../../shared/generated' +// import { ColumnGroupSelectionComponent } from '@onecx/portal-integration-angular' + +@Component({ + selector: 'app-import-choose-file', + templateUrl: './choose-file.component.html', + styleUrls: ['./choose-file.component.scss'] +}) +export class ChooseFileComponent implements OnInit { + @Output() public importFileSelected = new EventEmitter() + + importWorkspace: WorkspaceSnapshot | null = null + + public httpHeaders!: HttpHeaders + public reader = new FileReader() + public importError = false + public validationErrorCause: string + + constructor(private readonly translate: TranslateService) { + this.validationErrorCause = '' + } + + public ngOnInit(): void { + this.validationErrorCause = '' + this.httpHeaders = new HttpHeaders() + this.httpHeaders.set('Content-Type', 'application/json') + } + + public uploadHandler(): void { + if (this.importWorkspace) this.importFileSelected.emit(this.importWorkspace) + } + + public onSelect(event: { files: FileList }): void { + event.files[0].text().then((text) => { + this.importWorkspace = null + this.importError = false + this.validationErrorCause = '' + + this.translate + .get([ + 'PORTAL_IMPORT.VALIDATION_PORTAL_MISSING', + 'PORTAL_IMPORT.VALIDATION_PORTAL_NAME_MISSING', + 'PORTAL_IMPORT.VALIDATION_PORTAL_ROLES_MISSING', + 'PORTAL_IMPORT.VALIDATION_THEME_NAME_MISSING', + 'PORTAL_IMPORT.VALIDATION_MENU_ITEM_KEY_MISSING', + 'PORTAL_IMPORT.VALIDATION_MENU_ITEM_NAME_MISSING', + 'PORTAL_IMPORT.VALIDATION_MENU_ITEM_WRONG_POSITION', + 'PORTAL_IMPORT.VALIDATION_MENU_ITEM_WRONG_DISABLED', + 'PORTAL_IMPORT.VALIDATION_MENU_ITEM_WRONG_PORTALEXIT', + 'PORTAL_IMPORT.VALIDATION_MENU_NOT_EXIST', + 'PORTAL_IMPORT.VALIDATION_RESULT', + 'PORTAL_IMPORT.VALIDATION_JSON_ERROR' + ]) + .subscribe((data) => { + try { + const importWorkspace = JSON.parse(text) + if (this.isPortalImportWorkspace(importWorkspace, data)) { + this.importWorkspace = importWorkspace + } + } catch (err) { + console.error('Import Error' /* , err */) + this.importError = true + this.validationErrorCause = + data['PORTAL_IMPORT.VALIDATION_RESULT'] + data['PORTAL_IMPORT.VALIDATION_JSON_ERROR'] + } + }) + }) + } + + public onClear(): void { + this.importWorkspace = null + this.importError = false + this.validationErrorCause = '' + } + + public isFileValid(): boolean { + return !this.importError && !!this.importWorkspace + } + + private isPortalImportWorkspace(obj: unknown, data: any): obj is WorkspaceSnapshot { + const dto = obj as WorkspaceSnapshot + // CHANGE WHEN IMPORT OF MORE WORKSPACES IS POSSIBLE + let key: string[] = [] + if (dto.workspaces) { + key = Object.keys(dto.workspaces) + } + // console.log('NAME', dto.workspaces.keys[0]) + // const themeCondition = dto.workspaces.keys[0].themeImportData ? dto.workspaces.keys[0].themeImportData.name : true + + if (dto.workspaces) { + if (!dto || !dto.workspaces[key[0]]) { + this.validationErrorCause = data['PORTAL_IMPORT.VALIDATION_PORTAL_MISSING'] + } else if (!dto.workspaces[key[0]].name) { + this.validationErrorCause = data['PORTAL_IMPORT.VALIDATION_PORTAL_NAME_MISSING'] + /* } else if (!dto.workspaces[key[0]].workspaceRoles) { + this.validationErrorCause = data['PORTAL_IMPORT.VALIDATION_PORTAL_ROLES_MISSING'] */ + } /* else if (!themeCondition) { + this.validationErrorCause = data['PORTAL_IMPORT.VALIDATION_THEME_NAME_MISSING'] + } */ else if (dto.workspaces[key[0]].menu?.menu?.menuItems) { + for (const el of dto.workspaces[key[0]].menu?.menu?.menuItems!) { + if (!el.key) { + this.validationErrorCause = data['PORTAL_IMPORT.VALIDATION_MENU_ITEM_KEY_MISSING'] + break + } else if (!el.name) { + this.validationErrorCause = data['PORTAL_IMPORT.VALIDATION_MENU_ITEM_NAME_MISSING'] + break + } else if (!(typeof el.position === 'number')) { + this.validationErrorCause = data['PORTAL_IMPORT.VALIDATION_MENU_ITEM_WRONG_POSITION'] + break + } else if (!(typeof el.disabled === 'boolean')) { + this.validationErrorCause = data['PORTAL_IMPORT.VALIDATION_MENU_ITEM_WRONG_DISABLED'] + break + } else if (!(typeof el.workspaceExit === 'boolean')) { + this.validationErrorCause = data['PORTAL_IMPORT.VALIDATION_MENU_ITEM_WRONG_PORTALEXIT'] + break + } + } + } /* else { + this.validationErrorCause = data['PORTAL_IMPORT.VALIDATION_MENU_NOT_EXIST'] + } */ + } + if (this.validationErrorCause !== '') { + this.importError = true + this.validationErrorCause = data['PORTAL_IMPORT.VALIDATION_RESULT'] + this.validationErrorCause + } + + return !!( + typeof dto === 'object' && + dto && + dto.workspaces && + dto.workspaces[key[0]].name && + dto.workspaces[key[0]].workspaceRoles + ) /* && + dto.workspaces[key[0]].menu?.menu?.menuItems?.every?.(this.isMenuItem) */ + /* && + themeCondition */ + } + + private isMenuItem(obj: unknown): obj is EximWorkspaceMenuItem { + const dto = obj as EximWorkspaceMenuItem + return !!( + dto.key && + dto.name && + typeof dto.position === 'number' && + typeof dto.disabled === 'boolean' && + typeof dto.workspaceExit === 'boolean' + ) + } +} diff --git a/src/app/workspace/workspace-import/confirm/confirm.component.html b/src/app/workspace/workspace-import/confirm/confirm.component.html new file mode 100644 index 00000000..dd10ce4a --- /dev/null +++ b/src/app/workspace/workspace-import/confirm/confirm.component.html @@ -0,0 +1,76 @@ +
+
+ + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + +
+
+ + +
+
diff --git a/src/app/workspace/workspace-import/confirm/confirm.component.scss b/src/app/workspace/workspace-import/confirm/confirm.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/workspace/workspace-import/confirm/confirm.component.spec.ts b/src/app/workspace/workspace-import/confirm/confirm.component.spec.ts new file mode 100644 index 00000000..f7d81fba --- /dev/null +++ b/src/app/workspace/workspace-import/confirm/confirm.component.spec.ts @@ -0,0 +1,131 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core' +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' +import { HttpClient } from '@angular/common/http' +import { HttpClientTestingModule } from '@angular/common/http/testing' +import { TranslateLoader, TranslateModule } from '@ngx-translate/core' +import { of } from 'rxjs' + +import { HttpLoaderFactory } from 'src/app/shared/shared.module' +import { ConfirmComponent } from './confirm.component' +import { PortalInternalAPIService, ThemesAPIService } from '../../../shared/generated' + +const portal = { + portalName: 'name', + portalRoles: ['role'], + themeName: 'theme', + baseUrl: 'url', + tenantId: 'id' +} + +describe('ConfirmComponent', () => { + let component: ConfirmComponent + let fixture: ComponentFixture + + const apiServiceSpy = { + getAllPortals: jasmine.createSpy('getAllPortals').and.returnValue(of({})) + } + const themeServiceSpy = jasmine.createSpyObj('ThemeService', ['getThemes']) + themeServiceSpy.getThemes.and.returnValue( + of([ + { label: undefined, value: 'theme1' }, + { label: undefined, value: 'theme2' } + ]) + ) + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ConfirmComponent], + imports: [ + HttpClientTestingModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }) + ], + schemas: [NO_ERRORS_SCHEMA], + providers: [ + { provide: PortalInternalAPIService, useValue: apiServiceSpy }, + { provide: ThemesAPIService, useValue: themeServiceSpy } + ] + }).compileComponents() + + apiServiceSpy.getAllPortals.calls.reset() + })) + + beforeEach(() => { + fixture = TestBed.createComponent(ConfirmComponent) + component = fixture.componentInstance + fixture.detectChanges() + }) + + it('should create', () => { + expect(component).toBeTruthy() + }) + + it('should reflect missing baseUrl and fetch portals OnInit', () => { + apiServiceSpy.getAllPortals.and.returnValue(of([])) + component.baseUrl = '' + spyOn(component, 'checkPortalUniqueness') + + component.ngOnInit() + + expect(component.checkPortalUniqueness).toHaveBeenCalled() + expect(component.baseUrlIsMissing).toBeTrue() + }) + + it('should also fetch themes OnInit if themeName exists', () => { + apiServiceSpy.getAllPortals.and.returnValue(of([])) + themeServiceSpy.getThemes.and.returnValue(of([])) + spyOn(component, 'checkThemeNames') + component.themeName = 'name' + + component.ngOnInit() + + expect(component.checkThemeNames).toHaveBeenCalled() + }) + + it('should set portalTenantExists to true in checkPortalUniqueness onInit if permission', () => { + apiServiceSpy.getAllPortals.and.returnValue(of([portal])) + component.hasPermission = true + component.portalName = 'name' + component.tenantId = 'id' + + component.ngOnInit() + + expect(component.portalTenantExists).toBeTrue() + }) + + it('should set portalNameExists to true in checkPortalUniqueness onInit if no permission', () => { + apiServiceSpy.getAllPortals.and.returnValue(of([portal])) + component.hasPermission = false + component.portalName = 'name' + + component.ngOnInit() + + expect(component.portalNameExists).toBeTrue() + }) + + it('should set baseUrlExists to true in checkPortalUniqueness onInit', () => { + apiServiceSpy.getAllPortals.and.returnValue(of([portal])) + component.baseUrl = 'url' + component.baseUrlIsMissing = false + + component.ngOnInit() + + expect(component.baseUrlExists).toBeTrue() + }) + + it('should set themeNameExists to true in checkPortalUniqueness onInit', () => { + apiServiceSpy.getAllPortals.and.returnValue(of([portal])) + themeServiceSpy.getThemes.and.returnValue(of([{ name: 'theme' }])) + component.hasPermission = false + component.themeName = 'theme' + + component.ngOnInit() + + expect(component.themeNameExists).toBeTrue() + }) +}) diff --git a/src/app/workspace/workspace-import/confirm/confirm.component.ts b/src/app/workspace/workspace-import/confirm/confirm.component.ts new file mode 100644 index 00000000..5b7430ac --- /dev/null +++ b/src/app/workspace/workspace-import/confirm/confirm.component.ts @@ -0,0 +1,80 @@ +import { Component, EventEmitter, Input, Output, OnInit } from '@angular/core' +import { + /* ThemeDTO, ThemesAPIService, */ WorkspaceAPIService, + SearchWorkspacesResponse, + WorkspaceAbstract +} from '../../../shared/generated' + +@Component({ + selector: 'app-import-confirm', + templateUrl: './confirm.component.html', + styleUrls: ['./confirm.component.scss'] +}) +export class ConfirmComponent implements OnInit { + @Input() public portalName?: string + @Input() public themeName?: string + @Input() public themeProperties?: any + @Input() public importThemeCheckbox = false + @Input() public tenantId?: string | undefined + @Input() public hasPermission = false + @Input() public baseUrl?: string + @Output() public isLoading = new EventEmitter(true) + + private portals!: WorkspaceAbstract[] | undefined + // private themes!: ThemeDTO[] + public portalNameExists = false + public themeNameExists = false + public baseUrlExists = false + public baseUrlIsMissing = false + public portalTenantExists = false + + constructor(private readonly workspaceApi: WorkspaceAPIService /* , private readonly themeAPI: ThemesAPIService */) {} + + public ngOnInit(): void { + this.baseUrlIsMissing = this.baseUrl === undefined || this.baseUrl.length === 0 + this.fetchPortalsAndThemes() + } + + private fetchPortalsAndThemes(): void { + this.workspaceApi.searchWorkspaces({ searchWorkspacesRequest: {} }).subscribe((value: SearchWorkspacesResponse) => { + this.portals = value.stream + this.checkPortalUniqueness() + if (this.themeName) { + /* this.themeAPI.getThemes().subscribe((themes: any) => { + this.themes = themes + this.checkThemeNames() + this.isLoading.emit(false) + }) */ + } else this.isLoading.emit(false) + }) + } + + public checkPortalUniqueness(): void { + this.portalNameExists = false + this.baseUrlExists = false + if (this.portals) { + for (const { name, /* tenantId, */ baseUrl } of this.portals) { + if (this.hasPermission) { + /* if ((tenantId ?? undefined) === this.tenantId && name === this.portalName) { + this.portalTenantExists = true + } */ + } else if (this.portalName === name) { + this.portalNameExists = true + } + if (!this.baseUrlIsMissing && baseUrl === this.baseUrl) { + this.baseUrlExists = true + } + } + } + } + + public checkThemeNames(): void { + /* this.themeNameExists = false + for (const { name } of this.themes) { + if (name === this.themeName) { + this.themeNameExists = true + break + } + } */ + } +} diff --git a/src/app/workspace/workspace-import/preview/preview.component.html b/src/app/workspace/workspace-import/preview/preview.component.html new file mode 100644 index 00000000..afe4f38d --- /dev/null +++ b/src/app/workspace/workspace-import/preview/preview.component.html @@ -0,0 +1,112 @@ +
+
+
+
+ + + + +
+ + + +
+ +
+ + + + +
+ + + + + + +
+
{{ 'DETAIL.ROLES_NOT_EXIST' | translate }}
+
{{ portalRoles.join(', ') }}
+
+
+ +
+
+
diff --git a/src/app/workspace/workspace-import/preview/preview.component.scss b/src/app/workspace/workspace-import/preview/preview.component.scss new file mode 100644 index 00000000..305b2df7 --- /dev/null +++ b/src/app/workspace/workspace-import/preview/preview.component.scss @@ -0,0 +1,13 @@ +:host ::ng-deep { + .p-tree { + border: unset; + .p-tree-container .p-treenode .p-treenode-content { + padding: 0 0 !important; + .p-tree-toggler { + width: unset; + height: unset; + margin-right: 0.2rem; + } + } + } +} diff --git a/src/app/workspace/workspace-import/preview/preview.component.spec.ts b/src/app/workspace/workspace-import/preview/preview.component.spec.ts new file mode 100644 index 00000000..347dba8b --- /dev/null +++ b/src/app/workspace/workspace-import/preview/preview.component.spec.ts @@ -0,0 +1,175 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core' +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' +import { HttpClient } from '@angular/common/http' +import { HttpClientTestingModule } from '@angular/common/http/testing' +import { TranslateLoader, TranslateModule } from '@ngx-translate/core' +import { of } from 'rxjs' + +import { HttpLoaderFactory } from 'src/app/shared/shared.module' +import { PreviewComponent } from './preview.component' +import { ThemesAPIService } from '../../../shared/generated' + +describe('PreviewComponent', () => { + let component: PreviewComponent + let fixture: ComponentFixture + + const themeServiceSpy = jasmine.createSpyObj('ThemeService', ['getThemes']) + themeServiceSpy.getThemes.and.returnValue( + of([ + { label: undefined, value: 'theme1' }, + { label: undefined, value: 'theme2' } + ]) + ) + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [PreviewComponent], + imports: [ + HttpClientTestingModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }) + ], + schemas: [NO_ERRORS_SCHEMA], + providers: [{ provide: ThemesAPIService, useValue: themeServiceSpy }] + }).compileComponents() + themeServiceSpy.getThemes.calls.reset() + })) + + beforeEach(() => { + fixture = TestBed.createComponent(PreviewComponent) + component = fixture.componentInstance + const portal = { + portal: { + portalName: 'name', + portalRoles: ['role'], + themeName: 'theme', + baseUrl: 'url', + tenantId: 'id', + microfrontendRegistrations: new Set([{ version: 1 }]) + }, + menuItems: [{ name: 'menu', key: 'key', position: 1, disabled: true, portalExit: true }] + } + component.importRequestDTO = portal + fixture.detectChanges() + }) + + it('should create', () => { + expect(component).toBeTruthy() + }) + + it('should get themeNames from service', (done) => { + themeServiceSpy.getThemes + + component.themes$.subscribe((themes) => { + expect(themes).toEqual([ + { label: undefined, value: '' }, + { label: undefined, value: '' } + ]) + done() + }) + }) + + it('should fillForm, addValidators to formGroup and call onModelChange OnChanges: import theme checkbox disabled', () => { + spyOn(component, 'fillForm') + spyOn(component, 'onModelChange') + + component.ngOnChanges() + + expect(component.fillForm).toHaveBeenCalled() + expect(component.onModelChange).toHaveBeenCalled() + }) + + it('should fillForm, addValidators to formGroup and call onModelChange OnChanges: import theme checkbox enabled', () => { + spyOn(component, 'fillForm') + spyOn(component, 'onModelChange') + component.importThemeCheckbox = true + + component.ngOnChanges() + + expect(component.formGroup.controls['themeName'].validator).toBeDefined() + expect(component.fillForm).toHaveBeenCalled() + expect(component.onModelChange).toHaveBeenCalled() + }) + + it('should fillForm correctly', () => { + component.hasPermission = true + component.fillForm() + + expect(component.formGroup.controls['portalName'].value).toEqual(component.importRequestDTO?.portal?.portalName) + expect(component.formGroup.controls['themeName'].value).toEqual(component.importRequestDTO?.portal?.themeName) + expect(component.formGroup.controls['baseUrl'].value).toEqual(component.importRequestDTO?.portal?.baseUrl) + expect(component.formGroup.controls['tenantId'].value).toEqual(component.importRequestDTO?.portal?.tenantId) + }) + + it('should change values onModelChange', () => { + component.hasPermission = true + component.formGroup.controls['tenantId'].setValue('new id') + + component.onModelChange() + + expect(component.tenantId).toEqual(component.importRequestDTO?.portal?.tenantId) + expect(component.formGroup.controls['tenantId'].value).toEqual(component.importRequestDTO?.portal?.tenantId) + }) + + it('should behave correctly onThemeChange', () => { + spyOn(component, 'onModelChange') + const event = { value: 'theme' } + + component.onThemeChange(event) + + expect(component.onModelChange).toHaveBeenCalled() + expect(component.themeName).toEqual('theme') + }) + + it('should map menuItems to tree nodes: standard case', () => { + component.ngOnInit() + + if (component.importRequestDTO?.menuItems) { + expect(component.menuItems).toContain({ label: 'menu', expanded: false, key: 'key', leaf: true, children: [] }) + } + }) + + it('should map menuItems to tree nodes: empty case', () => { + component.importRequestDTO.menuItems = undefined + + component.ngOnInit() + + expect(component.menuItems).toEqual([]) + }) + + it('should map menuItems to tree nodes: recursion case', () => { + component.importRequestDTO.menuItems = [ + { + name: 'menu', + key: 'key', + position: 1, + disabled: true, + portalExit: true, + children: [{ name: 'menu', key: 'key', position: 2, disabled: true, portalExit: true }] + } + ] + + component.ngOnInit() + + if (component.importRequestDTO?.menuItems) { + expect(component.menuItems).toContain({ + label: 'menu', + expanded: false, + key: 'key', + leaf: false, + children: [ + jasmine.objectContaining({ + label: 'menu', + key: 'key', + leaf: true + }) + ] + }) + } + }) +}) diff --git a/src/app/workspace/workspace-import/preview/preview.component.ts b/src/app/workspace/workspace-import/preview/preview.component.ts new file mode 100644 index 00000000..e9551fd6 --- /dev/null +++ b/src/app/workspace/workspace-import/preview/preview.component.ts @@ -0,0 +1,168 @@ +import { Component, Input, OnInit, Output, EventEmitter, OnChanges } from '@angular/core' +import { FormControl, FormGroup, Validators } from '@angular/forms' +import { TreeNode, SelectItem } from 'primeng/api' +import { /* first, map, */ Observable, of } from 'rxjs' + +import { + EximWorkspaceMenuItem, + WorkspaceSnapshot + // MicrofrontendRegistrationDTO + // ThemesAPIService +} from '../../../shared/generated' +import { forceFormValidation /* , sortThemeByName */ } from '../../../shared/utils' + +@Component({ + selector: 'app-import-preview', + templateUrl: './preview.component.html', + styleUrls: ['./preview.component.scss'] +}) +export class PreviewComponent implements OnInit, OnChanges { + @Input() public importRequestDTO!: WorkspaceSnapshot + @Input() public importThemeCheckbox = false + @Input() public hasPermission = false + @Output() public isFormValide = new EventEmitter() + + public formGroup!: FormGroup + public themes$: Observable[]> = of([]) + public portalName = '' + public themeName!: string + public baseUrl = '' + public tenantId: string | undefined = undefined + public themeProperties: any = null + public menuItems: TreeNode[] = [] + // public portalMfes = new Array() + public portalRoles = new Array() + + constructor(/* private themeApi: ThemesAPIService */) { + this.formGroup = new FormGroup({ + portalName: new FormControl(null, [Validators.required, Validators.minLength(2), Validators.maxLength(50)]), + // themeName: new FormControl( + // null, + // !this.importThemeCheckbox ? [Validators.required, Validators.minLength(2), Validators.maxLength(50)] : [] + // ), + baseUrl: new FormControl(null, [Validators.required, Validators.minLength(2), Validators.maxLength(100)]) + // tenantId: new FormControl(undefined) + }) + + /* this.themes$ = this.themeApi + .getThemes() + .pipe(map((val) => val.sort(sortThemeByName).map((theme) => ({ label: theme.name, value: theme.name || '' })))) */ + } + + public ngOnInit(): void { + let key: string[] = [] + if (this.importRequestDTO.workspaces) { + key = Object.keys(this.importRequestDTO.workspaces) + } + if (this.importRequestDTO.workspaces) { + this.portalName = this.importRequestDTO.workspaces[key[0]].name || '' + // this.themeName = this.importRequestDTO?.themeImportData?.name + // ? this.importRequestDTO?.themeImportData?.name + // : this.formGroup.controls['themeName'].value || '' + this.baseUrl = this.importRequestDTO.workspaces[key[0]].baseUrl || '' + // this.tenantId = this.importRequestDTO?.tenantId || undefined + this.menuItems = this.mapToTreeNodes(this.importRequestDTO.workspaces[key[0]].menu?.menu?.menuItems) + // this.themeProperties = this.importRequestDTO?.themeImportData?.properties + // check mfe existence + // if (this.importRequestDTO.portal.microfrontendRegistrations) { + // this.portalMfes = Array.from(this.importRequestDTO.portal.microfrontendRegistrations) + // } + if (this.importRequestDTO.workspaces[key[0]].workspaceRoles) { + this.portalRoles = Array.from(this.importRequestDTO.workspaces[key[0]].workspaceRoles!) + } + } + // error handling if no theme name or no match with existing themes + /* this.themes$.pipe(first()).subscribe((themes) => { + if (themes.length > 0) { + const matchingTheme = themes.find((theme) => theme.value === this.themeName) + if (!this.themeName || !matchingTheme) { + const firstTheme = themes[0] + this.themeName = firstTheme.value + } + this.formGroup.controls['themeName'].setValue(this.themeName) + this.onModelChange() + } + }) */ + } + + public ngOnChanges(): void { + this.fillForm() + // if (this.importThemeCheckbox) { + // this.formGroup.controls['themeName'].addValidators([ + // Validators.required, + // Validators.minLength(2), + // Validators.maxLength(50) + // ]) + // } else { + // this.formGroup.controls['themeName'].clearValidators() + // } + // trigger validation to be up-to-date + forceFormValidation(this.formGroup) + this.onModelChange() + } + + public fillForm(): void { + let key: string[] = [] + if (this.importRequestDTO.workspaces) { + key = Object.keys(this.importRequestDTO.workspaces) + } + if (this.importRequestDTO.workspaces) { + this.formGroup.controls['portalName'].setValue(this.importRequestDTO?.workspaces[key[0]].name) + // this.formGroup.controls['themeName'].setValue(this.importRequestDTO?.themeName) + this.formGroup.controls['baseUrl'].setValue(this.importRequestDTO?.workspaces[key[0]].baseUrl) + // if (this.hasPermission && this.importRequestDTO?.portal?.tenantId != undefined) + // this.formGroup.controls['tenantId'].setValue(this.importRequestDTO?.portal?.tenantId) + } + } + + public onModelChange(): void { + let key: string[] = [] + if (this.importRequestDTO.workspaces) { + key = Object.keys(this.importRequestDTO.workspaces) + } + this.portalName = this.formGroup.controls['portalName'].value + // this.themeName = this.formGroup.controls['themeName'].value + this.baseUrl = this.formGroup.controls['baseUrl'].value + // if (this.hasPermission && this.formGroup.controls['tenantId'].value !== undefined) + // this.tenantId = this.formGroup.controls['tenantId'].value + if (this.importRequestDTO.workspaces) { + this.importRequestDTO.workspaces[key[0]].name = this.portalName + // this.importRequestDTO.portal.themeName = this.themeName + this.importRequestDTO.workspaces[key[0]].baseUrl = this.baseUrl + // if (this.hasPermission) this.importRequestDTO.portal.tenantId = this.tenantId + } + this.isFormValide.emit(this.formGroup.valid) + } + + public onThemeChange(event: any): void { + this.themeName = event.value + this.onModelChange() + } + + private mapToTreeNodes(items?: EximWorkspaceMenuItem[]): TreeNode[] { + if (!items || items.length === 0) { + return [] + } + const results: TreeNode[] = [] + items.sort((a, b) => (a.position || 0) - (b.position || 0)) + for (const item of items) { + const newNode: TreeNode = this.createTreeNode(item) + if (item.children && item.children.length > 0 && item.children != null && item.children.toLocaleString() != '') { + newNode.leaf = false + newNode.children = this.mapToTreeNodes(item.children) + } + results.push(newNode) + } + return results + } + + private createTreeNode(item: EximWorkspaceMenuItem): TreeNode { + return { + label: item.name, + expanded: false, + key: item.key, + leaf: true, + children: [] + } + } +} diff --git a/src/app/workspace/workspace-import/workspace-import.component.html b/src/app/workspace/workspace-import/workspace-import.component.html new file mode 100644 index 00000000..ed3d1615 --- /dev/null +++ b/src/app/workspace/workspace-import/workspace-import.component.html @@ -0,0 +1,94 @@ +
+ + +
+ + +
+ +
+ + + +
+ +
+ + + + + +
+
+ +
+ +
diff --git a/src/app/workspace/workspace-import/workspace-import.component.scss b/src/app/workspace/workspace-import/workspace-import.component.scss new file mode 100644 index 00000000..61ed23e5 --- /dev/null +++ b/src/app/workspace/workspace-import/workspace-import.component.scss @@ -0,0 +1,16 @@ +:host ::ng-deep { + .p-steps ul { + flex-wrap: wrap; + gap: 0.2rem; + } + .p-fileupload-buttonbar { + display: flex; + flex-wrap: wrap; + row-gap: 0.5rem; + } + @media only screen and (max-width: 400px) { + .p-steps .p-steps-item { + margin: 0.3rem 0; + } + } +} diff --git a/src/app/workspace/workspace-import/workspace-import.component.spec.ts b/src/app/workspace/workspace-import/workspace-import.component.spec.ts new file mode 100644 index 00000000..1f56d162 --- /dev/null +++ b/src/app/workspace/workspace-import/workspace-import.component.spec.ts @@ -0,0 +1,396 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core' +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' +import { HttpClient } from '@angular/common/http' +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing' +import { Router } from '@angular/router' +import { ActivatedRoute } from '@angular/router' +import { TranslateLoader, TranslateModule } from '@ngx-translate/core' +import { of, throwError } from 'rxjs' + +import { AUTH_SERVICE, PortalMessageService } from '@onecx/portal-integration-angular' +import { HttpLoaderFactory } from 'src/app/shared/shared.module' +import { WorkspaceImportComponent } from './workspace-import.component' +import { ConfirmComponent } from './confirm/confirm.component' +import { PortalInternalAPIService, MenuItemStructureDTOv1, ImportRequestDTOv1 } from '../../shared/generated' +import { PreviewComponent } from './preview/preview.component' + +class MockRouter { + navigate = jasmine.createSpy('navigate') +} + +class MockConfirmComponent { + public portalName = 'portal name' + public themeName = 'theme name' + public baseUrl = 'base url' + public tenantId = 'tenant id' + public portalNameExists = false + public themeNameExists = false + public baseUrlExists = false + public baseUrlIsMissing = false + public portalTenantExists = false + public importThemeCheckbox = false + public hasPermission = false +} + +class MockPreviewComponent { + public portalName = 'portal name' + public themeName = 'theme name' + public baseUrl = 'base url' + public tenantId = 'tenant id' +} + +describe('WorkspaceImportComponent', () => { + let component: WorkspaceImportComponent + let fixture: ComponentFixture + let httpTestingController: HttpTestingController + let mockActivatedRoute: ActivatedRoute + let mockRouter = new MockRouter() + const mockAuthService = jasmine.createSpyObj('IAuthService', ['hasPermission']) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + let mockWindow: any + + const msgServiceSpy = jasmine.createSpyObj('PortalMessageService', ['success', 'error']) + const apiServiceSpy = { + portalImportRequest: jasmine.createSpy('portalImportRequest').and.returnValue(of({})) + } + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [WorkspaceImportComponent], + imports: [ + HttpClientTestingModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }) + ], + schemas: [NO_ERRORS_SCHEMA], + providers: [ + { provide: ActivatedRoute, useValue: mockActivatedRoute }, + { provide: Router, useValue: mockRouter }, + { provide: PortalMessageService, useValue: msgServiceSpy }, + { provide: PortalInternalAPIService, useValue: apiServiceSpy }, + { provide: AUTH_SERVICE, useValue: mockAuthService } + ] + }).compileComponents() + msgServiceSpy.success.calls.reset() + msgServiceSpy.error.calls.reset() + apiServiceSpy.portalImportRequest.calls.reset() + })) + + beforeEach(() => { + fixture = TestBed.createComponent(WorkspaceImportComponent) + component = fixture.componentInstance + fixture.detectChanges() + httpTestingController = TestBed.inject(HttpTestingController) + }) + + it('should create', () => { + expect(component).toBeTruthy() + }) + + it('should call reset OnChanges', () => { + spyOn(component, 'reset') + + component.ngOnChanges() + + expect(component.reset).toHaveBeenCalled() + }) + + it('should call toggleImportDialogEvent onClose', () => { + spyOn(component.toggleImportDialogEvent, 'emit') + + component.onClose() + + expect(component.toggleImportDialogEvent.emit).toHaveBeenCalledOnceWith(true) + }) + + it('should set formValid on handleFormValidation', () => { + component.handleFormValidation(true) + + expect(component.isFormValid).toBeTrue() + }) + + it('should set isLoading on handleIsLoading', () => { + component.handleIsLoading(true) + + expect(component.isLoading).toBeTrue() + }) + + it('should display error msg if no importRequestDTO', () => { + component.importRequestDTO = undefined + + component.importPortal() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ summaryKey: 'PORTAL_IMPORT.PORTAL_IMPORT_ERROR' }) + }) + + it('should import a portal', () => { + apiServiceSpy.portalImportRequest.and.returnValue(of({})) + const portal = { + portal: { + portalName: 'name', + tenantId: '', + microfrontendRegistrations: new Set([{ version: 1 }]) + } + } + component.importRequestDTO = portal + component.hasPermission = true + component.tenantId = 'id' + component.importThemeCheckbox = false + component.confirmComponent = new MockConfirmComponent() as unknown as ConfirmComponent + if (component.confirmComponent) { + component.confirmComponent.portalNameExists = false + } + + component.importPortal() + + const req = httpTestingController.expectOne(`http://localhost/v1/portalImportRequest`) + expect(req.request.method).toEqual('POST') + req.flush({}) + + expect(component.isLoading).toBeFalse() + expect(component.importRequestDTO.portal.tenantId).toEqual('id') + expect(component.importRequestDTO.portal.microfrontendRegistrations).toEqual(jasmine.any(Array)) + portal.portal.microfrontendRegistrations.forEach((mfe) => { + expect(component.importRequestDTO?.portal.microfrontendRegistrations).toContain(mfe) + }) + expect(msgServiceSpy.success).toHaveBeenCalledWith({ summaryKey: 'PORTAL_IMPORT.PORTAL_IMPORT_CREATE_SUCCESS' }) + }) + + it('should import a portal with theme if checkbox enabled', () => { + apiServiceSpy.portalImportRequest.and.returnValue(of({})) + const portal = { + portal: { + portalName: 'name', + tenantId: '', + microfrontendRegistrations: new Set([{ version: 1 }]) + }, + themeImportData: { + name: 'themeName' + } + } + component.importRequestDTO = portal + component.hasPermission = true + component.tenantId = 'id' + component.importThemeCheckbox = true + component.confirmComponent = new MockConfirmComponent() as unknown as ConfirmComponent + if (component.confirmComponent) { + component.confirmComponent.portalNameExists = false + } + component.themeName = 'new name' + + component.importPortal() + + const req = httpTestingController.expectOne(`http://localhost/v1/portalImportRequest`) + expect(req.request.method).toEqual('POST') + req.flush({}) + + expect(component.importRequestDTO.portal.themeName).toEqual('new name') + expect(component.importRequestDTO.themeImportData?.name).toEqual('new name') + }) + + it('should import a portal and set mfe & menu items base url correctly', () => { + apiServiceSpy.portalImportRequest.and.returnValue(of({})) + spyOn(component, 'alignMenuItemsBaseUrl') + const microfrontendRegistrations = new Set([ + { version: 1, baseUrl: 'http://old-url.com/path1' }, + { version: 1, baseUrl: 'http://old-url.com/path2' }, + { version: 1, baseUrl: 'http://another-url.com/path3' }, + { version: 1, baseUrl: 'http://old-url.com/path4' }, + { version: 1, baseUrl: 'http://different-url.com/path5' } + ]) + const portal = { + portal: { + portalName: 'name', + tenantId: '', + microfrontendRegistrations: microfrontendRegistrations + }, + themeImportData: { + name: 'themeName' + }, + menuItems: [ + { + name: 'menu' + } + ] + } + component.importRequestDTO = portal + component.hasPermission = true + component.tenantId = 'id' + component.importThemeCheckbox = true + component.baseUrlOrg = 'http://old-url.com' + component.baseUrl = 'http://new-url.com' + + component.importPortal() + + microfrontendRegistrations.forEach((mfe) => { + if (mfe.baseUrl.startsWith('http://old-url.com')) { + expect(mfe.baseUrl).toBe(component.baseUrl + '/path' + mfe.baseUrl.charAt(mfe.baseUrl.length - 1)) + } + }) + if (component.importRequestDTO.menuItems) { + expect(component.alignMenuItemsBaseUrl).toHaveBeenCalledWith(component.importRequestDTO.menuItems) + } + }) + + it('should update a portal', () => { + apiServiceSpy.portalImportRequest.and.returnValue(of({})) + const portal = { + portal: { + portalName: 'name', + tenantId: '', + microfrontendRegistrations: new Set([{ version: 1 }]) + } + } + component.importRequestDTO = portal + component.hasPermission = true + component.tenantId = 'id' + component.importThemeCheckbox = false + component.confirmComponent = new MockConfirmComponent() as unknown as ConfirmComponent + if (component.confirmComponent) { + component.confirmComponent.portalNameExists = true + } + + component.importPortal() + + const req = httpTestingController.expectOne(`http://localhost/v1/portalImportRequest`) + expect(req.request.method).toEqual('POST') + req.flush({}) + + expect(msgServiceSpy.success).toHaveBeenCalledWith({ summaryKey: 'PORTAL_IMPORT.PORTAL_IMPORT_UPDATE_SUCCESS' }) + }) + + it('should display error msg if api call fails', () => { + const portal = { + portal: { + portalName: 'name', + tenantId: '', + microfrontendRegistrations: new Set([{ version: 1 }]) + } + } + apiServiceSpy.portalImportRequest.and.returnValue(throwError(() => new Error())) + component.importRequestDTO = portal + component.hasPermission = true + component.tenantId = 'id' + component.importThemeCheckbox = false + + component.importPortal() + + const req = httpTestingController.expectOne(`http://localhost/v1/portalImportRequest`) + expect(req.request.method).toEqual('POST') + req.flush('Error loading data', { status: 500, statusText: 'Server Error' }) + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ summaryKey: 'PORTAL_IMPORT.PORTAL_IMPORT_ERROR' }) + }) + + it('should alignMenuItemsBaseUrl', () => { + const menuItems: MenuItemStructureDTOv1[] = [ + { url: 'http://baseurlorg/path1', children: [] }, + { url: 'http://baseurlorg/path2', children: [{ url: 'http://baseurlorg/path2/child', children: [] }] }, + { url: 'http://otherurl/path3', children: [] } + ] + + component.baseUrlOrg = 'http://baseurl' + component.baseUrl = 'http://newbaseurl' + + component.alignMenuItemsBaseUrl(menuItems) + + expect(menuItems[0].url).toEqual('http://newbaseurlorg/path1') + expect(menuItems[1].url).toEqual('http://newbaseurlorg/path2') + if (menuItems[1].children) { + expect(menuItems[1].children[0].url).toEqual('http://newbaseurlorg/path2/child') + } + expect(menuItems[2].url).toEqual('http://otherurl/path3') + }) + + it('should set importRequestDTO on next when activeIndex is 0 (upload), and themeImportData empty', () => { + const importRequestDTO: ImportRequestDTOv1 = { + portal: { + portalName: 'name', + themeName: 'testTheme', + baseUrl: 'http://testbaseurl' + }, + themeImportData: undefined + } + component.activeIndex = 0 + + component.next(importRequestDTO) + + expect(component.importRequestDTO).toEqual(importRequestDTO) + if (importRequestDTO.portal.themeName) { + expect(component.themeName).toEqual(importRequestDTO.portal.themeName) + } + expect(component.baseUrlOrg).toEqual(importRequestDTO.portal.baseUrl) + expect(component.themeCheckboxEnabled).toEqual(!!importRequestDTO.themeImportData) + expect(component.activeIndex).toBe(1) + }) + + it('should set importRequestDTO on next when activeIndex is 0 (upload), and themeImportData valid', () => { + const importRequestDTO: ImportRequestDTOv1 = { + portal: { + portalName: 'name', + themeName: 'testTheme', + baseUrl: 'http://testbaseurl' + }, + themeImportData: { + name: 'themeName' + } + } + + component.activeIndex = 0 + + component.next(importRequestDTO) + + expect(component.themeCheckboxEnabled).toBeTrue() + }) + + it('should set values from preview component on next when activeIndex is 1 (preview)', () => { + component.previewComponent = new MockPreviewComponent() as unknown as PreviewComponent + component.activeIndex = 1 + component.hasPermission = true + + component.next() + + expect(component.portalName).toEqual(component.previewComponent?.portalName) + expect(component.themeName).toEqual(component.previewComponent?.themeName) + expect(component.baseUrl).toEqual(component.previewComponent?.baseUrl) + expect(component.tenantId).toEqual(component.previewComponent?.tenantId) + }) + + it('should set values from confirm component on back when activeIndex is 2 (confirm)', () => { + component.confirmComponent = new MockConfirmComponent() as unknown as ConfirmComponent + component.activeIndex = 2 + component.hasPermission = true + const importRequestDTO: ImportRequestDTOv1 = { + portal: { + portalName: 'name', + themeName: 'testTheme', + baseUrl: 'http://testbaseurl', + tenantId: 'id' + }, + themeImportData: { + name: 'themeName' + } + } + component.importRequestDTO = importRequestDTO + + component.back() + + if (component.confirmComponent.portalName) { + expect(component.importRequestDTO.portal.portalName).toEqual(component.confirmComponent.portalName) + } + if (component.confirmComponent.themeName) { + expect(component.importRequestDTO.themeImportData?.name).toEqual(component.confirmComponent.themeName) + } + if (component.confirmComponent.baseUrl) { + expect(component.importRequestDTO.portal.baseUrl).toEqual(component.confirmComponent.baseUrl) + } + if (component.confirmComponent.tenantId) { + expect(component.importRequestDTO.portal.tenantId).toEqual(component.confirmComponent.tenantId) + } + }) +}) diff --git a/src/app/workspace/workspace-import/workspace-import.component.ts b/src/app/workspace/workspace-import/workspace-import.component.ts new file mode 100644 index 00000000..bb8b8919 --- /dev/null +++ b/src/app/workspace/workspace-import/workspace-import.component.ts @@ -0,0 +1,226 @@ +import { Component, OnInit, Inject, ViewChild, Input, Output, EventEmitter, OnChanges } from '@angular/core' +import { ActivatedRoute, Router } from '@angular/router' +import { MenuItem } from 'primeng/api' +import { TranslateService } from '@ngx-translate/core' + +import { AUTH_SERVICE, IAuthService, PortalMessageService } from '@onecx/portal-integration-angular' + +import { PreviewComponent } from './preview/preview.component' +import { ConfirmComponent } from './confirm/confirm.component' +import { WorkspaceAPIService, EximWorkspaceMenuItem, WorkspaceSnapshot } from 'src/app/shared/generated' + +@Component({ + selector: 'app-workspace-import', + templateUrl: './workspace-import.component.html', + styleUrls: ['./workspace-import.component.scss'] +}) +export class WorkspaceImportComponent implements OnInit, OnChanges { + @Input() resetDialog = true // provoke the onChange + @Output() toggleImportDialogEvent = new EventEmitter() + @ViewChild(PreviewComponent) public previewComponent?: PreviewComponent + @ViewChild(ConfirmComponent) public confirmComponent?: ConfirmComponent + + public importThemeCheckbox = false + public themeCheckboxEnabled = false + public syncPermCheckbox = true + public isFormValid = true + public steps: MenuItem[] = [] + public activeIndex = 0 + public isLoading = false + public portalName = '' + public themeName = '' + public tenantId: string | undefined = undefined + public baseUrl = '' + public baseUrlOrg: string | undefined = undefined // the original + public importRequestDTO?: WorkspaceSnapshot + public activeThemeCheckboxInFirstStep = true + public hasPermission = false + + constructor( + private readonly router: Router, + private readonly route: ActivatedRoute, + private readonly translate: TranslateService, + private readonly workspaceApi: WorkspaceAPIService, + private msgService: PortalMessageService, + @Inject(AUTH_SERVICE) readonly auth: IAuthService + ) { + this.hasPermission = this.auth.hasPermission('WORKSPACE#IMPORT') + + this.steps = [ + { label: this.translate.instant('PORTAL_IMPORT.CHOOSE_FILE') }, + { label: this.translate.instant('PORTAL_IMPORT.PREVIEW') }, + { label: this.translate.instant('PORTAL_IMPORT.CONFIRMATION') } + ] + this.reset() + } + + public ngOnInit(): void { + this.reset() + } + public ngOnChanges(): void { + this.reset() + } + public onClose(): void { + this.toggleImportDialogEvent.emit(true) + } + + public reset(): void { + this.portalName = '' + this.tenantId = '' + this.themeName = '' + this.baseUrl = '' + this.baseUrlOrg = '' + this.isFormValid = true + this.themeCheckboxEnabled = false + this.importThemeCheckbox = false + this.importRequestDTO = undefined + this.activeIndex = 0 + } + + // triggered by PREVIEW => NEXT button enabled? + public handleFormValidation(valid: boolean): void { + this.isFormValid = valid + } + // triggered by CONFIRM => IMPORT button enabled? + public handleIsLoading(load: boolean): void { + this.isLoading = load + } + + // IMPORT + public importPortal(): void { + if (!this.importRequestDTO) { + this.msgService.error({ summaryKey: 'PORTAL_IMPORT.PORTAL_IMPORT_ERROR' }) + return + } + this.isLoading = true + + let key: string[] = [] + if (this.importRequestDTO.workspaces) { + key = Object.keys(this.importRequestDTO.workspaces) + } + // Basic properties + if (this.importRequestDTO.workspaces) { + this.importRequestDTO.workspaces[key[0]].name = this.portalName + this.importRequestDTO.workspaces[key[0]].theme = this.themeName + /* if (this.hasPermission) { + this.importRequestDTO.portal.tenantId = this.tenantId + } */ + // this.importRequestDTO.synchronizePermissions = this.syncPermCheckbox + this.importRequestDTO.workspaces[key[0]].baseUrl = this.baseUrl + } + + // Theme + /* if (!this.importThemeCheckbox) { + this.importRequestDTO.themeImportData = undefined + } else { + this.importRequestDTO.portal.themeName = this.themeName + if (this.importRequestDTO.themeImportData) { + this.importRequestDTO.themeImportData.name = this.themeName + } + } */ + + // Microfontends: convert Set to Array what the backend expects + // the default is {} which is not a Set ! + // const mfeArray = new Array() + // if ( + // this.importRequestDTO.portal.microfrontendRegistrations && + // this.importRequestDTO.portal.microfrontendRegistrations?.values !== undefined + // ) { + // this.importRequestDTO.portal.microfrontendRegistrations.forEach((mfe) => mfeArray.push(mfe)) + // } + // this.importRequestDTO.portal.microfrontendRegistrations = mfeArray as any + + // If the baseUrl was changed then change the correspondig URLs in menu and mfes: + if (this.baseUrlOrg && this.baseUrlOrg !== this.baseUrl) { + // Microfrontends + // this.importRequestDTO.portal.microfrontendRegistrations?.forEach((mfe) => { + // if (this.baseUrlOrg) { + // if (mfe.baseUrl?.startsWith(this.baseUrlOrg)) + // mfe.baseUrl = this.baseUrl + mfe.baseUrl?.substring(this.baseUrlOrg.length) + // } + // }) + // Menu items ... hierarchical + if (this.importRequestDTO.workspaces) { + if (this.importRequestDTO.workspaces[key[0]].menu?.menu?.menuItems) { + this.alignMenuItemsBaseUrl(this.importRequestDTO.workspaces[key[0]].menu?.menu!.menuItems!) + } + } + } + this.workspaceApi + .importWorkspaces({ + workspaceSnapshot: this.importRequestDTO + }) + .subscribe({ + next: (res) => { + if (this.confirmComponent?.portalNameExists) { + this.msgService.success({ summaryKey: 'PORTAL_IMPORT.PORTAL_IMPORT_UPDATE_SUCCESS' }) + } else { + this.msgService.success({ summaryKey: 'PORTAL_IMPORT.PORTAL_IMPORT_CREATE_SUCCESS' }) + } + this.isLoading = false + this.router.navigate([`${res.id}`], { relativeTo: this.route }) + }, + error: () => { + this.isLoading = false + this.msgService.error({ summaryKey: 'PORTAL_IMPORT.PORTAL_IMPORT_ERROR' }) + } + }) + } + + // step recursively through menu tree and align base URL + public alignMenuItemsBaseUrl(menuItems: Array): void { + menuItems?.forEach((item) => { + if (this.baseUrlOrg) { + if (item.url?.startsWith(this.baseUrlOrg)) item.url = this.baseUrl + item.url?.substring(this.baseUrlOrg.length) + } + this.alignMenuItemsBaseUrl(item.children || []) + }) + } + + // NAVIGATE import step : NEXT + public next(importRequestDTO?: WorkspaceSnapshot): void { + if (this.activeIndex == 0 && importRequestDTO && importRequestDTO.workspaces) { + this.importRequestDTO = importRequestDTO + let keys: string[] = [] + if (this.importRequestDTO?.workspaces) { + keys = Object.keys(this.importRequestDTO.workspaces) + } + // this.themeName = importRequestDTO.portal.themeName || '' + this.baseUrlOrg = importRequestDTO.workspaces[keys[0]].baseUrl + // if (this.importRequestDTO.themeImportData) { + // this.themeCheckboxEnabled = true + // } else { + // this.themeCheckboxEnabled = false + // this.importThemeCheckbox = false + // } + } else if (this.activeIndex == 1) { + this.portalName = this.previewComponent?.portalName || '' + this.themeName = this.previewComponent?.themeName || '' + this.baseUrl = this.previewComponent?.baseUrl || '' + if (this.hasPermission) this.tenantId = this.previewComponent?.tenantId || undefined + } + this.activeIndex++ + } + + // NAVIGATE import step : BACK + public back(): void { + let key: string[] = [] + if (this.importRequestDTO?.workspaces) { + key = Object.keys(this.importRequestDTO.workspaces) + } + if (this.activeIndex == 2) { + if ( + this.activeIndex == 2 && + this.importRequestDTO && + this.importRequestDTO.workspaces /* && this.importRequestDTO.themeImportData */ + ) { + this.importRequestDTO.workspaces[key[0]].name = this.confirmComponent?.portalName || '' + // this.importRequestDTO.tenantId = this.confirmComponent?.tenantId || '' + this.importRequestDTO.workspaces[key[0]].baseUrl = this.confirmComponent?.baseUrl || '' + // this.importRequestDTO.themeImportData.name = this.confirmComponent?.themeName || '' + // if (this.hasPermission) this.importRequestDTO.portal.tenantId = this.confirmComponent?.tenantId || undefined + } + } + this.activeIndex-- + } +} diff --git a/src/app/workspace/workspace-search/workspace-search.component.html b/src/app/workspace/workspace-search/workspace-search.component.html new file mode 100644 index 00000000..2dd3fc69 --- /dev/null +++ b/src/app/workspace/workspace-search/workspace-search.component.html @@ -0,0 +1,155 @@ + + + + + + + + + + + + + +
+
+ +
+
+ {{ limitText(portalItems.name, 40) }} +
+ +
+ {{ limitText(portalItems.themeName, 40) }} +
+
+ {{ this.getDescriptionString(portalItems.description) }} +
+
+
+ + + +
+
+ + +
+ +
+
+
+ {{ limitText(portalItems.name, 15) }} +
+
+ {{ limitText(portalItems.description, 26) }} +
+ +
+
+
+
+
+
+
+ + + + + + +
diff --git a/src/app/workspace/workspace-search/workspace-search.component.scss b/src/app/workspace/workspace-search/workspace-search.component.scss new file mode 100644 index 00000000..b153761c --- /dev/null +++ b/src/app/workspace/workspace-search/workspace-search.component.scss @@ -0,0 +1,38 @@ +:host ::ng-deep { + .card-badge-right { + display: inline-block; + position: absolute; + opacity: 0.7; + right: 4px; + &.badge-1 { + top: 5px; + } + &.badge-2 { + top: 35px; + } + &:hover { + opacity: 1; + } + } + .pseudo-button-link { + border-radius: var(--border-radius); + &:hover { + color: var(--primary-color-text); + background: var(--button-hover-bg); + cursor: pointer; + } + } + + .p-dataview-content .p-grid > div { + min-height: 60px; + &.listview-row { + &:nth-child(odd) { + background-color: #f8f9fa; + } + } + } + .p-dialog .p-dialog-content { + border-bottom-left-radius: var(--border-radius); + border-bottom-right-radius: var(--border-radius); + } +} diff --git a/src/app/workspace/workspace-search/workspace-search.component.spec.ts b/src/app/workspace/workspace-search/workspace-search.component.spec.ts new file mode 100644 index 00000000..f8f5c68d --- /dev/null +++ b/src/app/workspace/workspace-search/workspace-search.component.spec.ts @@ -0,0 +1,215 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core' +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' +import { HttpClient } from '@angular/common/http' +import { HttpClientTestingModule } from '@angular/common/http/testing' +import { Router } from '@angular/router' +import { ActivatedRoute } from '@angular/router' +import { TranslateLoader, TranslateModule } from '@ngx-translate/core' +import { of, throwError } from 'rxjs' + +import { PortalMessageService } from '@onecx/portal-integration-angular' +import { HttpLoaderFactory } from 'src/app/shared/shared.module' +import { WorkspaceSearchComponent } from './workspace-search.component' +import { PortalDTO, PortalInternalAPIService } from '../../shared/generated' + +class MockRouter { + navigate = jasmine.createSpy('navigate') +} + +describe('WorkspaceSearchComponent', () => { + let component: WorkspaceSearchComponent + let fixture: ComponentFixture + let mockActivatedRoute: ActivatedRoute + let mockRouter = new MockRouter() + // eslint-disable-next-line @typescript-eslint/no-unused-vars + let mockWindow: any + + const msgServiceSpy = jasmine.createSpyObj('PortalMessageService', ['info', 'error']) + const apiServiceSpy = { + getAllPortals: jasmine.createSpy('getAllPortals').and.returnValue(of({})) + } + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [WorkspaceSearchComponent], + imports: [ + HttpClientTestingModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }) + ], + schemas: [NO_ERRORS_SCHEMA], + providers: [ + { provide: ActivatedRoute, useValue: mockActivatedRoute }, + { provide: Router, useValue: mockRouter }, + { provide: PortalMessageService, useValue: msgServiceSpy }, + { provide: PortalInternalAPIService, useValue: apiServiceSpy } + ] + }).compileComponents() + msgServiceSpy.info.calls.reset() + msgServiceSpy.error.calls.reset() + apiServiceSpy.getAllPortals.calls.reset() + })) + + beforeEach(() => { + fixture = TestBed.createComponent(WorkspaceSearchComponent) + component = fixture.componentInstance + fixture.detectChanges() + }) + + it('should create', () => { + expect(component).toBeTruthy() + }) + + it('should call toggleShowCreateDialog when actionCallback is executed', () => { + spyOn(component, 'toggleShowCreateDialog') + + component.ngOnInit() + const action = component.actions[0] + action.actionCallback() + + expect(component.toggleShowCreateDialog).toHaveBeenCalled() + }) + + it('should call toggleShowImportDialog when actionCallback is executed', () => { + spyOn(component, 'toggleShowImportDialog') + + component.ngOnInit() + const action = component.actions[1] + action.actionCallback() + + expect(component.toggleShowImportDialog).toHaveBeenCalled() + }) + + it('should toggle showCreateDialog from false to true', () => { + component.showCreateDialog = false + + component.toggleShowCreateDialog() + + expect(component.showCreateDialog).toBeTrue() + }) + + it('should toggle showImportDialog from true to false', () => { + component.showImportDialog = true + + component.toggleShowImportDialog() + + expect(component.showImportDialog).toBeFalse() + }) + + it('should correctly assign results if API call returns some data', () => { + const portal: PortalDTO = { + portalName: 'name', + themeName: 'theme', + themeId: 'id', + baseUrl: 'url', + id: 'id' + } + apiServiceSpy.getAllPortals.and.returnValue(of([portal])) + component.portalItems = [] + + component.search() + + expect(component.portalItems[0]).toEqual(portal) + expect(component.sortField).toEqual('portalName') + }) + + it('should display info if no portals available', () => { + apiServiceSpy.getAllPortals.and.returnValue(of([])) + + component.search() + + expect(msgServiceSpy.info).toHaveBeenCalledWith({ summaryKey: 'SEARCH.MSG_NO_RESULTS' }) + }) + + it('should display error if API call fails', () => { + apiServiceSpy.getAllPortals.and.returnValue(throwError(() => new Error())) + + component.search() + + expect(msgServiceSpy.error).toHaveBeenCalledWith({ summaryKey: 'SEARCH.ERROR' }) + }) + + it('should call filter table onFilterChange', () => { + component.table = jasmine.createSpyObj('table', ['filter']) + + component.onFilterChange('test') + + expect(component.table?.filter).toHaveBeenCalledWith('test', 'contains') + }) + + it('should set correct values onLayoutChange', () => { + component.onLayoutChange('EDIT') + + expect(component.viewMode).toEqual('EDIT') + }) + + it('should set correct values onSortChange', () => { + component.onSortChange('field') + + expect(component.sortField).toEqual('field') + }) + + it('should set correct values onSortDirChange', () => { + component.onSortDirChange(true) + + expect(component.sortOrder).toEqual(-1) + }) + + it('should behave correctly onGotoPortal', () => { + mockWindow = spyOn(window, 'open') + const mockEvent = { + stopPropagation: jasmine.createSpy() + } + const portal: PortalDTO = { + portalName: 'name', + themeName: 'theme', + themeId: 'id', + baseUrl: '/some/base/url' + } + + component.onGotoPortal(mockEvent, portal) + + expect(mockEvent.stopPropagation).toHaveBeenCalled() + expect(window.open).toHaveBeenCalledWith(window.document.location.href + '../../../..' + portal.baseUrl, '_blank') + }) + + it('should behave correctly onGotoMenu', () => { + const mockEvent = { + stopPropagation: jasmine.createSpy() + } + const portal: PortalDTO = { + portalName: 'name', + themeName: 'theme', + themeId: 'id', + baseUrl: '/some/base/url', + id: 'id' + } + + component.onGotoMenu(mockEvent, portal) + + expect(mockEvent.stopPropagation).toHaveBeenCalled() + expect(mockRouter.navigate).toHaveBeenCalledWith(['./', portal.id, 'menu'], { relativeTo: mockActivatedRoute }) + }) + + it('should behave return correct string on getDescriptionString', () => { + spyOnProperty(window, 'innerWidth').and.returnValue(500) + const text = 'text' + + const result = component.getDescriptionString(text) + + expect(result).toEqual(text) + }) + + it('should behave return correct string on getDescriptionString: empty string', () => { + const text = '' + + const result = component.getDescriptionString(text) + + expect(result).toEqual('') + }) +}) diff --git a/src/app/workspace/workspace-search/workspace-search.component.ts b/src/app/workspace/workspace-search/workspace-search.component.ts new file mode 100644 index 00000000..1d68f0f1 --- /dev/null +++ b/src/app/workspace/workspace-search/workspace-search.component.ts @@ -0,0 +1,187 @@ +import { Component, OnInit, ViewChild } from '@angular/core' +import { ActivatedRoute, Router } from '@angular/router' +import { finalize, Observable } from 'rxjs' +import { TranslateService } from '@ngx-translate/core' +import { + Action, + // ConfigurationService, + DataViewControlTranslations, + PortalMessageService +} from '@onecx/portal-integration-angular' +import { limitText } from '../../shared/utils' +import { SearchWorkspacesResponse, Workspace, WorkspaceAPIService, WorkspaceAbstract } from '../../shared/generated' + +@Component({ + selector: 'app-workspace-search', + templateUrl: './workspace-search.component.html', + styleUrls: ['./workspace-search.component.scss'] +}) +export class WorkspaceSearchComponent implements OnInit { + portals$!: Observable + public searchInProgress = false + public actions: Action[] = [] + public showCreateDialog = false + public showImportDialog = false + public limitText = limitText + + public portalItems: WorkspaceAbstract[] | undefined = [] + public viewMode = 'grid' + public filter: string | undefined + public sortField = '' + public sortOrder = 1 + public defaultSortField = 'portalName' + public fieldLabelPortalName = '' + public fieldLabelThemeName = '' + public dataViewControlsTranslations: DataViewControlTranslations = {} + + @ViewChild('table', { static: false }) table!: DataView | any + + constructor( + private workspaceApi: WorkspaceAPIService, + private route: ActivatedRoute, + private router: Router, + // private config: ConfigurationService, + private translate: TranslateService, + private msgService: PortalMessageService + ) {} + + ngOnInit() { + this.translate + .get([ + 'PORTAL.ITEM.PORTAL_NAME', + 'PORTAL.ITEM.THEME', + 'SEARCH.SORT_BY', + 'SEARCH.FILTER', + 'SEARCH.FILTER_OF', + 'GENERAL.TOOLTIP.VIEW_MODE_GRID', + 'GENERAL.TOOLTIP.VIEW_MODE_LIST', + 'GENERAL.TOOLTIP.VIEW_MODE_TABLE', + 'SEARCH.SORT_DIRECTION_ASC', + 'SEARCH.SORT_DIRECTION_DESC' + ]) + .subscribe((data) => { + this.prepareTranslations(data) + }) + this.translate + .get(['ACTIONS.CREATE.PORTAL', 'ACTIONS.CREATE.PORTAL.TOOLTIP', 'ACTIONS.IMPORT.LABEL', 'ACTIONS.IMPORT.PORTAL']) + .subscribe((data) => { + this.prepareActionButtons(data) + }) + // this.config.getMFEInfo() + this.search() + } + + private prepareTranslations(data: any) { + this.fieldLabelPortalName = data['PORTAL.ITEM.PORTAL_NAME'] + this.fieldLabelThemeName = data['PORTAL.ITEM.THEME'] + this.dataViewControlsTranslations = { + sortDropdownPlaceholder: data['SEARCH.SORT_BY'], + filterInputPlaceholder: data['SEARCH.FILTER'], + filterInputTooltip: data['SEARCH.FILTER_OF'] + this.fieldLabelPortalName + ', ' + this.fieldLabelThemeName, + viewModeToggleTooltips: { + grid: data['GENERAL.TOOLTIP.VIEW_MODE_GRID'], + list: data['GENERAL.TOOLTIP.VIEW_MODE_LIST'], + table: data['GENERAL.TOOLTIP.VIEW_MODE_TABLE'] + }, + sortOrderTooltips: { + ascending: data['SEARCH.SORT_DIRECTION_ASC'], + descending: data['SEARCH.SORT_DIRECTION_DESC'] + }, + sortDropdownTooltip: data['SEARCH.SORT_BY'] + } + } + + private prepareActionButtons(data: any) { + this.actions.push( + { + label: data['ACTIONS.CREATE.PORTAL'], + title: data['ACTIONS.CREATE.PORTAL.TOOLTIP'], + actionCallback: () => this.toggleShowCreateDialog(), + icon: 'pi pi-plus', + show: 'always', + permission: 'WORKSPACE#CREATE' + }, + { + label: data['ACTIONS.IMPORT.LABEL'], + title: data['ACTIONS.IMPORT.PORTAL'], + actionCallback: () => this.toggleShowImportDialog(), + icon: 'pi pi-upload', + show: 'always', + permission: 'WORKSPACE#IMPORT' + } + ) + } + + /* public loadPortals() { + this.portals$ = this.portalApi.getAllPortals() + } */ + + toggleShowCreateDialog = (): void => { + this.showCreateDialog = !this.showCreateDialog + } + + toggleShowImportDialog = (): void => { + this.showImportDialog = !this.showImportDialog + } + + public search(): void { + this.searchInProgress = true + this.workspaceApi + .searchWorkspaces({ searchWorkspacesRequest: {} }) + .pipe(finalize(() => (this.searchInProgress = false))) + .subscribe({ + next: (value: SearchWorkspacesResponse) => { + this.portalItems = value.stream + if (value.totalElements === 0) { + this.msgService.info({ summaryKey: 'SEARCH.MSG_NO_RESULTS' }) + } + this.sortField = this.defaultSortField + }, + error: () => { + this.msgService.error({ summaryKey: 'SEARCH.ERROR' }) + } + }) + } + + onFilterChange(event: string): void { + this.table.filter(event, 'contains') + } + + onLayoutChange(viewMode: string) { + this.viewMode = viewMode + } + + onSortChange(field: string) { + this.sortField = field + } + onSortDirChange(asc: boolean) { + this.sortOrder = asc ? -1 : 1 + } + public onGotoPortal(ev: any, portal: Workspace) { + ev.stopPropagation() + window.open(window.document.location.href + '../../../..' + portal.baseUrl, '_blank') + } + public onGotoMenu(ev: any, portal: Workspace) { + ev.stopPropagation() + this.workspaceApi + .getWorkspaceByName({ name: portal.name }) + .pipe() + .subscribe({ + next: (portal) => { + if (portal.resource) { + this.router.navigate(['./', portal.resource.name, 'menu'], { relativeTo: this.route }) + } + }, + error: () => {} + }) + } + + getDescriptionString(text: string): string { + if (text) { + const chars = window.innerWidth < 1200 ? 200 : 120 + return text.length < chars ? text : text.substring(0, chars) + '...' + } else { + return '' + } + } +} diff --git a/src/app/workspace/workspace.module.ts b/src/app/workspace/workspace.module.ts new file mode 100644 index 00000000..78c45f70 --- /dev/null +++ b/src/app/workspace/workspace.module.ts @@ -0,0 +1,89 @@ +import { CUSTOM_ELEMENTS_SCHEMA, Inject, NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +// import { HttpClient } from '@angular/common/http' +import { FormsModule } from '@angular/forms' +import { RouterModule, Routes } from '@angular/router' +import { ConfirmationService } from 'primeng/api' +import { ButtonModule } from 'primeng/button' +import { RippleModule } from 'primeng/ripple' +import { ImageModule } from 'primeng/image' +import { CardModule } from 'primeng/card' +import { ConfirmDialogModule } from 'primeng/confirmdialog' +import { FileUploadModule } from 'primeng/fileupload' +import { TreeTableModule } from 'primeng/treetable' +// import { TranslateModule, TranslateLoader } from '@ngx-translate/core' + +import { MFE_INFO, MfeInfo, PortalCoreModule } from '@onecx/portal-integration-angular' + +import { SharedModule /* , HttpLoaderFactory */ } from '../shared/shared.module' +import { LabelResolver } from '../shared/label.resolver' +import { WorkspaceSearchComponent } from './workspace-search/workspace-search.component' +import { WorkspaceCreateComponent } from './workspace-create/workspace-create.component' + +import { WorkspaceImportComponent } from './workspace-import/workspace-import.component' +import { ChooseFileComponent } from './workspace-import/choose-file/choose-file.component' +import { PreviewComponent } from './workspace-import/preview/preview.component' +import { ConfirmComponent } from './workspace-import/confirm/confirm.component' + +const routes: Routes = [ + { + path: '', + component: WorkspaceSearchComponent, + pathMatch: 'full' + }, + { + path: 'new', + component: WorkspaceCreateComponent + }, + { + path: ':name', + loadChildren: () => import('./workspace-detail/workspace-detail.module').then((m) => m.WorkspaceDetailModule), + data: { + breadcrumb: 'BREADCRUMBS.DETAIL', + breadcrumbFn: (data: any) => `${data.labeli18n}` + }, + resolve: { + labeli18n: LabelResolver + } + } +] + +@NgModule({ + declarations: [ + WorkspaceSearchComponent, + WorkspaceCreateComponent, + WorkspaceImportComponent, + ChooseFileComponent, + PreviewComponent, + ConfirmComponent + ], + imports: [ + CommonModule, + SharedModule, + [RouterModule.forChild(routes)], + PortalCoreModule.forMicroFrontend(), + FormsModule, + CardModule, + FileUploadModule, + ButtonModule, + RippleModule, + ImageModule, + ConfirmDialogModule, + TreeTableModule + // TranslateModule.forChild({ + // isolate: true, + // loader: { + // provide: TranslateLoader, + // useFactory: HttpLoaderFactory, + // deps: [HttpClient, MFE_INFO] + // } + // }) + ], + providers: [ConfirmationService], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class WorkspaceModule { + constructor(@Inject(MFE_INFO) mfeInfo: MfeInfo) { + console.log(`Workspace Module constructor ${JSON.stringify(mfeInfo)}`) + } +} diff --git a/src/assets/api/workspace-bff-api.yaml b/src/assets/api/workspace-bff-api.yaml new file mode 100644 index 00000000..d2baac82 --- /dev/null +++ b/src/assets/api/workspace-bff-api.yaml @@ -0,0 +1,1252 @@ +openapi: 3.0.3 +info: + title: onecx-workspace-bff + description: OneCx workspace Bff + version: '1.0' +servers: + - url: http://onecx-workspace-bff:8080/ +tags: + - name: workspace + - name: menuItem + - name: product +paths: + /workspaces: + post: + x-onecx: + permissions: + workspaces: + - write + tags: + - workspace + description: Create new workspace + operationId: createWorkspace + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateWorkspaceRequest' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/CreateWorkspaceResponse' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' + /workspaces/search: + post: + x-onecx: + permissions: + workspaces: + - read + tags: + - workspace + description: Search workspaces by criteria + operationId: searchWorkspaces + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SearchWorkspacesRequest' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SearchWorkspacesResponse' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' + /workspaces/{id}: + get: + x-onecx: + permissions: + workspaces: + - read + tags: + - workspace + description: Get workspace by id + operationId: getWorkspaceById + parameters: + - $ref: '#/components/parameters/id' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetWorkspaceResponse' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' + put: + x-onecx: + permissionss: + workspaces: + - write + tags: + - workspace + description: Update workspace + operationId: updateWorkspace + parameters: + - $ref: '#/components/parameters/id' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateWorkspaceRequest' + responses: + '204': + description: Updated + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' + '404': + description: Not found + delete: + x-onecx: + permissions: + workspaces: + - delete + tags: + - workspace + description: Delete workspace + operationId: deleteWorkspace + parameters: + - $ref: '#/components/parameters/id' + responses: + '204': + description: No Content + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' + /workspaces/name/{name}: + get: + x-onecx: + permissions: + workspaces: + - read + tags: + - workspace + description: Get workspace by name + operationId: getWorkspaceByName + parameters: + - $ref: '#/components/parameters/name' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetWorkspaceResponse' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' + /workspaces/themes: + get: + x-onecx: + permissions: + workspaces: + - read + tags: + - workspace + description: get all theme names + operationId: getAllThemes + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + type: string + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' + + /workspaces/{id}/menuItems: + get: + x-onecx: + permissions: + workspaces: + - read + tags: + - menuItem + description: Find all menu items belonging to a workspace + operationId: getMenuItemsForWorkspaceById + parameters: + - $ref: '#/components/parameters/id' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetMenuItemsResponse' + '404': + description: Not found + patch: + x-onecx: + permissions: + workspaces: + - write + tags: + - menuItem + description: Bulk update menu Items + operationId: patchMenuItems + parameters: + - $ref: '#/components/parameters/id' + requestBody: + required: true + content: + application/json: + schema: + type: array + minItems: 1 + items: + $ref: '#/components/schemas/PatchMenuItemsRequest' + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/PatchMenuItemsResponse' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' + '404': + description: Menu items not found + post: + x-onecx: + permissions: + workspaces: + - write + tags: + - menuItem + description: Add a new menu item to workspace menu + operationId: createMenuItemForWorkspace + parameters: + - $ref: '#/components/parameters/id' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateMenuItemRequest' + responses: + '201': + description: OK + headers: + Location: + required: true + schema: + type: string + format: url + content: + application/json: + schema: + $ref: '#/components/schemas/CreateMenuItemResponse' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' + /workspaces/{id}/menuItems/tree: + get: + x-onecx: + permissions: + workspaces: + - read + tags: + - menuItem + description: Fetch the menuItems of the workspace in the tree structure + operationId: getMenuStructureForWorkspaceId + parameters: + - $ref: '#/components/parameters/id' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetWorkspaceMenuItemStructureResponse' + '404': + description: Not found + /workspaces/{id}/menuItems/tree/upload: + post: + x-onecx: + permissions: + workspaces: + - write + tags: + - menuItem + description: Upload the menu structure for workspace + operationId: uploadMenuStructureForWorkspaceId + parameters: + - $ref: '#/components/parameters/id' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateWorkspaceMenuItemStructrueRequest' + responses: + '201': + description: New Menu structure created + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' + /workspaces/{id}/menuItems/{menuItemId}: + get: + x-onecx: + permissions: + workspaces: + - read + tags: + - menuItem + description: Retrieve menu item detail info + operationId: getMenuItemById + parameters: + - $ref: '#/components/parameters/id' + - $ref: '#/components/parameters/menuItemId' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetMenuItemResponse' + '404': + description: Not found + delete: + x-onecx: + permissions: + workspaces: + - delete + tags: + - menuItem + description: Delete a menuItem by the workspace id and the menuItemId + operationId: deleteMenuItemById + parameters: + - $ref: '#/components/parameters/id' + - $ref: '#/components/parameters/menuItemId' + responses: + '204': + description: OK + '400': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' + + /workspaces/{id}/products: + post: + x-onecx: + permissions: + workspaces: + - write + tags: + - product + description: Create/Register new product to workspace + operationId: createProductInWorkspace + parameters: + - $ref: '#/components/parameters/id' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateProductRequest' + responses: + '201': + description: Product added + headers: + Location: + required: true + schema: + type: string + format: url + content: + application/json: + schema: + $ref: '#/components/schemas/CreateUpdateProductResponse' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' + get: + x-onecx: + permissions: + workspaces: + - read + tags: + - product + description: Find all products belonging to a workspace + operationId: getProductsForWorkspaceId + parameters: + - $ref: '#/components/parameters/id' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetProductsResponse' + '404': + description: Not found + /workspaces/{id}/products/{productId}: + delete: + x-onecx: + permissions: + workspaces: + - delete + tags: + - product + description: Delete a product by the workspace id and the productId + operationId: deleteProductById + parameters: + - $ref: '#/components/parameters/id' + - $ref: '#/components/parameters/productId' + responses: + '204': + description: OK + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' + put: + x-onecx: + permissions: + workspaces: + - write + tags: + - product + description: Update product and MFEs + operationId: updateProductById + parameters: + - $ref: '#/components/parameters/id' + - $ref: '#/components/parameters/productId' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateProductRequest' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/CreateUpdateProductResponse' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' + '404': + description: Product not found + /workspaces/export: + x-onecx: + permissions: + workspaces: + - read + post: + tags: + - workspace + description: Export workspaces + operationId: exportWorkspaces + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ExportWorkspacesRequest' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/WorkspaceSnapshot' + '404': + description: No themes founds + /workspaces/import: + x-onecx: + permissions: + workspaces: + - write + post: + tags: + - workspace + description: Import workspaces + operationId: importWorkspaces + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/WorkspaceSnapshot' + responses: + '200': + description: Import result + content: + application/json: + schema: + $ref: '#/components/schemas/ImportWorkspaceResponse' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' + /workspaces/{name}/menu/export: + get: + x-onecx: + permissions: + workspaces: + - read + tags: + - menuItem + description: Export workspaces + operationId: exportMenuByWorkspaceName + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/MenuSnapshot' + '404': + description: No themes founds + + /workspaces/{name}/menu/import: + post: + x-onecx: + permissions: + workspaces: + - write + tags: + - menuItem + description: Import workspaces + operationId: importMenuByWorkspaceName + parameters: + - name: name + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/MenuSnapshot' + responses: + '200': + description: Import result + content: + application/json: + schema: + $ref: '#/components/schemas/ImportMenuResponse' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetailResponse' +components: + schemas: + Workspace: + required: + - name + type: object + properties: + id: + type: string + readOnly: true + modificationCount: + format: int32 + type: integer + creationDate: + $ref: '#/components/schemas/OffsetDateTime' + creationUser: + type: string + readOnly: true + modificationDate: + $ref: '#/components/schemas/OffsetDateTime' + modificationUser: + type: string + readOnly: true + name: + type: string + description: + type: string + theme: + type: string + homePage: + type: string + baseUrl: + type: string + companyName: + type: string + phoneNumber: + type: string + rssFeedUrl: + type: string + footerLabel: + type: string + logoUrl: + type: string + workspaceRoles: + type: array + uniqueItems: true + items: + type: string + address: + $ref: '#/components/schemas/WorkspaceAddress' + subjectLinks: + uniqueItems: true + maxItems: 3 + type: array + items: + $ref: '#/components/schemas/SubjectLink' + imageUrls: + uniqueItems: true + type: array + items: + type: string + WorkspaceAbstract: + required: + - name + type: object + properties: + name: + type: string + description: + type: string + theme: + type: string + baseUrl: + type: string + logoUrl: + type: string + WorkspaceAddress: + type: object + properties: + street: + type: string + streetNo: + type: string + city: + type: string + country: + type: string + postalCode: + type: string + SubjectLink: + type: object + properties: + label: + type: string + url: + type: string + CreateWorkspaceRequest: + required: + - resource + type: object + properties: + resource: + $ref: '#/components/schemas/Workspace' + CreateWorkspaceResponse: + type: object + properties: + resource: + $ref: '#/components/schemas/Workspace' + SearchWorkspacesRequest: + type: object + properties: + name: + type: string + themeName: + type: string + pageNumber: + format: int32 + description: The number of page. + default: 0 + type: integer + pageSize: + format: int32 + description: The size of page + default: 10 + type: integer + SearchWorkspacesResponse: + allOf: + - $ref: '#/components/schemas/PagingResponse' + - type: object + properties: + stream: + type: array + items: + $ref: '#/components/schemas/WorkspaceAbstract' + GetWorkspaceResponse: + type: object + properties: + resource: + $ref: '#/components/schemas/Workspace' + UpdateWorkspaceRequest: + required: + - resource + type: object + properties: + resource: + $ref: '#/components/schemas/Workspace' + MenuItem: + type: object + properties: + modificationCount: + format: int32 + type: integer + creationDate: + $ref: '#/components/schemas/OffsetDateTime' + creationUser: + type: string + modificationDate: + $ref: '#/components/schemas/OffsetDateTime' + modificationUser: + type: string + id: + type: string + key: + type: string + name: + type: string + description: + type: string + url: + type: string + workspaceName: + type: string + applicationId: + type: string + disabled: + type: boolean + position: + format: int32 + type: integer + permission: + type: string + badge: + type: string + scope: + $ref: '#/components/schemas/Scope' + workspaceExit: + type: boolean + parentItemId: + type: string + children: + type: array + items: + $ref: '#/components/schemas/MenuItem' + i18n: + type: object + additionalProperties: + type: string + CreateUpdateMenuItem: + type: object + properties: + modificationCount: + format: int32 + type: integer + key: + type: string + name: + type: string + description: + type: string + url: + type: string + workspaceName: + type: string + readOnly: true + applicationId: + type: string + readOnly: true + disabled: + type: boolean + position: + format: int32 + type: integer + permission: + type: string + badge: + type: string + scope: + $ref: '#/components/schemas/Scope' + workspaceExit: + type: boolean + parentItemId: + type: string + i18n: + type: object + additionalProperties: + type: string + GetMenuItemsResponse: #holds array + type: object + properties: + menuItems: + type: array + items: + $ref: '#/components/schemas/MenuItem' + CreateMenuItemRequest: + required: + - resource + type: object + properties: + resource: + $ref: '#/components/schemas/CreateUpdateMenuItem' + CreateMenuItemResponse: + type: object + properties: + resource: + $ref: '#/components/schemas/MenuItem' + PatchMenuItemsRequest: + type: object + properties: + resource: + $ref: '#/components/schemas/MenuItem' + PatchMenuItemsResponse: + type: object + properties: + resource: + $ref: '#/components/schemas/MenuItem' + GetWorkspaceMenuItemStructureResponse: + type: object + properties: + menuItems: + type: array + items: + $ref: '#/components/schemas/MenuItem' + CreateWorkspaceMenuItemStructrueRequest: + type: object + properties: + menuItems: + type: array + items: + $ref: '#/components/schemas/MenuItem' + GetMenuItemResponse: + required: + - resource + type: object + properties: + resource: + $ref: '#/components/schemas/MenuItem' + Product: + type: object + properties: + modificationCount: + format: int32 + type: integer + creationDate: + $ref: '#/components/schemas/OffsetDateTime' + creationUser: + type: string + modificationDate: + $ref: '#/components/schemas/OffsetDateTime' + modificationUser: + type: string + id: + type: string + productName: + type: string + baseUrl: + type: string + microfrontends: + type: array + minItems: 1 + items: + $ref: '#/components/schemas/Microfrontend' + Microfrontend: + type: object + properties: + id: + type: string + mfeId: + type: string + basePath: + type: string + CreateProductRequest: + required: + - productName + - baseUrl + type: object + properties: + productName: + type: string + baseUrl: + type: string + microfrontends: + type: array + items: + $ref: '#/components/schemas/CreateUpdateMicrofrontend' + CreateUpdateMicrofrontend: + required: + - mfeId + - basePath + type: object + properties: + mfeId: + type: string + basePath: + type: string + CreateUpdateProductResponse: + required: + - resource + type: object + properties: + resource: + $ref: '#/components/schemas/Product' + GetProductsResponse: + type: array + items: + $ref: '#/components/schemas/Product' + UpdateProductRequest: + required: + - baseUrl + - modificationCount + type: object + properties: + modificationCount: + format: int32 + type: integer + baseUrl: + type: string + microfrontends: + type: array + items: + $ref: '#/components/schemas/CreateUpdateMicrofrontend' + WorkspaceSnapshot: + type: object + properties: + id: + type: string + minLength: 10 + description: ID of the request + created: + $ref: '#/components/schemas/OffsetDateTime' + workspaces: + type: object + nullable: false + additionalProperties: + $ref: '#/components/schemas/EximWorkspace' + ImportMenuResponse: + type: object + properties: + id: + type: string + minLength: 10 + description: ID of the request + status: + $ref: '#/components/schemas/ImportResponseStatus' + ImportWorkspaceResponse: + type: object + properties: + id: + type: string + minLength: 10 + description: ID of the request + workspaces: + additionalProperties: + $ref: '#/components/schemas/ImportResponseStatus' + menus: + additionalProperties: + $ref: '#/components/schemas/ImportResponseStatus' + ImportResponseStatus: + type: string + enum: + - UPDATED + - CREATED + - SKIPPED + - ERROR + EximWorkspace: + type: object + properties: + name: + type: string + description: + type: string + theme: + type: string + homePage: + type: string + baseUrl: + type: string + companyName: + type: string + phoneNumber: + type: string + rssFeedUrl: + type: string + footerLabel: + type: string + logoUrl: + type: string + address: + $ref: '#/components/schemas/EximWorkspaceAddress' + workspaceRoles: + type: string + subjectLinks: + uniqueItems: true + maxItems: 3 + type: array + items: + $ref: '#/components/schemas/EximSubjectLink' + imageUrls: + uniqueItems: true + type: array + items: + type: string + menu: + $ref: '#/components/schemas/MenuSnapshot' + EximWorkspaceAddress: + type: object + properties: + street: + type: string + streetNo: + type: string + city: + type: string + country: + type: string + postalCode: + type: string + EximSubjectLink: + type: object + properties: + label: + type: string + url: + type: string + MenuSnapshot: + type: object + properties: + id: + type: string + minLength: 10 + description: ID of the request + created: + $ref: '#/components/schemas/OffsetDateTime' + menu: + $ref: '#/components/schemas/EximMenuStructure' + EximMenuStructure: + type: object + properties: + menuItems: + type: array + items: + $ref: '#/components/schemas/EximWorkspaceMenuItem' + EximWorkspaceMenuItem: + type: object + properties: + key: + type: string + name: + type: string + description: + type: string + url: + type: string + workspaceName: + type: string + applicationId: + type: string + disabled: + type: boolean + position: + format: int32 + type: integer + permission: + type: string + badge: + type: string + scope: + $ref: '#/components/schemas/EximScope' + workspaceExit: + type: boolean + i18n: + type: object + additionalProperties: + type: string + children: + type: array + items: + $ref: '#/components/schemas/EximWorkspaceMenuItem' + EximScope: + enum: + - WORKSPACE + - APP + - PAGE + type: string + ExportWorkspacesRequest: + type: object + properties: + names: + type: array + uniqueItems: true + items: + type: string + includeMenus: + type: boolean + default: false + Scope: + enum: + - WORKSPACE + - APP + - PAGE + type: string + PagingResponse: + type: object + properties: + totalElements: + format: int64 + type: integer + number: + format: int32 + type: integer + size: + format: int32 + type: integer + totalPages: + format: int64 + type: integer + ProblemDetailResponse: + type: object + properties: + errorCode: + type: string + detail: + type: string + params: + type: array + items: + $ref: '#/components/schemas/ProblemDetailParam' + invalidParams: + type: array + items: + $ref: '#/components/schemas/ProblemDetailInvalidParam' + ProblemDetailParam: + type: object + properties: + key: + type: string + value: + type: string + ProblemDetailInvalidParam: + type: object + properties: + name: + type: string + message: + type: string + ValidationConstraint: + type: object + properties: + name: + type: string + message: + type: string + OffsetDateTime: + format: date-time + type: string + example: 2022-03-10T12:15:50-04:00 + parameters: + pageNumber: + in: query + name: pageNumber + required: false + schema: + type: integer + format: int32 + default: 0 + pageSize: + in: query + name: pageSize + required: false + schema: + type: integer + format: int32 + default: 100 + id: + in: path + name: id + required: true + schema: + type: string + name: + in: path + name: name + required: true + schema: + type: string + menuItemId: + in: path + name: menuItemId + required: true + schema: + type: string + productId: + in: path + name: productId + required: true + schema: + type: string diff --git a/src/assets/env.json b/src/assets/env.json new file mode 100644 index 00000000..07b51c1a --- /dev/null +++ b/src/assets/env.json @@ -0,0 +1,7 @@ +{ + "APP_BASE_HREF": "${APP_BASE_HREF}", + "KEYCLOAK_REALM": "${KEYCLOAK_REALM}", + "KEYCLOAK_URL": "${KEYCLOAK_URL}", + "KEYCLOAK_CLIENT_ID": "${KEYCLOAK_CLIENT_ID}", + "KEYCLOAK_ENABLE_SILENT_SSO": "true" +} diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json new file mode 100644 index 00000000..863f44a0 --- /dev/null +++ b/src/assets/i18n/de.json @@ -0,0 +1,614 @@ +{ + "ACTIONS": { + "LABEL": "Aktionen", + "CONFIRMATION": { + "NO": "Nein", + "YES": "Ja", + "NO.TOOLTIP": "Abbruch der Aktion", + "YES.TOOLTIP": "Fortfahren mit der Aktion" + }, + "COPY": { + "LABEL": "Kopieren", + "DATA": "Mit den Daten ein neues {{TYPE}} anlegen", + "CLIPBOARD": "In die Zwischenablage kopieren" + }, + "CREATE": { + "LABEL": "Erstellen", + "PORTAL": "Workspace erstellen", + "THEME": "Theme erstellen", + "MENU": "Menüeintrag erstellen", + "PORTAL.TOOLTIP": "Ein neuen Workspace erstellen", + "THEME.TOOLTIP": "Ein neues Theme erstellen", + "MENU.TOOLTIP": "Ein neuen Menüeintrag erstellen", + "MESSAGE": { + "THEME_ALREADY_EXIST": "Ein Theme mit diesem Namen existert schon", + "MENU_ALREADY_EXIST": "Ein Menüeintrag mit diesem Namen/ID existert schon", + "CREATE_OK": "Das {{TYPE}} wurde erfolgreich erstellt", + "CREATE_NOK": "Ein Fehler ist aufgetreten. Das {{TYPE}} wurde nicht erstellt.", + "MENU_CREATE_OK": "Der Menüeintrag wurde erfolgreich erstellt", + "MENU_CREATE_NOK": "Ein Fehler ist aufgetreten. Der Menüeintrag wurde nicht erstellt." + } + }, + "DELETE": { + "LABEL": "Löschen", + "TOOLTIP": "{{TYPE}} löschen", + "MENU_ITEM": "Menüeintrag löschen", + "MESSAGE": "Möchten Sie \"{{ITEM}}\" löschen?", + "MESSAGE_INFO": "Diese Aktion kann nicht rückgängig gemacht werden!", + "MESSAGE_NOK": "Workspace konnte nicht gelöscht werden", + "MESSAGE_OK": "Workspace erfolgreich gelöscht", + "MENU_DELETE_OK": "Der Menüeintrag wurde erfolgreich gelöscht", + "MENU_DELETE_NOK": "Ein Fehler ist aufgetreten. Der Menüeintrag wurde nicht gelöscht." + }, + "EDIT": { + "LABEL": "Bearbeiten", + "TOOLTIP": "Die Eigenschaften bearbeiten", + "MESSAGE": { + "CHANGE_OK": "Der Workspace wurde erfolgreich geändert", + "CHANGE_NOK": "Ein Fehler ist aufgetreten. Der Workspace wurde nicht geändert.", + "MENU_CHANGE_OK": "Der Menüeintrag wurde erfolgreich geändert", + "MENU_CHANGE_NOK": "Ein Fehler ist aufgetreten. Der Menüeintrag wurde nicht geändert." + } + }, + "EXPORT": { + "LABEL": "Export", + "TOOLTIP": "Definition als JSON herunterladen", + "THEME": "Theme exportieren", + "MENU": "Menüstruktur exportieren", + "PORTAL": "Die Workspace-Definition im JSON Format herunterladen.", + "THEME_INCLUDE": "Die Theme-Definition in den Export einschließen" + }, + "IMPORT": { + "LABEL": "Import", + "TOOLTIP": "Definition als JSON hochladen", + "THEME": "Theme importieren", + "MENU": "Menüstruktur importieren", + "PORTAL": "Die Workspace-Definition im JSON Format importieren." + }, + "NAVIGATION": { + "CLOSE": "Schließen", + "CLOSE.TOOLTIP": "Dialog schließen", + "CLOSE_WITHOUT_SAVE": "Dialog ohne Speichern schließen", + "BACK": "Zurück", + "NEXT": "Weiter", + "NEXT.TOOLTIP": "Nächste Seite", + "BACK.TOOLTIP": "Vorherige Seite", + "DETAILS.TOOLTIP": "Anzeige Details", + "NEW.TOOLTIP": "Erstelle neuen Eintrag", + "GOTO_MENU": "Zum Menü Management wechseln", + "GOTO_MENU_ITEM": "Zur Detailansicht wechseln (im Menü Management)", + "GOTO_THEME": "Zum Theme wechseln", + "OPEN_IN_NEW_TAB": "In neuem TAB öffnen", + "MOVE_UP": "Nach oben verschieben", + "MOVE_DOWN": "Nach unten verschieben" + }, + "SEARCH": { + "ERROR": "Daten nicht abrufbar", + "FILTER": "Filter", + "FILTER_OF": "Filter für ", + "FILTER_CLEAR": "Filter entfernen", + "NO_DATA": "Keine Daten", + "RELOAD": "Daten neu laden", + "RELOAD.OK": "Daten erfolgreich geladen", + "SORT_BY": "Sortiert nach", + "SORT_DIRECTION_ASC": "aufsteigend", + "SORT_DIRECTION_DESC": "absteigend" + }, + "TREE": { + "COLLAPSE_ALL": "Alles zuklappen", + "COLLAPSE_ALL.TOOLTIP": "Alle Ebenen zuklappen", + "EXPAND_ALL": "Alles aufklappen", + "EXPAND_ALL.TOOLTIP": "Alle Ebenen aufklappen" + }, + "CANCEL": "Abbrechen", + "CHOOSE": "Auswählen", + "CLEAR_CACHE": "Cache entfernen", + "CONFIRM": "Bestätigen", + "LOADING": "...wird geladen", + "RELOAD": "Neuladen", + "SAVE": "Speichern", + "SAVE_AS": "Speichern als ...", + "UPLOAD": "Hochladen", + "TOOLTIPS": { + "CANCEL": "Die Aktion abbrechen", + "CANCEL_AND_CLOSE": "Abbrechen und Dialog schließen", + "CANCEL_WITHOUT_SAVE": "Die Aktion ohne Speichern abbrechen", + "SAVE": "Die Änderungen speichern", + "SAVE_AS": "Speichern als neues {{TYPE}}" + } + }, + "BREADCRUMBS": { + "CREATE": "Neu", + "DETAIL": "Details", + "MENU": "Menü", + "EDIT": "Ändern", + "ENABLE_DRAG_DROP": "Drag&Drop aktivieren", + "SAVE_TREE_STRUCTURE": "Baumstruktur speichern" + }, + "CREATE": { + "MENU_CREATE_ERROR": "Ein Fehler ist aufgetreten, der Menüeintrag wurde nicht erstellt", + "MENU_CREATE_SUCCESS": "Menüeintrag wurde erfolgreich erstellt", + "MENU_CREATION": "Menüeintrag Erstellung", + "MENU_CREATION_INFO": "Möchten Sie fortfahren und ein Menüeintrag erstellen?", + "MENU_ICON": "Menüeintrag erstellen" + }, + "DETAIL": { + "CREATION_DATE": "Erstellt am", + "CREATION_USER": "Erstellt von", + "MODIFICATION_DATE": "Geändert am", + "MODIFICATION_USER": "Geändert von", + "TOOLTIPS": { + "CREATION_DATE": "Zeitpunkt der Erstellung", + "CREATION_USER": "Name des Benutzers der Erstellung", + "MODIFICATION_DATE": "Zeitpunkt der letzten Änderung", + "MODIFICATION_USER": "Name des Benutzers der letzten Änderung" + }, + "MENU_NOT_EXIST": "Kein Menü definiert", + "MFES_NOT_EXIST": "Keine Produkt-Module definiert", + "ROLES_NOT_EXIST": "Keine Rollen definiert", + "ADD": "Hinzufügen", + "ADD_ROLE": "Rolle hinzufügen", + "DELETE_ROLE_INFO": "Rolle wurde erfolgreich entfernt", + "DELETE_ROLE_MESSAGE": "Wenn Sie die Rolle entfernen, wird sie auch aus allen Menüelementen entfernt, in denen sie verwendet wird. Sind Sie sicher, dass Sie fortfahren möchten?", + "DETAILS": "Details", + "EMPTY_TRANSLATION": "Es gibt bereits eine leere Übersetzung.", + "ERROR_FIND_MENU": "Menüeintrag mit ID wurde nicht gefunden:", + "ERROR_FIND_PORTAL": "Workspace mit Workspace-ID wurde nicht gefunden: ", + "HOME_PAGE": "zur Workspace-Homepage", + "HOME_PAGE_NOT_DEFINIED": "Homepage des Workspaces ist nicht definiert", + "I18N": "Internationalisierung", + "I18N_EDIT_ERROR": "Fehler, die Übersetzungen wurden nicht aktualisiert", + "I18N_EDIT_SUCCESS": "Übersetzungen erfolgreich bearbeitet", + "ID_CHANGE_MESSAGE": "Die Änderung der Workspace-ID wird zu einer Änderung der Workspace-ID für folgende Menüeinträge führen: ", + "ID_CONFIRMATION_MESSAGE": "Sind Sie sicher, dass Sie weitermachen wollen?", + "LABEL": "Beschriftung", + "LANGUAGE": "Sprache", + "MENU_EDIT_ERROR": "Fehler bei der Bearbeitung eines Menüeintrags", + "MENU_EDIT_SUCCESS": "Menüeintrag wurde erfolgreich bearbeitet", + "MENU_ITEM_DETAILS": "Details", + "MENU_ITEM_HEADER": "Header", + "MENU_REMOVE_ERROR": "Fehler beim Löschen eines Menüeintrags", + "MENU_REMOVE_SUCCESS": "Menüeintrag erfolgreich gelöscht", + "NEW_ROLE": "Neue Rolle", + "NEW_ROLE_DUPLICATED": "Rolle existiert bereits für diesen Workspace", + "NEW_ROLE_ERROR": "Die neue Rolle sollte mindestens ein Zeichen haben und darf kein ',' Symbol oder nur Leerzeichen enthalten", + "PORTAL_PERMISSION_SYNC_ERROR": "Fehler beim Synchronisierung von Berechtigungen", + "PORTAL_PERMISSION_SYNC_SUCCESS": "Berechtigungen wurden erfolgreich synchronisiert", + "ROLES": "Rollen", + "ROLES_ADD_ROLE": "Rolle hinzufügen", + "ROLES_DELETE_ROLE": "Rolle löschen", + "ROLES_EDIT_ERROR": "Fehler, die Rollen wurden nicht aktualisiert", + "ROLES_EDIT_SUCCESS": "Rollen erfolgreich bearbeitet", + "ROLE_NAME": "Rollenname", + "SELECT_ICON": "Badge-Icon auswählen", + "THEME_CHECKBOX_HEADER": "Export Workspace Definition", + "THEME_CHECKBOX_MESSAGE": "Die aktuelle Workspace Definition im JSON Format herunterladen. Sie können auch die Theme-Definition in den Download integrieren.", + "THEME_LOADING": "...lädt", + "THEME_NOT_AVALIABLE": "keine verfügbaren Themes ", + "THEME_NOT_SPECIFIED_MESSAGE": "Theme kann nicht heruntergeladen werden, weil es im Workspace nicht angegeben wurde", + "TRANSLATION": "Übersetzung", + "URL": "URL" + }, + "GENERAL": { + "CREATION_DATE": "Erstellt am", + "CREATION_USER": "Erstellt von", + "MODIFICATION_DATE": "Geändert am", + "MODIFICATION_USER": "Geändert von", + "BOOLEAN": { + "TRUE": "Ja", + "FALSE": "Nein" + }, + "CLEAR_CACHE": "Cache entfernen", + "COPY": "Kopieren", + "COPY_OF": "Kopie von ", + "ERROR": "Fehler: ", + "FILTER_PLACEHOLDER": "Filter", + "FORM_PATTERN_INVALID": " darf nur aus Buchstaben, Zahlen, Unterstrichen und Balken bestehen.", + "FORM_VALIDATION": "Daten können nicht leer oder ungültig sein", + "FORM_VALIDATION_EMPTY": " können nicht leer sein", + "FORM_VALIDATION_INVALID": " können nicht ungültig sein", + "NO_PERM": "Es wurde keine Berechtigungen erteilt, um diese Seite anschauen zu können. Fehlende Berechtigungen:", + "SELECT_ITEM": "Wählen Sie den Eintrag", + "SWITCH_TO_EDIT": "In den Bearbeitungsmodus schalten", + "SYNC_PERMISSIONS": "Berechtigungen synchronisieren", + "PAGE_REPORT_TEMPLATE_0": "Keine Zeilen", + "PAGE_REPORT_TEMPLATE_1_1": "{totalRecords} Zeile", + "PAGE_REPORT_TEMPLATE_n_1": "{totalRecords} Zeilen", + "PAGE_REPORT_TEMPLATE_n_n": "{totalRecords} Zeilen / {totalPages} Seiten", + "TOOLTIP": { + "FILTER": "Filterfelder: ", + "FILTER_CLEAR": "Filter entfernen", + "VIEW_MODE_GRID": "Kachelansicht", + "VIEW_MODE_LIST": "Listenansicht", + "VIEW_MODE_TABLE": "Tabellenansicht", + "VIEW_MODE_TREE": "Baumansicht" + } + }, + "MENU": { + "HEADER": " Menü", + "SUBHEADER": "Menüstruktur verwalten", + "MENU_JSON_DOWNLOAD": "Menüstruktur im JSON Format herunterladen", + "MENU_JSON_UPLOAD": "Menüstruktur im JSON Format hochladen" + }, + "MENU_ITEM": { + "ANY_VALUE": "", + "APP": "APP", + "APPLICATION": "Applikation", + "APPLICATION_ID": "Applikation Id", + "BADGE": "Badge", + "CREATE_CHILD_ITEM": "Neues Kind Item", + "CREATION_DATE": "Erstellungsdatum", + "CREATION_USER": "Erstellungsbenutzer", + "DESCRIPTION": "Beschreibung", + "DISABLED": "Deaktiviert", + "EMPTY": "Leer", + "ID": "Id", + "MENU_ID": "Menü-Id", + "MENU_NAME": "Menüname", + "MODIFICATION_DATE": "Modifikationsdatum", + "MODIFICATION_USER": "Modifikationsbenutzer", + "NO": "Nein", + "PAGE": "SEITE", + "PARENT_ITEM": "Eltern-Menü", + "PARENT_ITEM_ID": "Eltern-Menü ID", + "PARENT_NAME": "Elternteilname", + "PORTAL": "PORTAL", + "PORTAL_EXIT": "Externer Link", + "PORTAL_ID": "Workspace ID", + "PORTAL_NAME": "Workspace Name", + "POSITION": "Position", + "SCOPE": "Umfang", + "URL": "Url", + "WITHOUT_PARENT": "Ohne Elternteil", + "YES": "Ja" + }, + "PORTAL_IMPORT": { + "IMPORT_PORTAL": "Workspace Import", + "IMPORT_THEME": "Import Theme", + "FROM_JSON": "aus einer JSON Datei", + "IMPORT": "Import", + "IMPORT_TOOLTIP": "Eine Workspace-Definition importieren", + "IMPORT_RESTART": "Neu", + "IMPORT_RESTART_TOOLTIP": "Import-Vorgang neu beginnen", + "IMPORT_CLOSE": "Dialog ohne Änderungen schließen", + "START_IMPORT": "Import starten", + "CHOOSE_FILE": "Datei wählen", + "DELETE_FILE": "Datei entfernen", + "PREVIEW": "Vorschau und Anpassung", + "PREVIEW_MENU": "Menüstruktur", + "CONFIRMATION": "Bestätigung", + "SUMMARY": "Zusammenfassung", + "PORTAL_NAME": "Workspace Name", + "PORTAL_IMPORT_OK": "Die Workspace-Definition wurde geprüft und kann importiert werden.", + "PORTAL_EXISTS_MESSAGE": "Ein Workspace mit diesem Namen existiert bereits. Dessen Definition wird überschrieben.", + "THEME_EXISTS_MESSAGE": "Ein Theme mit diesem Namen existiert bereits. Dessen Definition wird überschrieben.", + "TENANT_EXISTS_MESSAGE": "Workspace mit diesem Namen und mit dieser Tenant Id existiert bereits. Dessen Definition wird überschrieben.", + "BASE_URL_EXISTS_MESSAGE": "Ein Workspace mit dieser Base URL existiert bereits. Eine erneute Verwendung wird wahrscheinlich zu Problemen führen.", + "BASE_URL_MISSING": "Eine Base URL wird benötigt.", + "SYNCHRONIZE_PERMISSIONS": "Berechtigungen synchronisieren", + "INVALID_FILE": "Ungültige Datei", + "PORTAL_IMPORT_CREATE_SUCCESS": "Der Workspace wurde erfolgreich erstellt.", + "PORTAL_IMPORT_UPDATE_SUCCESS": "Der Workspace wurde erfolgreich aktualisiert.", + "PORTAL_IMPORT_ERROR": "Ein Fehler ist aufgetreten. Der Workspace konnte nicht erstellt/aktualisiert werden.", + "INVALID_IMPORT_FILE": "Die Workspace Import-Datei ist nicht gültig", + "MISSING": "fehlen.", + "INVALID_MENU_ITEMS": "Ein oder mehrere der Menü-Items sind nicht gültig.", + "IMPORT_THEME_SUCCESS": "Theme wurde erfolgreich importiert.", + "IMPORT_THEME_FAIL": "Ein Fehler ist aufgetreten. Das Theme wurde nicht importiert.", + "PORTAL_FORM_MISSING_FILES": " Workspace- oder Theme-Datei fehlen.", + "THEME_COLOR_PRIMARY": "Primärfarbe", + "THEME_COLOR_SECONDARY": "Sekundärfarbe", + "THEME_COLOR_TEXT": "Textfarbe", + "THEME_COLOR_TOP_MENU": "Menüfarbe", + "THEME_COLOR_TOP_LEFT": "Linkfarbe", + "VALIDATION_JSON_ERROR": "JSON Formatfehler", + "VALIDATION_PORTAL_MISSING": "Keine Workspace-Definition enthalten/gefunden", + "VALIDATION_PORTAL_NAME_MISSING": "Kein Workspace-Name enthalten/gefunden", + "VALIDATION_PORTAL_ROLES_MISSING": "Keine Workspace-Rollen enthalten/gefunden", + "VALIDATION_THEME_NAME_MISSING": "Kein Theme-Name in der Theme-Definition enthalten/gefunden", + "VALIDATION_THEME_NOT_EXIST": "Keine Theme-Definition enthalten", + "VALIDATION_MENU_NOT_EXIST": "Keine Menü-Definition enthalten", + "VALIDATION_MENU_ITEM_KEY_MISSING": "In einem Menüeintrag fehlt der Key", + "VALIDATION_MENU_ITEM_NAME_MISSING": "In einem Menüeintrag fehlt der Name", + "VALIDATION_MENU_ITEM_WRONG_POSITION": "In einem Menüeintrag ist der Wert für 'position' keine Zahl", + "VALIDATION_MENU_ITEM_WRONG_DISABLED": "In einem Menüeintrag ist der Wert für 'disabled' kein Boolean", + "VALIDATION_MENU_ITEM_WRONG_PORTALEXIT": "In einem Menüeintrag ist der Wert für 'portalExit' kein Boolean", + "VALIDATION_RESULT": "Verarbeitung nicht möglich: " + }, + "PORTAL": { + "NOT_EXIST_MESSAGE": "Der Workspace wurde nicht gefunden.", + "HEADER": { + "DETAIL": "Anzeige und Bearbeitung der Workspace-Eigenschaften", + "DELETE": "Workspace löschen", + "EXPORT": "Workspace exportieren" + }, + "QUICK_LINKS": { + "GOTO_WORKSPACE": "Den Workspace in einem neuen TAB öffnen", + "GOTO_MENU": "Menüverwaltung anzeigen" + }, + "TABS": { + "DETAILS": "Eigenschaften", + "CONTACT": "Kontakt", + "INTERN": "Intern", + "MFES": "Registrierte Produkte", + "MENU": "Menü", + "ROLES": "Rollen", + "IMAGES": "Bilder", + "SUBJECTS": "Subjects" + }, + "ITEM": { + "BASE_URL": "Base URL", + "CITY": "Ort", + "COMPANY_NAME": "Firmenname", + "COUNTRY": "Land", + "DESCRIPTION": "Beschreibung", + "FOOTER_LABEL": "Fußzeile", + "HOME_PAGE": "Startseite", + "ID": "ID", + "IMAGE_URL": "Bild URL", + "LOGO": "Logo", + "LOGO_URL": "Logo URL", + "PHONE_NUMBER": "Telefonnummer", + "PORTAL": "Workspace", + "PORTAL_ID": "Workspace ID", + "PORTAL_NAME": "Workspace Name", + "POSTAL_CODE": "PLZ", + "RSS_FEED_URL": "RSS-Feed URL", + "STREET": "Straße", + "STREET_NO": "Hausnummer", + "TENANT_ID": "Tenant ID", + "THEME": "Theme" + }, + "MFE": { + "ACTIONS": "Aktionen", + "DISPLAY_NAME": "Angezeigename", + "MODULE_TYPE": "Modultyp", + "REMOTE_NAME": "Remote Name", + "REMOTE_BASE_URL": "Remote Base URL", + "BASE_URL": "Base URL", + "APP_ID": "Produkt ID", + "DEREGISTER": "Abmelden", + "DEREGISTER.HEADER": "Produkt-Modul abmelden", + "DEREGISTER.MESSAGE": "Möchten Sie das Produkt-Modul \"{{ITEM}}\" in diesem Workspace nicht mehr verwenden?", + "TOOLTIPS": { + "ACTIONS": "Detail-Aktionen", + "BASE_URL": "URL über die aus dem Workspace auf das Produkt-Modul zugegriffen wird. \nMuss mit einem '/' (Schrägstrich) beginnen.", + "REMOTE_BASE_URL": "Basis URL für dieses Produkt-Modul", + "DISPLAY_NAME": "Angezeigter Name des Produkt-Moduls", + "APP_ID": "Eindeutige ID des Produkts für die Verwendung im Berechtigungs Management. Alle Module des Produkts müssen hier die gleiche Produkt ID besitzen.", + "DEREGISTER": "Dieses Produkt-Modul in diesem Workspace nicht mehr verwenden" + } + }, + "MFES": { + "REGISTER": "Produkt-Modul registrieren", + "REGISTER.HEADER": "Produkt-Modul registrieren", + "REGISTER.TOOLTIP": "Ein Produkt-Modul für diesen Workspace verfügbar machen", + "AVAILABLE_MFES": "Produkt-Modul", + "AVAILABLE_MFES.TOOLTIP": "Liste der verfügbaren Produkt-Module", + "MFE_REGISTER": "Registrieren", + "MFE_MODULE_PATH": "Produkt-Modulpfad", + "MFE_FORWARD": "Alle URLs, die mit diesem Wert beginnen, werden zum Produkt-Modul mit der zugehörigen Base URL weitergeleitet - e.g. die Produkt-Modul Base URL ", + "MFE_FORWARD_1": " würde von folgenden URLs getroffen: ", + "MFE_FORWARD_2": " und ", + "MESSAGES": { + "NOTHING_REGISTERED": "Noch kein Produkt-Modul registriert", + "MFE_DOES_NOT_EXIST": "Das verknüpfte Produkt-Modul existiert nicht", + "MFE_LOAD_ERROR": "Das Laden der Produkt-Liste ist fehlgeschlagen", + "MFE_REGISTRATION_OK": "Das Produkt-Modul wurde erfolgreich registriert", + "MFE_REGISTRATION_NOK": "Bei der Registrierung des Produkt-Moduls ist ein Fehler aufgetreten", + "MFE_ALREADY_EXISTS": "Der Pfad wird bereits verwendet", + "MFE_DEREGISTRATION_OK": "Das Produkt-Modul wurde erfolgreich abgemeldet", + "MFE_DEREGISTRATION_NOK": "Bei der Abmeldung des Produkt-Moduls ist ein Fehler aufgetreten" + } + }, + "MENU": { + "HEADER": { + "EDIT": "Menüeintrag Details", + "CREATE": "Menüeintrag erstellen", + "TREE_MODAL": "Umordnen & Voransicht" + }, + "ACTION": { + "DELETE": "Menüeintrag löschen", + "DETAILS": "Anzeige Details", + "DISABLED": "Grün = Eintrag ist im Menü verfügbar - durch Klick veränderbar", + "NEW": "Neuen Menüeintrag erstellen", + "TREE_MODAL": "Umordnen & Voransicht", + "TREE_MODAL.TOOLTIP": "Menüeinträge per Drag & Drop umordnen und Ansicht in den konfigurierten Sprachen", + "PREVIEW.TOOLTIP": "Ansicht in den konfigurierten Sprachen", + "PREVIEW2.TOOLTIP": "Keine Übersetzung vorhanden", + "REORDER.TOOLTIP": "Menüeinträge per Drag & Drop umordnen" + }, + "DETAIL": { + "BADGE": "Icon", + "DESCRIPTION": "Beschreibung", + "DISABLED": "Deaktiviert", + "MENU_ID": "Menü-ID", + "MENU_NAME": "Menüname", + "PARENT_ID": "Eltern-Menü ID", + "PARENT_NAME": "Eltern-Menü Name", + "PORTAL_NAME": "Workspace Name", + "PORTAL_EXIT": "Externer Link", + "POSITION": "Position", + "SCOPE": "Aktionsradius", + "URL": "URL", + "I18N": { + "ADD_LANGUAGE": "Sprache hinzufügen", + "REMOVE_LANGUAGE": "Sprache entfernen" + }, + "TOOLTIP": { + "BADGE": "Icon aus der PrimeNG Bibliothek welches neben dem Menünamen angezeigt werden soll", + "DESCRIPTION": "Zusatzinformationen", + "DISABLED": "Wenn gesetzt, dann wird der Menüpunkt inaktiv angezeigt", + "MENU_ID": "Ein eindeutiger Identifikator des Menüpunkts", + "MENU_NAME": "Angezeigter Name", + "PARENT_ID": "Der Identifier des übergeordneten Menüpunkts", + "PARENT_NAME": "Der Name des übergeordneten Menüpunkts", + "PORTAL_NAME": "Name des Workspaces", + "PORTAL_EXIT": "Wenn gesetzt, dann wird mit dem Menüpunkt der Workspace-Kontext verlassen", + "POSITION": "Eine ganzzahlige Nummer welche die Position des Menüpunkts in der Menüstruktur festlegt", + "SCOPE": "Aktionsradius", + "URL": "Die durch den Menüpunkt aufgerufene URL. Kann intern (via registriertes Produkt-Modul) oder extern (Verlassen des Workspaces) sein" + } + }, + "I18N": "I18n", + "EXTERN": "Extern", + "POSITION.TOOLTIP": "Der Position-Pfad des Menü-Eintrags im Format [Eltern-Position.]Position", + "URL.TOOLTIP": "Die URL die beim Aktivieren aufgerufen wird", + "MFE.TOOLTIP": "Indikator ob die Menü-URL durch ein registriertes Produkt-Modul angeboten wird", + "I18N.TOOLTIP": "Übersetzungen vorhanden?", + "I18N.ROW.TOOLTIP": "Mindestens eine Übersetzung ist vorhanden", + "EXTERN.TOOLTIP": "Wenn diese Option aktiviert ist, wird der Workspace verlassen", + "PREVIEW_LANG": "Sprache", + "PREVIEW_LANG.EMPTY": "Keine Übersetzung vorhanden", + "PREVIEW_LANG.TOOLTIP": "Liste der verwendeten Sprachen" + } + }, + "IMAGE": { + "ADDING_IMAGE": "Bild hinzufügen", + "ADDING_IMAGE_COMPUTER": "Bild vom Computer hinzufügen", + "DELETE_IMAGE": "Bild löschen", + "IMAGE_NOT_FOUND": "Bild nicht gefunden", + "SELECT_IMAGE": "Bild auswählen", + "UPLOADED": "Datei hochgeladen", + "LOGO": "Logo-Bild" + }, + "LOGO": { + "LOGO_URL": "Logo URL", + "FAVICON_URL": "Favicon URL", + "UPLOAD_FAIL": "Die Datei wurde nicht erfolgreich hochgeladen", + "UPLOAD_SUCCESS": "Die Datei wurde erfolgreich hochgeladen", + "TOOLTIPS": { + "IMAGE": "Logo", + "PLACEHOLDER": "Bild Platzhalter", + "UPLOAD": "Bild auswählen und hochladen" + } + }, + "SEARCH": { + "ACTION": "Aktion", + "ANY_VALUE": "", + "DROPDOWN_PLACEHOLDER": "Irgendein", + "EMPTY": "leer", + "ERROR": "Daten nicht abrufbar", + "FILTER": "Filter", + "FILTER_OF": "Filter für ", + "MENU_MANAGEMENT": "Menü Verwaltung", + "MENU_MANAGEMENT_DETAILS": "Erstellung und Bearbeitung von Menüeinträgen zu einem Workspace", + "MSG_NO_RESULTS": "Die Suche ergab keine Treffer", + "NO_DATA": "Keine Ergebnisse", + "NO_PORTALS": "Es sind keine Workspaces verfügbar", + "PORTAL": "Workspace", + "PORTALS_LIST": "Liste von Workspaces", + "PORTAL_MANAGEMENT": "Workspace Verwaltung", + "PORTAL_MANAGEMENT_DETAILS": "Erstellung und Bearbeitung von Workspaces", + "PORTAL_SEARCH": "Workspace Verwaltung", + "RESET": "Zurücksetzen", + "RESET_TOOLTIP": "Kriterien zurücksetzen", + "ROOT_FILTER": "Top-Level-Einträge anzeigen", + "SEARCH": "Suchen", + "SEARCH_TOOLTIP": "Suchen mit vorgegebenen Kriterien", + "SHOW_DETAILS": "Details anzeigen", + "SHOW_LIST": "Als Liste darstellen", + "SHOW_TREE": "Als Baum darstellen", + "SORT_BY": "Sortiert nach", + "SORT_DIRECTION_ASC": "aufsteigend", + "SORT_DIRECTION_DESC": "absteigend" + }, + "THEME": { + "SEARCH.HEADER": "Theme Verwaltung", + "SEARCH.SUBHEADER": "Erstellung und Bearbeitung von Themes", + "DESIGNER.EDIT.SUBHEADER": "Theme Details ändern", + "DESIGNER.NEW.SUBHEADER": "Ein neues Theme erstellen", + "DETAIL.SUBHEADER": "Theme Details", + "DETAIL.AUTO_APPLY": "Änderungen automatisch anwenden", + "DETAIL.AUTO_APPLY.TOOLTIP": "Wenn diese Option eingeschaltet ist, dann werden alle Änderungen (Schriftart, Farben) automatisch auf die aktuelle Seite angewendet.", + "DETAIL.AUTO_APPLY_CURRENT_THEME": "Änderungen werden beim Speichern sofort angewendet, weil es das aktuell benutzte Theme ist", + "DETAIL.THEME_SELECTOR": "Ein Theme als Vorlage wählen", + "LOAD_ERROR": "Theme konnte nicht geladen werden", + "NOT_FOUND": "Theme nicht gefunden", + "NO_PROPERTIES": "Keine Farbwerte enthalten", + "TABS": { + "PROPERTIES": "Eigenschaften", + "VARIABLES": "Theme Variablen" + }, + "TEMPLATE": { + "SELECTOR": "Theme-Vorlage wählen", + "SELECTOR.TOOLTIP": "Ein vorhandenes Theme als Vorlage verwenden", + "CONFIRMATION.HEADER": "Theme als Vorlage benutzen", + "CONFIRMATION.MESSAGE.NEW": "Sollen alle vorhandenen Werte durch die Werte von \"{{ITEM}}\" ersetzt werden?", + "CONFIRMATION.MESSAGE.EDIT": "Sollen alle vorhandenen Farbwerte durch die Werte von \"{{ITEM}}\" ersetzt werden?" + }, + "GROUPS": { + "BASE": "Basis", + "FONT": "Font" + }, + "ID": "ID", + "NAME": "Name", + "THEME_NAME": "Themename", + "VERSION": "Version", + "DESCRIPTION": "Beschreibung", + "CSS_FILE": "CSS Datei", + "CREATION_DATE": "Erstellt am", + "CREATION_USER": "Erstellt von", + "MODIFICATION_DATE": "Geändert am", + "MODIFICATION_USER": "Geändert von", + "PORTALS": "Verwendet in Workspaces", + "TOOLTIPS": { + "ID": "Eindeutige technische ID des Themes", + "NAME": "Eindeutiger Name des Themes", + "VERSION": "Version des Themes", + "DESCRIPTION": "Beschreibung des Themes", + "PORTALS": "Workspaces die das Theme benutzen", + "CSS_FILE": "CSS Datei", + "CREATION_DATE": "Erstellt am", + "CREATION_USER": "Erstellt von", + "MODIFICATION_DATE": "Geändert am", + "MODIFICATION_USER": "Geändert von" + } + }, + "TREE": { + "CLEAR_CACHE_INFO": "Cache wurde entfernt", + "CONFIRM_HEADER": "Aktualisierungsdialog", + "EDIT_ERROR": "Fehler bei der Bearbeitung der Menüstruktur", + "EDIT_SUCCESS": "Menüstruktur erfolgreich bearbeitet", + "FETCH_ERROR": "Fehler beim Abrufen von Menüeinträgen", + "NO_MENU_ITEMS": "Es sind keine Menüeinträge verfügbar", + "PORTAL_CREATION_INFO": "Möchten Sie fortsetzen und die Workspace-Menüstruktur aktualisieren?", + "STRUCTURE_UPLOAD_ERROR": "Fehler ist aufgetreten, Menüstruktur wurde nicht überschrieben", + "STRUCTURE_UPLOAD_HEADER": "Baumstruktur hochladen", + "STRUCTURE_UPLOAD_INFO": "Bitte laden Sie die JSON-Datei von Ihrem Gerät hoch. Bitte beachten Sie, dass nach dem Upload die gesamte Menüstruktur überschrieben wird.", + "STRUCTURE_UPLOAD_SUCCESS": "Menüstruktur wurde erfolgreich überschrieben", + "TREE_VIEW": "Menüstruktur - Baum" + }, + "VALIDATION": { + "HINTS": { + "FORMAT_URL": "Format: " + }, + "ERRORS": { + "PARSE_ERROR": "Parserfehler: Die enthaltene Struktur entspricht nicht dem erwarteten Format.", + "INTERNAL_ERROR": "Interner Fehler", + "EMPTY_REQUIRED_FIELD": "Dieses Feld ist ein Pflichtfeld.", + "MAXIMUM_LENGTH": "Es sind nur {{chars}} Zeichen erlaubt.", + "MINIMUM_LENGTH": "Es sind mindestens {{chars}} Zeichen erforderlich.", + "PATTERN_ERROR": "Die Eingabe entspricht nicht dem benötigten Format.", + "FILETYPE_PATTERN_ERROR": "Die Datei entspricht nicht den erlaubten Formaten: .png, .jpg, .jpeg" + } + }, + "EXCEPTIONS": { + "HTTP_STATUS_0": { + "PORTALS": "Unbekanntes Problem beim Abrufen von Workspace-Daten - Bitte versuchen sie es noch einmal.", + "MENUS": "Unbekanntes Problem beim Abrufen von Menü-Daten - Bitte versuchen sie es noch einmal." + }, + "HTTP_STATUS_403": { + "PORTALS": "Sie haben keine Rechte um Workspaces zu sehen.", + "MENUS": "Sie haben keine Rechte um Menüs zu sehen." + }, + "HTTP_STATUS_404": { + "PORTALS": "Es konnten keine Workspaces gefunden werden.", + "MENUS": "Es konnten keine Menüs gefunden werden." + }, + "HTTP_STATUS_500": { + "PORTALS": "Unbekanntes Server-Problem beim Abrufen von Workspace-Daten - Bitte versuchen sie es noch einmal.", + "MENUS": "Unbekanntes Server-Problem beim Abrufen von Menü-Daten - Bitte versuchen sie es noch einmal." + } + } +} diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json new file mode 100644 index 00000000..2509d10f --- /dev/null +++ b/src/assets/i18n/en.json @@ -0,0 +1,614 @@ +{ + "ACTIONS": { + "LABEL": "Actions", + "CONFIRMATION": { + "NO": "No", + "YES": "Yes", + "NO.TOOLTIP": "Cancel the action", + "YES.TOOLTIP": "Proceed with the action" + }, + "COPY": { + "LABEL": "Copy", + "DATA": "Create a new {{TYPE}} with the data", + "CLIPBOARD": "Copy to clipboard" + }, + "CREATE": { + "LABEL": "Create", + "PORTAL": "Create Workspace", + "THEME": "Create Theme", + "MENU": "Create Menu Item", + "PORTAL.TOOLTIP": "Create a new Workspace", + "THEME.TOOLTIP": "Create a new Theme", + "MENU.TOOLTIP": "Create a new Menu Item", + "MESSAGE": { + "THEME_ALREADY_EXIST": "A Theme with that name already exists", + "MENU_ALREADY_EXIST": "A Menu Item with that name/id already exists", + "CREATE_OK": "The {{TYPE}} was created successfully", + "CREATE_NOK": "An error has occurred. The {{TYPE}} was not created.", + "MENU_CREATE_OK": "The Menu Item was created successfully", + "MENU_CREATE_NOK": "An error has occurred. The Menu Item was not created." + } + }, + "DELETE": { + "LABEL": "Delete", + "TOOLTIP": "Delete the Menu item", + "MENU_ITEM": "Delete Menu item", + "MESSAGE": "Do you want to delete \"{{ITEM}}\"?", + "MESSAGE_INFO": "This action cannot be undone!", + "MESSAGE_NOK": "Workspace could not be deleted", + "MESSAGE_OK": "Workspace deleted successfully", + "MENU_DELETE_OK": "The Menu Item was deleted successfully", + "MENU_DELETE_NOK": "An error has occurred. The Menu Item could not be deleted." + }, + "EDIT": { + "LABEL": "Edit", + "TOOLTIP": "Edit properties", + "MESSAGE": { + "CHANGE_OK": "The Workspace was changed successfully", + "CHANGE_NOK": "An error has occurred. The Workspace was not changed.", + "MENU_CHANGE_OK": "The Menu Item was changed successfully", + "MENU_CHANGE_NOK": "An error has occurred. The Menu Item was not changed." + } + }, + "EXPORT": { + "LABEL": "Export", + "TOOLTIP": "Export definition in JSON format", + "THEME": "Export Theme", + "MENU": "Export Menu structure", + "PORTAL": "Download the current Workspace definition in JSON format.", + "THEME_INCLUDE": "Include the Theme definition in the export" + }, + "IMPORT": { + "LABEL": "Import", + "TOOLTIP": "Upload definition in JSON format", + "THEME": "Import Theme", + "MENU": "Import Menu structure", + "PORTAL": "Import Workspace definition in JSON format." + }, + "NAVIGATION": { + "CLOSE": "Close", + "CLOSE.TOOLTIP": "Close dialog", + "CLOSE_WITHOUT_SAVE": "Close dialog without saving", + "BACK": "Back", + "NEXT": "Next", + "NEXT.TOOLTIP": "Next page", + "BACK.TOOLTIP": "Previous page", + "DETAILS.TOOLTIP": "Display details", + "NEW.TOOLTIP": "Create new entry", + "GOTO_MENU": "Go to Menu Management", + "GOTO_MENU_ITEM": "Go to detail view (in menu management)", + "GOTO_THEME": "Go to Theme", + "OPEN_IN_NEW_TAB": "Open in a new TAB", + "MOVE_UP": "Move up", + "MOVE_DOWN": "Move down" + }, + "SEARCH": { + "ERROR": "Data not available", + "FILTER": "Filter", + "FILTER_OF": "Filter for ", + "FILTER_CLEAR": "Clear Filter", + "NO_DATA": "No Data", + "RELOAD": "Reload data", + "RELOAD.OK": "Data successfully reloaded", + "SORT_BY": "Sort By", + "SORT_DIRECTION_ASC": "ascending", + "SORT_DIRECTION_DESC": "descending" + }, + "TREE": { + "COLLAPSE_ALL": "Collapse all", + "COLLAPSE_ALL.TOOLTIP": "Collapse all levels", + "EXPAND_ALL": "Expand all", + "EXPAND_ALL.TOOLTIP": "Expand all levels" + }, + "CANCEL": "Cancel", + "CHOOSE": "Choose", + "CLEAR_CACHE": "Clear Cache", + "CONFIRM": "Confirm", + "LOADING": "...is loading", + "RELOAD": "Reload", + "SAVE": "Save", + "SAVE_AS": "Save as ...", + "UPLOAD": "Upload", + "TOOLTIPS": { + "CANCEL": "Cancel action", + "CANCEL_AND_CLOSE": "Cancel and close dialog", + "CANCEL_WITHOUT_SAVE": "Cancel action without saving", + "SAVE": "Save changes", + "SAVE_AS": "Save as new {{TYPE}}" + } + }, + "BREADCRUMBS": { + "CREATE": "New", + "DETAIL": "Details", + "MENU": "Menu", + "EDIT": "Edit", + "ENABLE_DRAG_DROP": "Enable drag&drop", + "SAVE_TREE_STRUCTURE": "Save tree structure" + }, + "CREATE": { + "MENU_CREATE_ERROR": "An error occurred, the menu item was not created", + "MENU_CREATE_SUCCESS": "Menu item successfully created", + "MENU_CREATION": "Menu Item Creation", + "MENU_CREATION_INFO": "Would you like to continue and create a menu item?", + "MENU_ICON": "Create new Menu Item" + }, + "DETAIL": { + "CREATION_DATE": "Created on", + "CREATION_USER": "Created by", + "MODIFICATION_DATE": "Changed on", + "MODIFICATION_USER": "Changed by", + "TOOLTIPS": { + "CREATION_DATE": "Timestamp of the creation", + "CREATION_USER": "Name of the user of the creation", + "MODIFICATION_DATE": "Timestamp of the last change", + "MODIFICATION_USER": "Name of the user of the last change" + }, + "MENU_NOT_EXIST": "No menu defined", + "MFES_NOT_EXIST": "No Product Moduls defined", + "ROLES_NOT_EXIST": "No roles defined", + "ADD": "Add", + "ADD_ROLE": "Add role", + "DELETE_ROLE_INFO": "Role was successfully removed", + "DELETE_ROLE_MESSAGE": "If you remove the role, it will be also removed from any menu item where it is used. Are you sure that you want to proceed?", + "DETAILS": "Details", + "EMPTY_TRANSLATION": "There is already an empty translation.", + "ERROR_FIND_MENU": "Cannot find menuItem with ID: ", + "ERROR_FIND_PORTAL": "Cannot find Workspace with PORTAL ID: ", + "HOME_PAGE": "To Workspace homepage", + "HOME_PAGE_NOT_DEFINIED": "Workspace's homepage is not definied", + "I18N": "Internationalization", + "I18N_EDIT_ERROR": "Error occurred, translations weren't updated", + "I18N_EDIT_SUCCESS": "Translations edited successfully", + "ID_CHANGE_MESSAGE": "The changing of Workspace Id will result in changing Id for following menu items: ", + "ID_CONFIRMATION_MESSAGE": "Are you sure, that you want to continue? ", + "LABEL": "Label", + "LANGUAGE": "Language", + "MENU_EDIT_ERROR": "Menu item edition error", + "MENU_EDIT_SUCCESS": "Menu item edited successfully", + "MENU_ITEM_DETAILS": "Details", + "MENU_ITEM_HEADER": "Header", + "MENU_REMOVE_ERROR": "Error deleting menu item", + "MENU_REMOVE_SUCCESS": "Menu item successfully deleted", + "NEW_ROLE": "New role", + "NEW_ROLE_DUPLICATED": "Role already exists in this Workspace", + "NEW_ROLE_ERROR": "New role should has minimum one character and cannot contains ',' symbol or only white spaces", + "PORTAL_PERMISSION_SYNC_ERROR": "Error occurred, permissions were not synchronized", + "PORTAL_PERMISSION_SYNC_SUCCESS": "Permissions were sucessfully synchronized", + "ROLES": "Roles", + "ROLES_ADD_ROLE": "Add role", + "ROLES_DELETE_ROLE": "Delete role", + "ROLES_EDIT_ERROR": "Error occurred, roles weren't updated", + "ROLES_EDIT_SUCCESS": "Roles edited successfully", + "ROLE_NAME": "Role Name", + "SELECT_ICON": "Please select badge icon", + "THEME_CHECKBOX_HEADER": "Export Workspace Definition", + "THEME_CHECKBOX_MESSAGE": "Download the current Workspace definition as JSON file. You can also integrate the Theme definition.", + "THEME_LOADING": "...is loading", + "THEME_NOT_AVALIABLE": "no available themes", + "THEME_NOT_SPECIFIED_MESSAGE": "Theme cannot be exported because it was not specified in Workspace", + "TRANSLATION": "Translation", + "URL": "URL" + }, + "GENERAL": { + "CREATION_DATE": "Created on", + "CREATION_USER": "Created from", + "MODIFICATION_DATE": "Changed on", + "MODIFICATION_USER": "Changed from", + "BOOLEAN": { + "TRUE": "Yes", + "FALSE": "No" + }, + "CLEAR_CACHE": "Clear cache", + "COPY": "Copy", + "COPY_OF": "Copy of ", + "ERROR": "Error: ", + "FILTER_PLACEHOLDER": "Filter", + "FORM_PATTERN_INVALID": " may consist only of letters, numbers, underscores and dashes.", + "FORM_VALIDATION": "Data cannot be empty or invalid", + "FORM_VALIDATION_EMPTY": " can't be empty", + "FORM_VALIDATION_INVALID": " can't be invalid", + "NO_PERM": "No permission granted to view this page. Lacking permission:", + "SELECT_ITEM": "Select item", + "SWITCH_TO_EDIT": "Edit", + "SYNC_PERMISSIONS": "Synchronise permissions", + "PAGE_REPORT_TEMPLATE_0": "No rows", + "PAGE_REPORT_TEMPLATE_1_1": "{totalRecords} row", + "PAGE_REPORT_TEMPLATE_n_1": "{totalRecords} rows", + "PAGE_REPORT_TEMPLATE_n_n": "{totalRecords} rows / {totalPages} pages", + "TOOLTIP": { + "FILTER": "Filter fields: ", + "FILTER_CLEAR": "Clear Filter", + "VIEW_MODE_GRID": "Tile view", + "VIEW_MODE_LIST": "List view", + "VIEW_MODE_TABLE": "Table view", + "VIEW_MODE_TREE": "Tree view" + } + }, + "MENU": { + "HEADER": " Menu", + "SUBHEADER": "Manage the Menu Structure", + "MENU_JSON_DOWNLOAD": "Download Menu Structure as JSON file", + "MENU_JSON_UPLOAD": "Upload Menu Structure as JSON file" + }, + "MENU_ITEM": { + "ANY_VALUE": "", + "APP": "APP", + "APPLICATION": "Application", + "APPLICATION_ID": "Application Id", + "BADGE": "Badge", + "CREATE_CHILD_ITEM": "New Child Item", + "CREATION_DATE": "Creation Date", + "CREATION_USER": "Creation User", + "DESCRIPTION": "Description", + "DISABLED": "Disabled", + "EMPTY": "Empty", + "ID": "Id", + "MENU_ID": "Menu Id", + "MENU_NAME": "Menu Name", + "MODIFICATION_DATE": "Modification Date", + "MODIFICATION_USER": "Modification User", + "NO": "No", + "PAGE": "PAGE", + "PARENT_ITEM": "Parent Item", + "PARENT_ITEM_ID": "Parent Item ID", + "PARENT_NAME": "Parent Name", + "PORTAL": "PORTAL", + "PORTAL_EXIT": "External Link", + "PORTAL_ID": "Workspace ID", + "PORTAL_NAME": "Workspace Name", + "POSITION": "Position", + "SCOPE": "Scope", + "URL": "URL", + "WITHOUT_PARENT": "Without a parent", + "YES": "Yes" + }, + "PORTAL_IMPORT": { + "IMPORT_PORTAL": "Import Workspace", + "IMPORT_THEME": "Import Theme", + "FROM_JSON": "from JSON File", + "IMPORT": "Import", + "IMPORT_TOOLTIP": "Import a Workspace definition", + "IMPORT_RESTART": "New", + "IMPORT_RESTART_TOOLTIP": "Restart the import process", + "IMPORT_CLOSE": "Close dialog without changes", + "START_IMPORT": "Start Import", + "CHOOSE_FILE": "Choose file", + "DELETE_FILE": "Delete file", + "PREVIEW": "Preview & Adjustment", + "PREVIEW_MENU": "Menu Structure", + "CONFIRMATION": "Confirmation", + "SUMMARY": "Summary", + "PORTAL_NAME": "Workspace Name", + "PORTAL_IMPORT_OK": "The Workspace definition has been checked and can be imported.", + "PORTAL_EXISTS_MESSAGE": "A Workspace with this name already exists. Its definition is overwritten.", + "THEME_EXISTS_MESSAGE": "A theme with this name already exists. Its definition is overwritten.", + "TENANT_EXISTS_MESSAGE": "A Workspace with this name and Tenant Id already exists. Its definition is overwritten.", + "BASE_URL_EXISTS_MESSAGE": "A Workspace with this Base URL already exists. Using it again will likely cause problems.", + "BASE_URL_MISSING": "A Base URL is required.", + "SYNCHRONIZE_PERMISSIONS": "Synchronize permissions", + "INVALID_FILE": "Invalid file", + "PORTAL_IMPORT_CREATE_SUCCESS": "The Workspace was sucessfully created.", + "PORTAL_IMPORT_UPDATE_SUCCESS": "The Workspace was sucessfully updated.", + "PORTAL_IMPORT_ERROR": "An error occurred, the Workspace could not be created/updated.", + "INVALID_IMPORT_FILE": "The Workspace import file is invalid", + "MISSING": "missing.", + "INVALID_MENU_ITEMS": "One or more menu items are not valid", + "IMPORT_THEME_SUCCESS": "The theme was sucessfully imported.", + "IMPORT_THEME_FAIL": "An error occurred, the theme was not imported.", + "PORTAL_FORM_MISSING_FILES": " Workspace or Theme files are missing.", + "THEME_COLOR_PRIMARY": "Primary color", + "THEME_COLOR_SECONDARY": "Secondary color", + "THEME_COLOR_TEXT": "Text color", + "THEME_COLOR_TOP_MENU": "Topbar Menu color", + "THEME_COLOR_TOP_LEFT": "Topbar Link color", + "VALIDATION_JSON_ERROR": "JSON format error", + "VALIDATION_PORTAL_MISSING": "No Workspace definition included/found", + "VALIDATION_PORTAL_NAME_MISSING": "No Workspace name included/found", + "VALIDATION_PORTAL_ROLES_MISSING": "No Workspace roles included/found", + "VALIDATION_THEME_NAME_MISSING": "No theme name found/found in theme definition", + "VALIDATION_THEME_NOT_EXIST": "No theme definition included/found", + "VALIDATION_MENU_NOT_EXIST": "No menu definition included/found", + "VALIDATION_MENU_ITEM_KEY_MISSING": "The key is missing in a menu item", + "VALIDATION_MENU_ITEM_NAME_MISSING": "The name is missing in a menu item", + "VALIDATION_MENU_ITEM_WRONG_POSITION": "In a menu item, the value for 'position' is not a number", + "VALIDATION_MENU_ITEM_WRONG_DISABLED": "In a menu item, the value for 'disabled' is not a boolean", + "VALIDATION_MENU_ITEM_WRONG_PORTALEXIT": "In a menu item, the value for 'portalExit' is not a boolean", + "VALIDATION_RESULT": "Processing not possible: " + }, + "PORTAL": { + "NOT_EXIST_MESSAGE": "The Workspace was not found.", + "HEADER": { + "DETAIL": "Display and editing of the Workspace properties", + "DELETE": "Delete Workspace", + "EXPORT": "Export Workspace" + }, + "QUICK_LINKS": { + "GOTO_WORKSPACE": "Open Workspace in a new TAB", + "GOTO_MENU": "Display Menu Management" + }, + "TABS": { + "DETAILS": "Properties", + "CONTACT": "Contact", + "INTERN": "Internal", + "MFES": "Registered Products", + "MENU": "Menu", + "ROLES": "Roles", + "IMAGES": "Images", + "SUBJECTS": "Subjects" + }, + "ITEM": { + "BASE_URL": "Base URL", + "CITY": "City", + "COMPANY_NAME": "Company Name", + "COUNTRY": "Country", + "DESCRIPTION": "Description", + "FOOTER_LABEL": "Footer Label", + "HOME_PAGE": "Homepage", + "ID": "ID", + "IMAGE_URL": "Image URL", + "LOGO": "Logo", + "LOGO_URL": "Logo URL", + "PHONE_NUMBER": "Phone Number", + "PORTAL": "Workspace", + "PORTAL_ID": "Workspace ID", + "PORTAL_NAME": "Workspace Name", + "POSTAL_CODE": "Postal Code", + "RSS_FEED_URL": "RSS-Feed URL", + "STREET": "Street", + "STREET_NO": "Street No", + "TENANT_ID": "Tenant ID", + "THEME": "Theme" + }, + "MFE": { + "ACTIONS": "Actions", + "DISPLAY_NAME": "Display Name", + "MODULE_TYPE": "Modul Type", + "REMOTE_NAME": "Remote Name", + "REMOTE_BASE_URL": "Remote Base URL", + "BASE_URL": "Base URL", + "APP_ID": "Product", + "DEREGISTER": "Deregister", + "DEREGISTER.HEADER": "Deregister Product Module", + "DEREGISTER.MESSAGE": "Do you no longer want to use the Product Module \"{{ITEM}}\" in this Workspace?", + "TOOLTIPS": { + "ACTIONS": "Detail actions", + "BASE_URL": "URL used to access the Product Module from the Workspace. \nMust start with a '/' (slash)", + "REMOTE_BASE_URL": "Base URL for this Product Module", + "DISPLAY_NAME": "Displayed name of the Product Module", + "APP_ID": "Unique ID of the Product for use in permission management. All modules of the Product must have the same Product ID.", + "DEREGISTER": "Do not use these Product Module in this Workspace anymore" + } + }, + "MFES": { + "REGISTER": "Register Product Module", + "REGISTER.HEADER": "Register Product Module", + "REGISTER.TOOLTIP": "Make an Product Module available for this Workspace", + "AVAILABLE_MFES": "Product Module", + "AVAILABLE_MFES.TOOLTIP": "List of available Product Modules", + "MFE_REGISTER": "Register", + "MFE_MODULE_PATH": "Product Module Path", + "MFE_FORWARD": "All menu URLs starting with this value will be forwarded to the corresponding Product Module - e.g. the Product Module Base URL ", + "MFE_FORWARD_1": "would catch both of the following URLs: ", + "MFE_FORWARD_2": " and ", + "MESSAGES": { + "NOTHING_REGISTERED": "No Product Module registered yet", + "MFE_DOES_NOT_EXIST": "The assigned Product Module does not exist", + "MFE_LOAD_ERROR": "Failed to load Product Module list", + "MFE_REGISTRATION_OK": "The Product Module was successfully registered", + "MFE_REGISTRATION_NOK": "An error has occurred during Product Module registration", + "MFE_ALREADY_EXISTS": "The path is already in use", + "MFE_DEREGISTRATION_OK": "The Product Module was successfully deregistered", + "MFE_DEREGISTRATION_NOK": "An error has occurred during Product Module deregistration" + } + }, + "MENU": { + "HEADER": { + "EDIT": "Menu Item Details", + "CREATE": "Create Menu Item", + "TREE_MODAL": "Reorder & Preview" + }, + "ACTION": { + "DELETE": "Delete Menu Item", + "DETAILS": "Display details", + "DISABLED": "Green = Item is available in Menu - Changeable by click", + "NEW": "Create new Menu Item", + "TREE_MODAL": "Reorder & Preview", + "TREE_MODAL.TOOLTIP": "Reorder of Menu Items via Drag & Drop and Preview in configured languages", + "PREVIEW.TOOLTIP": "Preview in configured languages", + "PREVIEW2.TOOLTIP": "No translation available", + "REORDER.TOOLTIP": "Reorder of Menu Items via Drag & Drop" + }, + "DETAIL": { + "BADGE": "Icon", + "DESCRIPTION": "Description", + "DISABLED": "Deactivated", + "MENU_ID": "Menu ID", + "MENU_NAME": "Menu Name", + "PARENT_ID": "Parent Menu ID", + "PARENT_NAME": "Parent Menu Name", + "PORTAL_NAME": "Workspace Name", + "PORTAL_EXIT": "External Link", + "POSITION": "Position", + "SCOPE": "Scope", + "URL": "URL", + "I18N": { + "ADD_LANGUAGE": "Add Language", + "REMOVE_LANGUAGE": "Remove Language" + }, + "TOOLTIP": { + "BADGE": "Icon from the PrimeNG library which should be displayed next to the menu name", + "DESCRIPTION": "Additional informationen", + "DISABLED": "If set, the menu item is displayed inactive", + "MENU_ID": "A unique identifier of the menu item", + "MENU_NAME": "Displayed Name", + "PARENT_ID": "The identifier of the parent menu item", + "PARENT_NAME": "The name of the parent menu item", + "PORTAL_NAME": "Name of the Workspace", + "PORTAL_EXIT": "If set, the menu item exits the Workspace context", + "POSITION": "An integer number that determines the position of the menu item in the menu structure", + "SCOPE": "Scope", + "URL": "The URL accessed by the menu item. Can be internal (via registered Product Module) or external (leaving the Workspace)." + } + }, + "I18N": "I18n", + "EXTERN": "Extern", + "POSITION.TOOLTIP": "Position path of the menu item in format [parent item.]item ", + "URL.TOOLTIP": "The URL to be called upon activation", + "MFE.TOOLTIP": "Indicator whether the menu URL is offered by a registered Product Module", + "I18N.TOOLTIP": "Translations available?", + "I18N.ROW.TOOLTIP": "At least one translation is available", + "EXTERN.TOOLTIP": "If checked then the Workspace is exit", + "PREVIEW_LANG": "Language", + "PREVIEW_LANG.EMPTY": "No translations available", + "PREVIEW_LANG.TOOLTIP": "List of configured languages" + } + }, + "IMAGE": { + "ADDING_IMAGE": "Add Image", + "ADDING_IMAGE_COMPUTER": "Add image from computer", + "DELETE_IMAGE": "Delete Image", + "IMAGE_NOT_FOUND": "Image not found", + "SELECT_IMAGE": "Select Image", + "UPLOADED": "File uploaded", + "LOGO": "Logo image" + }, + "LOGO": { + "LOGO_URL": "Logo URL", + "FAVICON_URL": "Favicon URL", + "UPLOAD_FAIL": " The file was not uploaded successfully", + "UPLOAD_SUCCESS": "The file was uploaded successfully", + "TOOLTIPS": { + "IMAGE": "Logo", + "PLACEHOLDER": "Image Placeholder", + "UPLOAD": "Select and upload image" + } + }, + "SEARCH": { + "ACTION": "Action", + "ANY_VALUE": "", + "DROPDOWN_PLACEHOLDER": "Any", + "EMPTY": "empty", + "ERROR": "Data not available", + "FILTER": "Filter", + "FILTER_OF": "Filter for ", + "MENU_MANAGEMENT": "Menu Management", + "MENU_MANAGEMENT_DETAILS": "Creation and editing of menu items for a Workspace", + "MSG_NO_RESULTS": "Search returned no results", + "NO_DATA": "No Data", + "NO_PORTALS": "No Workspaces available", + "PORTAL": "Workspace", + "PORTALS_LIST": "Workspace List", + "PORTAL_MANAGEMENT": "Workspace Management", + "PORTAL_MANAGEMENT_DETAILS": "Creation and editing of Workspaces", + "PORTAL_SEARCH": "Workspace Search", + "RESET": "Reset", + "RESET_TOOLTIP": "Clear given criteria", + "ROOT_FILTER": "Show Top Items", + "SEARCH": "Search", + "SEARCH_TOOLTIP": "Search for the issues with given criteria", + "SHOW_DETAILS": "Show Details", + "SHOW_LIST": "Show as list", + "SHOW_TREE": "Show as tree", + "SORT_BY": "Sort By", + "SORT_DIRECTION_ASC": "ascending", + "SORT_DIRECTION_DESC": "descending" + }, + "THEME": { + "SEARCH.HEADER": "Theme Management", + "SEARCH.SUBHEADER": "Creation and editing of themes", + "DESIGNER.EDIT.SUBHEADER": "Change Theme Details", + "DESIGNER.NEW.SUBHEADER": "Create a new Theme", + "DETAIL.SUBHEADER": "Theme Details", + "DETAIL.AUTO_APPLY": "Auto apply changes", + "DETAIL.AUTO_APPLY.TOOLTIP": "If this option is switched on, then all changes (font, colors) are automatically applied to the current page.", + "DETAIL.AUTO_APPLY_CURRENT_THEME": "Changes are applied immediately when saving because it is the theme currently in use", + "DETAIL.THEME_SELECTOR": "Select Theme as Template", + "LOAD_ERROR": "Failed to load Theme", + "NOT_FOUND": "Theme was not found", + "NO_PROPERTIES": "No properties specified", + "TABS": { + "PROPERTIES": "Properties", + "VARIABLES": "Theme Variables" + }, + "TEMPLATE": { + "SELECTOR": "Select Theme template", + "SELECTOR.TOOLTIP": "Choose an existing theme and use it as a template", + "CONFIRMATION.HEADER": "Use a Theme as Template", + "CONFIRMATION.MESSAGE.NEW": "Should all values be replaced by the values of \"{{ITEM}}\"?", + "CONFIRMATION.MESSAGE.EDIT": "Should all existing color values be replaced by the values of \"{{ITEM}}\"?" + }, + "GROUPS": { + "BASE": "Basis", + "FONT": "Font" + }, + "ID": "ID", + "NAME": "Name", + "THEME_NAME": "Theme Name", + "VERSION": "Version", + "DESCRIPTION": "Description", + "CSS_FILE": "CSS File", + "CREATION_DATE": "Created on", + "CREATION_USER": "Created by", + "MODIFICATION_DATE": "Changed on", + "MODIFICATION_USER": "Changed by", + "PORTALS": "Used in Workspaces", + "TOOLTIPS": { + "ID": "Unique technical ID of the Theme", + "NAME": "Unique Name of the Theme", + "VERSION": "Version of the Theme", + "DESCRIPTION": "Description of the Theme", + "PORTALS": "Workspaces using the Theme", + "CSS_FILE": "CSS file name", + "CREATION_DATE": "Timestamp the Theme was created", + "CREATION_USER": "Name of the user which created the Theme", + "MODIFICATION_DATE": "Timestamp the Theme was latest modified", + "MODIFICATION_USER": "Name of the user which changed the Theme last time" + } + }, + "TREE": { + "CLEAR_CACHE_INFO": "Cache cleared", + "CONFIRM_HEADER": "Update Dialog", + "EDIT_ERROR": "Menu structure edition error", + "EDIT_SUCCESS": "Menu structure edited successfully", + "FETCH_ERROR": "Error while fetching Menu Items", + "NO_MENU_ITEMS": "No Menu Items available", + "PORTAL_CREATION_INFO": "Do you wish to continue and update Workspace menu structure?", + "STRUCTURE_UPLOAD_ERROR": "Error has occurred, menu structure wasn't overwritten", + "STRUCTURE_UPLOAD_HEADER": "Upload tree structure", + "STRUCTURE_UPLOAD_INFO": "Please, upload JSON file from your device. Keep in mind, that after upload whole menu structure will be overwritten.", + "STRUCTURE_UPLOAD_SUCCESS": "Menu Structure was successfully overwritten", + "TREE_VIEW": "Menu structure - tree" + }, + "VALIDATION": { + "HINTS": { + "FORMAT_URL": "Format: " + }, + "ERRORS": { + "PARSE_ERROR": "Parse error: The contained structure does not match the expected format.", + "INTERNAL_ERROR": "Internal error", + "EMPTY_REQUIRED_FIELD": "This field is required.", + "MAXIMUM_LENGTH": "Only {{chars}} characters are allowed.", + "MINIMUM_LENGTH": "At least {{chars}} characters are required.", + "PATTERN_ERROR": "The input does not match the required pattern", + "FILETYPE_PATTERN_ERROR": "The file does not match the allowed filetypes: .png, .jpg, .jpeg" + } + }, + "EXCEPTIONS": { + "HTTP_STATUS_0": { + "PORTALS": "Unknown problem retrieving Workspace data - please try again.", + "MENUS": "Unknown problem retrieving menu data - please try again." + }, + "HTTP_STATUS_403": { + "PORTALS": "You have no permissions to see workspaces.", + "MENUS": "You have no permissions to see menus." + }, + "HTTP_STATUS_404": { + "PORTALS": "No Workspaces could be found.", + "MENUS": "No menus could be found." + }, + "HTTP_STATUS_500": { + "PORTALS": "Unknown server problem retrieving Workspace data - please try again.", + "MENUS": "Unknown server problem retrieving menu data - please try again." + } + } +} diff --git a/src/assets/silent-check-sso.html b/src/assets/silent-check-sso.html new file mode 100644 index 00000000..0485824e --- /dev/null +++ b/src/assets/silent-check-sso.html @@ -0,0 +1,11 @@ + + + + OneCX + + + + + diff --git a/src/bootstrap.ts b/src/bootstrap.ts new file mode 100644 index 00000000..274537fe --- /dev/null +++ b/src/bootstrap.ts @@ -0,0 +1,13 @@ +import { enableProdMode } from '@angular/core' +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' + +import { AppModule } from './app/app.module' +import { environment } from './environments/environment' + +if (environment.production) { + enableProdMode() +} + +platformBrowserDynamic() + .bootstrapModule(AppModule) + .catch((err) => console.error(err)) diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts new file mode 100644 index 00000000..9c025739 --- /dev/null +++ b/src/environments/environment.prod.ts @@ -0,0 +1,5 @@ +export const environment = { + production: true, + BASE_PATH: '/bff', + apiPrefix: 'bff' +} diff --git a/src/environments/environment.ts b/src/environments/environment.ts new file mode 100644 index 00000000..2cd4ca61 --- /dev/null +++ b/src/environments/environment.ts @@ -0,0 +1,13 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false, + KEYCLOAK_URL: 'http://keycloak-app/', + KEYCLOAK_REALM: 'OneCX', + KEYCLOAK_CLIENT_ID: 'tkit-angular-example', + TKIT_PORTAL_ID: 'ADMIN', + skipRemoteConfigLoad: true, + apiPrefix: 'bff' +} diff --git a/src/favicon.ico b/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..317ebcb2336e0833a22dddf0ab287849f26fda57 GIT binary patch literal 15086 zcmeI332;U^%p|z7g|#(P)qFEA@4f!_@qOK2 z_lJl}!lhL!VT_U|uN7%8B2iKH??xhDa;*`g{yjTFWHvXn;2s{4R7kH|pKGdy(7z!K zgftM+Ku7~24TLlh(!g)gz|foI94G^t2^IO$uvX$3(OR0<_5L2sB)lMAMy|+`xodJ{ z_Uh_1m)~h?a;2W{dmhM;u!YGo=)OdmId_B<%^V^{ovI@y`7^g1_V9G}*f# zNzAtvou}I!W1#{M^@ROc(BZ! z+F!!_aR&Px3_reO(EW+TwlW~tv*2zr?iP7(d~a~yA|@*a89IUke+c472NXM0wiX{- zl`UrZC^1XYyf%1u)-Y)jj9;MZ!SLfd2Hl?o|80Su%Z?To_=^g_Jt0oa#CT*tjx>BI z16wec&AOWNK<#i0Qd=1O$fymLRoUR*%;h@*@v7}wApDl^w*h}!sYq%kw+DKDY)@&A z@9$ULEB3qkR#85`lb8#WZw=@})#kQig9oqy^I$dj&k4jU&^2(M3q{n1AKeGUKPFbr z1^<)aH;VsG@J|B&l>UtU#Ejv3GIqERzYgL@UOAWtW<{p#zy`WyJgpCy8$c_e%wYJL zyGHRRx38)HyjU3y{-4z6)pzb>&Q1pR)B&u01F-|&Gx4EZWK$nkUkOI|(D4UHOXg_- zw{OBf!oWQUn)Pe(=f=nt=zkmdjpO^o8ZZ9o_|4tW1ni+Un9iCW47*-ut$KQOww!;u z`0q)$s6IZO!~9$e_P9X!hqLxu`fpcL|2f^I5d4*a@Dq28;@2271v_N+5HqYZ>x;&O z05*7JT)mUe&%S0@UD)@&8SmQrMtsDfZT;fkdA!r(S=}Oz>iP)w=W508=Rc#nNn7ym z1;42c|8($ALY8#a({%1#IXbWn9-Y|0eDY$_L&j{63?{?AH{);EzcqfydD$@-B`Y3<%IIj7S7rK_N}je^=dEk%JQ4c z!tBdTPE3Tse;oYF>cnrapWq*o)m47X1`~6@(!Y29#>-#8zm&LXrXa(3=7Z)ElaQqj z-#0JJy3Fi(C#Rx(`=VXtJ63E2_bZGCz+QRa{W0e2(m3sI?LOcUBx)~^YCqZ{XEPX)C>G>U4tfqeH8L(3|pQR*zbL1 zT9e~4Tb5p9_G}$y4t`i*4t_Mr9QYvL9C&Ah*}t`q*}S+VYh0M6GxTTSXI)hMpMpIq zD1ImYqJLzbj0}~EpE-aH#VCH_udYEW#`P2zYmi&xSPs_{n6tBj=MY|-XrA;SGA_>y zGtU$?HXm$gYj*!N)_nQ59%lQdXtQZS3*#PC-{iB_sm+ytD*7j`D*k(P&IH2GHT}Eh z5697eQECVIGQAUe#eU2I!yI&%0CP#>%6MWV z@zS!p@+Y1i1b^QuuEF*13CuB zu69dve5k7&Wgb+^s|UB08Dr3u`h@yM0NTj4h7MnHo-4@xmyr7(*4$rpPwsCDZ@2be zRz9V^GnV;;?^Lk%ynzq&K(Aix`mWmW`^152Hoy$CTYVehpD-S1-W^#k#{0^L`V6CN+E z!w+xte;2vu4AmVNEFUOBmrBL>6MK@!O2*N|2=d|Y;oN&A&qv=qKn73lDD zI(+oJAdgv>Yr}8(&@ZuAZE%XUXmX(U!N+Z_sjL<1vjy1R+1IeHt`79fnYdOL{$ci7 z%3f0A*;Zt@ED&Gjm|OFTYBDe%bbo*xXAQsFz+Q`fVBH!N2)kaxN8P$c>sp~QXnv>b zwq=W3&Mtmih7xkR$YA)1Yi?avHNR6C99!u6fh=cL|KQ&PwF!n@ud^n(HNIImHD!h87!i*t?G|p0o+eelJ?B@A64_9%SBhNaJ64EvKgD&%LjLCYnNfc; znj?%*p@*?dq#NqcQFmmX($wms@CSAr9#>hUR^=I+=0B)vvGX%T&#h$kmX*s=^M2E!@N9#m?LhMvz}YB+kd zG~mbP|D(;{s_#;hsKK9lbVK&Lo734x7SIFJ9V_}2$@q?zm^7?*XH94w5Qae{7zOMUF z^?%F%)c1Y)Q?Iy?I>knw*8gYW#ok|2gdS=YYZLiD=CW|Nj;n^x!=S#iJ#`~Ld79+xXpVmUK^B(xO_vO!btA9y7w3L3-0j-y4 z?M-V{%z;JI`bk7yFDcP}OcCd*{Q9S5$iGA7*E1@tfkyjAi!;wP^O71cZ^Ep)qrQ)N z#wqw0_HS;T7x3y|`P==i3hEwK%|>fZ)c&@kgKO1~5<5xBSk?iZV?KI6&i72H6S9A* z=U(*e)EqEs?Oc04)V-~K5AUmh|62H4*`UAtItO$O(q5?6jj+K^oD!04r=6#dsxp?~}{`?&sXn#q2 zGuY~7>O2=!u@@Kfu7q=W*4egu@qPMRM>(eyYyaIE<|j%d=iWNdGsx%c!902v#ngNg z@#U-O_4xN$s_9?(`{>{>7~-6FgWpBpqXb`Ydc3OFL#&I}Irse9F_8R@4zSS*Y*o*B zXL?6*Aw!AfkNCgcr#*yj&p3ZDe2y>v$>FUdKIy_2N~}6AbHc7gA3`6$g@1o|dE>vz z4pl(j9;kyMsjaw}lO?(?Xg%4k!5%^t#@5n=WVc&JRa+XT$~#@rldvN3S1rEpU$;XgxVny7mki3 z-Hh|jUCHrUXuLr!)`w>wgO0N%KTB-1di>cj(x3Bav`7v z3G7EIbU$z>`Nad7Rk_&OT-W{;qg)-GXV-aJT#(ozdmnA~Rq3GQ_3mby(>q6Ocb-RgTUhTN)))x>m&eD;$J5Bg zo&DhY36Yg=J=$Z>t}RJ>o|@hAcwWzN#r(WJ52^g$lh^!63@hh+dR$&_dEGu&^CR*< z!oFqSqO@>xZ*nC2oiOd0eS*F^IL~W-rsrO`J`ej{=ou_q^_(<$&-3f^J z&L^MSYWIe{&pYq&9eGaArA~*kA + + + + OneCX Workspace + + + + + +   + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 00000000..0492d1d0 --- /dev/null +++ b/src/main.ts @@ -0,0 +1 @@ +import('./bootstrap').catch((err) => console.error(err)) diff --git a/src/polyfills.ts b/src/polyfills.ts new file mode 100644 index 00000000..5173f2ff --- /dev/null +++ b/src/polyfills.ts @@ -0,0 +1,52 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes recent versions of Safari, Chrome (including + * Opera), Edge on the desktop, and iOS and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js' // Included with Angular CLI. + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/src/styles.scss b/src/styles.scss new file mode 100644 index 00000000..cee37370 --- /dev/null +++ b/src/styles.scss @@ -0,0 +1,8 @@ +/* You can add global styles to this file, and also import other style files */ +@import '../node_modules/primeng/resources/primeng.min.css'; +@import '../node_modules/primeflex/primeflex.scss'; +@import '../node_modules/primeicons/primeicons.css'; + +@import '@onecx/portal-layout-styles/src/styles/shell/shell.scss'; +@import '@onecx/portal-layout-styles/src/styles/primeng/theme-light.scss'; +@import '../node_modules/@onecx/portal-integration-angular/assets/output.css'; diff --git a/src/test-setup.ts b/src/test-setup.ts new file mode 100644 index 00000000..90bc5062 --- /dev/null +++ b/src/test-setup.ts @@ -0,0 +1 @@ +import 'jest-preset-angular/setup-jest' diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 00000000..8fad2abc --- /dev/null +++ b/src/test.ts @@ -0,0 +1,8 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing' +import { getTestBed } from '@angular/core/testing' +import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing' + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()) diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 00000000..18cc9365 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationMap": false, + "inlineSources": true, + "target": "ES2022" + }, + "files": ["src/main.ts", "src/polyfills.ts", "src/app/onecx-workspace-remote.module.ts"], + "include": ["src/**/*.ts", "src/**/*.d.ts"], + "exclude": ["src/test.ts", "src/test-setup.ts", "src/**/*.spec.ts", "src/**/*.stories.ts", "src/**/*.stories.js"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..d50948b0 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,46 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "strict": true, + "baseUrl": "./", + "rootDir": "", + "outDir": "./dist/app", + "sourceMap": true, + "composite": false, + "declaration": false, + "declarationMap": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "esModuleInterop": true, + "useDefineForClassFields": false, + "target": "ES2022", + "module": "ES2022", + "lib": ["ES2022", "DOM"], + "inlineSources": true, + "types": [] + }, + "files": [], + "include": [], + "exclude": ["node_modules", "tmp"], + "references": [ + { + "path": "tsconfig.app.json" + }, + { + "path": "tsconfig.spec.json" + } + ], + "angularCompilerOptions": { + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 00000000..a3660653 --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "outDir": "./dist/test", + "module": "commonjs", + "types": ["jasmine", "node"], + "target": "ES2022", + "useDefineForClassFields": false + }, + "files": ["src/test.ts", "src/polyfills.ts"], + "exclude": ["src/app/shared/generated/**/*", "node_modules"], + "include": ["**/*.spec.ts", "**/*.d.ts"] +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..d483368a --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,52 @@ +const { ModifyEntryPlugin } = require('@angular-architects/module-federation/src/utils/modify-entry-plugin') +const { share, withModuleFederationPlugin } = require('@angular-architects/module-federation/webpack') + +const config = withModuleFederationPlugin({ + name: 'onecx-workspace-ui', + filename: 'remoteEntry.js', + exposes: { + './WorkspaceMgmtModule': 'src/app/onecx-workspace-remote.module.ts' + }, + shared: share({ + '@angular/core': { singleton: true, strictVersion: true, requiredVersion: 'auto' }, + '@angular/forms': { + singleton: true, + strictVersion: true, + requiredVersion: 'auto', + includeSecondaries: true, + eager: false + }, + '@angular/common': { + singleton: true, + strictVersion: true, + requiredVersion: 'auto', + includeSecondaries: { + skip: ['@angular/common/http/testing'] + } + }, + '@angular/common/http': { + singleton: true, + strictVersion: true, + requiredVersion: 'auto', + includeSecondaries: true + }, + rxjs: { singleton: true, strictVersion: true, requiredVersion: 'auto', includeSecondaries: true }, + '@angular/router': { singleton: true, strictVersion: true, requiredVersion: 'auto', includeSecondaries: true }, + '@ngx-translate/core': { singleton: true, strictVersion: false, requiredVersion: '^14.0.0' }, + '@onecx/keycloak-auth': { requiredVersion: 'auto', includeSecondaries: true }, + '@onecx/portal-integration-angular': { requiredVersion: 'auto', includeSecondaries: true }, + '@onecx/accelerator': { requiredVersion: 'auto', includeSecondaries: true }, + '@onecx/integration-interface': { requiredVersion: 'auto', includeSecondaries: true } + }), + sharedMappings: ['@onecx/portal-integration-angular'] +}) +config.devServer = { + allowedHosts: 'all' +} + +const plugins = config.plugins.filter((plugin) => !(plugin instanceof ModifyEntryPlugin)) + +module.exports = { + ...config, + plugins +} diff --git a/webpack.prod.config.js b/webpack.prod.config.js new file mode 100644 index 00000000..2387dce7 --- /dev/null +++ b/webpack.prod.config.js @@ -0,0 +1 @@ +module.exports = require('./webpack.config')