From ec1af4ad96f39590abdbb55093567f68032b1369 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 29 Dec 2025 14:13:49 +0100 Subject: [PATCH] :tada: Import penpot-plugins repository As commit 819a549e4928d2b1fa98e52bee82d59aec0f70d8 --- plugins/.env.example | 3 + plugins/.gitignore | 55 + plugins/.husky/commit-msg | 1 + plugins/.husky/pre-commit | 5 + plugins/.husky/pre-push | 5 + plugins/.nvmrc | 1 + plugins/.prettierignore | 7 + plugins/.prettierrc | 3 + plugins/.verdaccio/config.yml | 25 + plugins/.vscode/extensions.json | 8 + plugins/.vscode/settings.json | 3 + plugins/CHANGELOG.md | 221 + plugins/CONTRIBUTING.md | 134 + plugins/LICENSE | 382 + plugins/README.md | 82 + .../colors-to-tokens-plugin/eslint.config.js | 51 + .../apps/colors-to-tokens-plugin/project.json | 79 + .../src/app/app.component.css | 87 + .../src/app/app.component.ts | 183 + .../src/app/app.config.ts | 6 + .../src/app/components/svg.component.css | 14 + .../src/app/components/svg.component.ts | 48 + .../transform-to-token.spec.ts.snap | 498 + .../src/app/utils/transform-to-token.spec.ts | 654 + .../src/app/utils/transform-to-token.ts | 72 + .../src/assets/icon.png | Bin 0 -> 4648 bytes .../src/assets/manifest.json | 7 + .../colors-to-tokens-plugin/src/index.html | 12 + .../apps/colors-to-tokens-plugin/src/main.ts | 7 + .../apps/colors-to-tokens-plugin/src/model.ts | 53 + .../colors-to-tokens-plugin/src/plugin.ts | 50 + .../colors-to-tokens-plugin/src/styles.css | 0 .../colors-to-tokens-plugin/tsconfig.app.json | 10 + .../tsconfig.editor.json | 7 + .../colors-to-tokens-plugin/tsconfig.json | 33 + .../tsconfig.plugin.json | 8 + .../tsconfig.spec.json | 26 + .../colors-to-tokens-plugin/vite.config.ts | 21 + plugins/apps/contrast-plugin/eslint.config.js | 51 + plugins/apps/contrast-plugin/project.json | 79 + .../contrast-plugin/src/app/app.component.css | 97 + .../contrast-plugin/src/app/app.component.ts | 236 + .../contrast-plugin/src/app/app.config.ts | 6 + .../apps/contrast-plugin/src/assets/icon.png | Bin 0 -> 2516 bytes .../contrast-plugin/src/assets/manifest.json | 7 + plugins/apps/contrast-plugin/src/index.html | 12 + plugins/apps/contrast-plugin/src/main.ts | 7 + plugins/apps/contrast-plugin/src/model.ts | 29 + plugins/apps/contrast-plugin/src/plugin.ts | 55 + plugins/apps/contrast-plugin/src/styles.css | 0 .../apps/contrast-plugin/tsconfig.app.json | 10 + .../apps/contrast-plugin/tsconfig.editor.json | 7 + plugins/apps/contrast-plugin/tsconfig.json | 33 + .../apps/contrast-plugin/tsconfig.plugin.json | 8 + plugins/apps/contrast-plugin/vite.config.ts | 20 + plugins/apps/create-palette-plugin/.babelrc | 3 + plugins/apps/create-palette-plugin/.swcrc | 8 + .../create-palette-plugin/eslint.config.js | 26 + plugins/apps/create-palette-plugin/index.html | 2 + .../apps/create-palette-plugin/project.json | 8 + .../public/assets/icon.png | Bin 0 -> 2171 bytes .../public/assets/manifest.json | 7 + .../apps/create-palette-plugin/src/plugin.ts | 104 + .../create-palette-plugin/tsconfig.app.json | 9 + .../apps/create-palette-plugin/tsconfig.json | 30 + .../create-palette-plugin/tsconfig.spec.json | 26 + .../apps/create-palette-plugin/vite.config.ts | 58 + plugins/apps/e2e/eslint.config.js | 32 + plugins/apps/e2e/project.json | 8 + plugins/apps/e2e/screenshots/.gitkeep | 0 .../src/__snapshots__/plugins.spec.ts.snap | 2421 ++ plugins/apps/e2e/src/models/file-rpc.model.ts | 17 + plugins/apps/e2e/src/models/shape.model.ts | 7 + plugins/apps/e2e/src/plugins.spec.ts | 92 + .../apps/e2e/src/plugins/component-library.ts | 10 + .../e2e/src/plugins/create-board-text-rect.ts | 58 + .../apps/e2e/src/plugins/create-comments.ts | 40 + .../apps/e2e/src/plugins/create-flexlayout.ts | 26 + .../apps/e2e/src/plugins/create-gridlayout.ts | 27 + .../e2e/src/plugins/create-ruler-guides.ts | 21 + plugins/apps/e2e/src/plugins/create-text.ts | 23 + plugins/apps/e2e/src/plugins/group.ts | 29 + plugins/apps/e2e/src/plugins/insert-svg.ts | 21 + plugins/apps/e2e/src/plugins/plugin-data.ts | 6 + plugins/apps/e2e/src/utils/agent.ts | 167 + plugins/apps/e2e/src/utils/api.ts | 85 + plugins/apps/e2e/src/utils/clean-id.ts | 14 + plugins/apps/e2e/src/utils/get-file-url.ts | 10 + plugins/apps/e2e/tsconfig.json | 27 + plugins/apps/e2e/vite.config.ts | 23 + plugins/apps/example-styles/.babelrc | 3 + plugins/apps/example-styles/.swcrc | 8 + plugins/apps/example-styles/eslint.config.js | 32 + plugins/apps/example-styles/index.html | 22 + plugins/apps/example-styles/project.json | 8 + .../apps/example-styles/public/favicon.ico | Bin 0 -> 7662 bytes .../example-styles/src/app/app.element.css | 123 + .../example-styles/src/app/app.element.html | 1353 + .../example-styles/src/app/app.element.ts | 36 + .../apps/example-styles/src/assets/.gitkeep | 0 plugins/apps/example-styles/src/main.ts | 1 + plugins/apps/example-styles/src/styles.css | 1 + plugins/apps/example-styles/tsconfig.app.json | 12 + plugins/apps/example-styles/tsconfig.json | 23 + .../apps/example-styles/tsconfig.spec.json | 26 + plugins/apps/example-styles/vite.config.ts | 49 + plugins/apps/icons-plugin/eslint.config.js | 51 + plugins/apps/icons-plugin/project.json | 79 + .../icons-plugin/src/app/app.component.css | 33 + .../icons-plugin/src/app/app.component.ts | 109 + .../apps/icons-plugin/src/app/app.config.ts | 6 + .../icon-button/icon-button.component.css | 28 + .../icon-button/icon-button.component.ts | 37 + .../icon-search/icon-search.component.css | 20 + .../icon-search/icon-search.component.ts | 25 + .../src/app/pipes/safe-html.pipe.ts | 11 + plugins/apps/icons-plugin/src/assets/.gitkeep | 0 plugins/apps/icons-plugin/src/assets/icon.png | Bin 0 -> 1621 bytes .../icons-plugin/src/assets/manifest.json | 7 + plugins/apps/icons-plugin/src/favicon.ico | Bin 0 -> 15086 bytes plugins/apps/icons-plugin/src/index.html | 13 + plugins/apps/icons-plugin/src/main.ts | 7 + plugins/apps/icons-plugin/src/model.ts | 27 + plugins/apps/icons-plugin/src/plugin.ts | 31 + plugins/apps/icons-plugin/src/styles.css | 1 + plugins/apps/icons-plugin/tsconfig.app.json | 10 + .../apps/icons-plugin/tsconfig.editor.json | 7 + plugins/apps/icons-plugin/tsconfig.json | 33 + .../apps/icons-plugin/tsconfig.plugin.json | 8 + .../apps/lorem-ipsum-plugin/eslint.config.js | 51 + plugins/apps/lorem-ipsum-plugin/project.json | 79 + .../src/app/app.component.css | 46 + .../src/app/app.component.ts | 117 + .../lorem-ipsum-plugin/src/app/app.config.ts | 6 + .../lorem-ipsum-plugin/src/assets/icon.png | Bin 0 -> 1514 bytes .../src/assets/manifest.json | 7 + .../lorem-ipsum-plugin/src/generator.spec.ts | 69 + .../apps/lorem-ipsum-plugin/src/generator.ts | 142 + .../apps/lorem-ipsum-plugin/src/index.html | 12 + plugins/apps/lorem-ipsum-plugin/src/main.ts | 7 + plugins/apps/lorem-ipsum-plugin/src/model.ts | 40 + plugins/apps/lorem-ipsum-plugin/src/plugin.ts | 72 + .../apps/lorem-ipsum-plugin/src/styles.css | 0 .../apps/lorem-ipsum-plugin/tsconfig.app.json | 10 + .../lorem-ipsum-plugin/tsconfig.editor.json | 7 + plugins/apps/lorem-ipsum-plugin/tsconfig.json | 33 + .../lorem-ipsum-plugin/tsconfig.plugin.json | 8 + .../apps/lorem-ipsum-plugin/vite.config.ts | 21 + .../apps/poc-state-plugin/eslint.config.js | 51 + plugins/apps/poc-state-plugin/project.json | 79 + .../src/app/app.component.css | 111 + .../poc-state-plugin/src/app/app.component.ts | 485 + .../poc-state-plugin/src/assets/manifest.json | 13 + plugins/apps/poc-state-plugin/src/favicon.ico | Bin 0 -> 15086 bytes plugins/apps/poc-state-plugin/src/index.html | 13 + plugins/apps/poc-state-plugin/src/main.ts | 4 + plugins/apps/poc-state-plugin/src/plugin.ts | 619 + plugins/apps/poc-state-plugin/src/styles.css | 1 + .../apps/poc-state-plugin/tsconfig.app.json | 10 + .../poc-state-plugin/tsconfig.editor.json | 7 + plugins/apps/poc-state-plugin/tsconfig.json | 33 + .../poc-state-plugin/tsconfig.plugin.json | 8 + .../rename-layers-plugin/eslint.config.js | 51 + .../apps/rename-layers-plugin/project.json | 79 + .../src/app/app.component.css | 124 + .../src/app/app.component.html | 144 + .../src/app/app.component.ts | 148 + .../src/app/app.config.ts | 7 + .../src/app/app.routes.ts | 3 + .../rename-layers-plugin/src/app/model.ts | 57 + .../rename-layers-plugin/src/assets/icon.png | Bin 0 -> 4567 bytes .../src/assets/manifest.json | 7 + .../apps/rename-layers-plugin/src/favicon.ico | Bin 0 -> 15086 bytes .../apps/rename-layers-plugin/src/index.html | 13 + plugins/apps/rename-layers-plugin/src/main.ts | 7 + .../apps/rename-layers-plugin/src/plugin.ts | 87 + .../apps/rename-layers-plugin/src/styles.css | 1 + .../rename-layers-plugin/tsconfig.app.json | 10 + .../rename-layers-plugin/tsconfig.editor.json | 7 + .../apps/rename-layers-plugin/tsconfig.json | 33 + .../rename-layers-plugin/tsconfig.plugin.json | 8 + plugins/apps/table-plugin/eslint.config.js | 51 + plugins/apps/table-plugin/project.json | 78 + .../table-plugin/src/app/app.component.css | 156 + .../table-plugin/src/app/app.component.html | 93 + .../table-plugin/src/app/app.component.ts | 182 + .../apps/table-plugin/src/app/app.config.ts | 7 + .../apps/table-plugin/src/app/app.routes.ts | 3 + plugins/apps/table-plugin/src/app/model.ts | 44 + .../src/app/nx-welcome.component.ts | 984 + plugins/apps/table-plugin/src/assets/.gitkeep | 0 .../apps/table-plugin/src/assets/close.svg | 1 + plugins/apps/table-plugin/src/assets/icon.png | Bin 0 -> 1138 bytes .../table-plugin/src/assets/manifest.json | 7 + plugins/apps/table-plugin/src/favicon.ico | Bin 0 -> 15086 bytes plugins/apps/table-plugin/src/index.html | 13 + plugins/apps/table-plugin/src/main.ts | 7 + plugins/apps/table-plugin/src/plugin.ts | 243 + plugins/apps/table-plugin/src/styles.css | 1 + plugins/apps/table-plugin/tsconfig.app.json | 10 + .../apps/table-plugin/tsconfig.editor.json | 7 + plugins/apps/table-plugin/tsconfig.json | 33 + .../apps/table-plugin/tsconfig.plugin.json | 8 + plugins/commitlint.config.js | 1 + plugins/docs/api-docs.md | 23 + plugins/docs/create-angular-plugin.md | 153 + plugins/docs/create-api.md | 18 + plugins/docs/create-plugin.md | 108 + plugins/docs/images/plugin-menu.png | Bin 0 -> 35340 bytes plugins/docs/publish-package.md | 84 + plugins/docs/test-e2e.md | 82 + plugins/eslint.base.config.js | 49 + plugins/eslint.config.js | 119 + plugins/libs/plugin-types/README.md | 29 + plugins/libs/plugin-types/index.d.ts | 4417 +++ plugins/libs/plugin-types/package.json | 6 + plugins/libs/plugin-types/project.json | 18 + plugins/libs/plugin-types/tsconfig.json | 14 + plugins/libs/plugins-runtime/README.md | 3 + plugins/libs/plugins-runtime/eslint.config.js | 47 + .../libs/plugins-runtime/package-lock.json | 43 + plugins/libs/plugins-runtime/package.json | 12 + plugins/libs/plugins-runtime/project.json | 14 + plugins/libs/plugins-runtime/src/index.ts | 37 + .../libs/plugins-runtime/src/lib/api/index.ts | 360 + .../plugins-runtime/src/lib/api/openUI.api.ts | 16 + .../src/lib/api/plugin-api.spec.ts | 121 + .../plugins-runtime/src/lib/assets/resize.svg | 1 + .../src/lib/create-modal.spec.ts | 107 + .../plugins-runtime/src/lib/create-modal.ts | 92 + .../src/lib/create-plugin.spec.ts | 123 + .../plugins-runtime/src/lib/create-plugin.ts | 42 + .../src/lib/create-sandbox.spec.ts | 163 + .../plugins-runtime/src/lib/create-sandbox.ts | 139 + .../src/lib/drag-handler.spec.ts | 79 + .../plugins-runtime/src/lib/drag-handler.ts | 36 + .../libs/plugins-runtime/src/lib/global.d.ts | 9 + .../src/lib/load-plugin.spec.ts | 149 + .../plugins-runtime/src/lib/load-plugin.ts | 85 + .../src/lib/modal/plugin-modal.ts | 157 + .../src/lib/modal/plugin.modal.css | 102 + .../src/lib/models/manifest.model.ts | 5 + .../src/lib/models/manifest.schema.ts | 23 + .../src/lib/models/open-ui-options.model.ts | 4 + .../src/lib/models/open-ui-options.schema.ts | 6 + .../src/lib/models/plugin-config.model.ts | 3 + .../src/lib/models/plugin.model.ts | 7 + .../plugins-runtime/src/lib/parse-manifest.ts | 38 + .../src/lib/parse-translate.ts | 11 + .../src/lib/plugin-manager.spec.ts | 289 + .../plugins-runtime/src/lib/plugin-manager.ts | 159 + plugins/libs/plugins-runtime/src/lib/ses.ts | 23 + plugins/libs/plugins-runtime/tsconfig.json | 24 + .../libs/plugins-runtime/tsconfig.lib.json | 12 + .../libs/plugins-runtime/tsconfig.spec.json | 27 + plugins/libs/plugins-runtime/vite.config.ts | 82 + plugins/libs/plugins-styles/README.md | 29 + plugins/libs/plugins-styles/package.json | 5 + plugins/libs/plugins-styles/project.json | 18 + .../src/lib/components/button.css | 185 + .../src/lib/components/checkbox.css | 120 + .../src/lib/components/icon.css | 11 + .../src/lib/components/input.css | 125 + .../src/lib/components/radio-button.css | 90 + .../src/lib/components/select.css | 84 + .../src/lib/components/switch.css | 49 + .../plugins-styles/src/lib/core/fonts.css | 100 + .../plugins-styles/src/lib/core/generic.css | 90 + .../plugins-styles/src/lib/core/spacing.css | 12 + .../plugins-styles/src/lib/core/swatches.css | 71 + .../src/lib/icons/chevron-bottom.svg | 11 + .../libs/plugins-styles/src/lib/styles.css | 14 + plugins/nx.json | 82 + plugins/package-lock.json | 27170 ++++++++++++++++ plugins/package.json | 115 + plugins/project.json | 5 + plugins/tools/eslint.config.js | 21 + plugins/tools/plugins/plugin-tasks.ts | 56 + plugins/tools/scripts/build-css.mjs | 26 + plugins/tools/scripts/build-types.mjs | 14 + plugins/tools/scripts/publish.ts | 92 + plugins/tools/tsconfig.json | 16 + plugins/tools/typedoc.css | 53 + plugins/tsconfig.base.json | 24 + plugins/typedoc.json | 7 + plugins/vitest.workspace.ts | 1 + 286 files changed, 50545 insertions(+) create mode 100644 plugins/.env.example create mode 100644 plugins/.gitignore create mode 100644 plugins/.husky/commit-msg create mode 100644 plugins/.husky/pre-commit create mode 100644 plugins/.husky/pre-push create mode 100644 plugins/.nvmrc create mode 100644 plugins/.prettierignore create mode 100644 plugins/.prettierrc create mode 100644 plugins/.verdaccio/config.yml create mode 100644 plugins/.vscode/extensions.json create mode 100644 plugins/.vscode/settings.json create mode 100644 plugins/CHANGELOG.md create mode 100644 plugins/CONTRIBUTING.md create mode 100644 plugins/LICENSE create mode 100644 plugins/README.md create mode 100644 plugins/apps/colors-to-tokens-plugin/eslint.config.js create mode 100644 plugins/apps/colors-to-tokens-plugin/project.json create mode 100644 plugins/apps/colors-to-tokens-plugin/src/app/app.component.css create mode 100644 plugins/apps/colors-to-tokens-plugin/src/app/app.component.ts create mode 100644 plugins/apps/colors-to-tokens-plugin/src/app/app.config.ts create mode 100644 plugins/apps/colors-to-tokens-plugin/src/app/components/svg.component.css create mode 100644 plugins/apps/colors-to-tokens-plugin/src/app/components/svg.component.ts create mode 100644 plugins/apps/colors-to-tokens-plugin/src/app/utils/__snapshots__/transform-to-token.spec.ts.snap create mode 100644 plugins/apps/colors-to-tokens-plugin/src/app/utils/transform-to-token.spec.ts create mode 100644 plugins/apps/colors-to-tokens-plugin/src/app/utils/transform-to-token.ts create mode 100644 plugins/apps/colors-to-tokens-plugin/src/assets/icon.png create mode 100644 plugins/apps/colors-to-tokens-plugin/src/assets/manifest.json create mode 100644 plugins/apps/colors-to-tokens-plugin/src/index.html create mode 100644 plugins/apps/colors-to-tokens-plugin/src/main.ts create mode 100644 plugins/apps/colors-to-tokens-plugin/src/model.ts create mode 100644 plugins/apps/colors-to-tokens-plugin/src/plugin.ts create mode 100644 plugins/apps/colors-to-tokens-plugin/src/styles.css create mode 100644 plugins/apps/colors-to-tokens-plugin/tsconfig.app.json create mode 100644 plugins/apps/colors-to-tokens-plugin/tsconfig.editor.json create mode 100644 plugins/apps/colors-to-tokens-plugin/tsconfig.json create mode 100644 plugins/apps/colors-to-tokens-plugin/tsconfig.plugin.json create mode 100644 plugins/apps/colors-to-tokens-plugin/tsconfig.spec.json create mode 100644 plugins/apps/colors-to-tokens-plugin/vite.config.ts create mode 100644 plugins/apps/contrast-plugin/eslint.config.js create mode 100644 plugins/apps/contrast-plugin/project.json create mode 100644 plugins/apps/contrast-plugin/src/app/app.component.css create mode 100644 plugins/apps/contrast-plugin/src/app/app.component.ts create mode 100644 plugins/apps/contrast-plugin/src/app/app.config.ts create mode 100644 plugins/apps/contrast-plugin/src/assets/icon.png create mode 100644 plugins/apps/contrast-plugin/src/assets/manifest.json create mode 100644 plugins/apps/contrast-plugin/src/index.html create mode 100644 plugins/apps/contrast-plugin/src/main.ts create mode 100644 plugins/apps/contrast-plugin/src/model.ts create mode 100644 plugins/apps/contrast-plugin/src/plugin.ts create mode 100644 plugins/apps/contrast-plugin/src/styles.css create mode 100644 plugins/apps/contrast-plugin/tsconfig.app.json create mode 100644 plugins/apps/contrast-plugin/tsconfig.editor.json create mode 100644 plugins/apps/contrast-plugin/tsconfig.json create mode 100644 plugins/apps/contrast-plugin/tsconfig.plugin.json create mode 100644 plugins/apps/contrast-plugin/vite.config.ts create mode 100644 plugins/apps/create-palette-plugin/.babelrc create mode 100644 plugins/apps/create-palette-plugin/.swcrc create mode 100644 plugins/apps/create-palette-plugin/eslint.config.js create mode 100644 plugins/apps/create-palette-plugin/index.html create mode 100644 plugins/apps/create-palette-plugin/project.json create mode 100644 plugins/apps/create-palette-plugin/public/assets/icon.png create mode 100644 plugins/apps/create-palette-plugin/public/assets/manifest.json create mode 100644 plugins/apps/create-palette-plugin/src/plugin.ts create mode 100644 plugins/apps/create-palette-plugin/tsconfig.app.json create mode 100644 plugins/apps/create-palette-plugin/tsconfig.json create mode 100644 plugins/apps/create-palette-plugin/tsconfig.spec.json create mode 100644 plugins/apps/create-palette-plugin/vite.config.ts create mode 100644 plugins/apps/e2e/eslint.config.js create mode 100644 plugins/apps/e2e/project.json create mode 100644 plugins/apps/e2e/screenshots/.gitkeep create mode 100644 plugins/apps/e2e/src/__snapshots__/plugins.spec.ts.snap create mode 100644 plugins/apps/e2e/src/models/file-rpc.model.ts create mode 100644 plugins/apps/e2e/src/models/shape.model.ts create mode 100644 plugins/apps/e2e/src/plugins.spec.ts create mode 100644 plugins/apps/e2e/src/plugins/component-library.ts create mode 100644 plugins/apps/e2e/src/plugins/create-board-text-rect.ts create mode 100644 plugins/apps/e2e/src/plugins/create-comments.ts create mode 100644 plugins/apps/e2e/src/plugins/create-flexlayout.ts create mode 100644 plugins/apps/e2e/src/plugins/create-gridlayout.ts create mode 100644 plugins/apps/e2e/src/plugins/create-ruler-guides.ts create mode 100644 plugins/apps/e2e/src/plugins/create-text.ts create mode 100644 plugins/apps/e2e/src/plugins/group.ts create mode 100644 plugins/apps/e2e/src/plugins/insert-svg.ts create mode 100644 plugins/apps/e2e/src/plugins/plugin-data.ts create mode 100644 plugins/apps/e2e/src/utils/agent.ts create mode 100644 plugins/apps/e2e/src/utils/api.ts create mode 100644 plugins/apps/e2e/src/utils/clean-id.ts create mode 100644 plugins/apps/e2e/src/utils/get-file-url.ts create mode 100644 plugins/apps/e2e/tsconfig.json create mode 100644 plugins/apps/e2e/vite.config.ts create mode 100644 plugins/apps/example-styles/.babelrc create mode 100644 plugins/apps/example-styles/.swcrc create mode 100644 plugins/apps/example-styles/eslint.config.js create mode 100644 plugins/apps/example-styles/index.html create mode 100644 plugins/apps/example-styles/project.json create mode 100644 plugins/apps/example-styles/public/favicon.ico create mode 100644 plugins/apps/example-styles/src/app/app.element.css create mode 100644 plugins/apps/example-styles/src/app/app.element.html create mode 100644 plugins/apps/example-styles/src/app/app.element.ts create mode 100644 plugins/apps/example-styles/src/assets/.gitkeep create mode 100644 plugins/apps/example-styles/src/main.ts create mode 100644 plugins/apps/example-styles/src/styles.css create mode 100644 plugins/apps/example-styles/tsconfig.app.json create mode 100644 plugins/apps/example-styles/tsconfig.json create mode 100644 plugins/apps/example-styles/tsconfig.spec.json create mode 100644 plugins/apps/example-styles/vite.config.ts create mode 100644 plugins/apps/icons-plugin/eslint.config.js create mode 100644 plugins/apps/icons-plugin/project.json create mode 100644 plugins/apps/icons-plugin/src/app/app.component.css create mode 100644 plugins/apps/icons-plugin/src/app/app.component.ts create mode 100644 plugins/apps/icons-plugin/src/app/app.config.ts create mode 100644 plugins/apps/icons-plugin/src/app/components/icon-button/icon-button.component.css create mode 100644 plugins/apps/icons-plugin/src/app/components/icon-button/icon-button.component.ts create mode 100644 plugins/apps/icons-plugin/src/app/components/icon-search/icon-search.component.css create mode 100644 plugins/apps/icons-plugin/src/app/components/icon-search/icon-search.component.ts create mode 100644 plugins/apps/icons-plugin/src/app/pipes/safe-html.pipe.ts create mode 100644 plugins/apps/icons-plugin/src/assets/.gitkeep create mode 100644 plugins/apps/icons-plugin/src/assets/icon.png create mode 100644 plugins/apps/icons-plugin/src/assets/manifest.json create mode 100644 plugins/apps/icons-plugin/src/favicon.ico create mode 100644 plugins/apps/icons-plugin/src/index.html create mode 100644 plugins/apps/icons-plugin/src/main.ts create mode 100644 plugins/apps/icons-plugin/src/model.ts create mode 100644 plugins/apps/icons-plugin/src/plugin.ts create mode 100644 plugins/apps/icons-plugin/src/styles.css create mode 100644 plugins/apps/icons-plugin/tsconfig.app.json create mode 100644 plugins/apps/icons-plugin/tsconfig.editor.json create mode 100644 plugins/apps/icons-plugin/tsconfig.json create mode 100644 plugins/apps/icons-plugin/tsconfig.plugin.json create mode 100644 plugins/apps/lorem-ipsum-plugin/eslint.config.js create mode 100644 plugins/apps/lorem-ipsum-plugin/project.json create mode 100644 plugins/apps/lorem-ipsum-plugin/src/app/app.component.css create mode 100644 plugins/apps/lorem-ipsum-plugin/src/app/app.component.ts create mode 100644 plugins/apps/lorem-ipsum-plugin/src/app/app.config.ts create mode 100644 plugins/apps/lorem-ipsum-plugin/src/assets/icon.png create mode 100644 plugins/apps/lorem-ipsum-plugin/src/assets/manifest.json create mode 100644 plugins/apps/lorem-ipsum-plugin/src/generator.spec.ts create mode 100644 plugins/apps/lorem-ipsum-plugin/src/generator.ts create mode 100644 plugins/apps/lorem-ipsum-plugin/src/index.html create mode 100644 plugins/apps/lorem-ipsum-plugin/src/main.ts create mode 100644 plugins/apps/lorem-ipsum-plugin/src/model.ts create mode 100644 plugins/apps/lorem-ipsum-plugin/src/plugin.ts create mode 100644 plugins/apps/lorem-ipsum-plugin/src/styles.css create mode 100644 plugins/apps/lorem-ipsum-plugin/tsconfig.app.json create mode 100644 plugins/apps/lorem-ipsum-plugin/tsconfig.editor.json create mode 100644 plugins/apps/lorem-ipsum-plugin/tsconfig.json create mode 100644 plugins/apps/lorem-ipsum-plugin/tsconfig.plugin.json create mode 100644 plugins/apps/lorem-ipsum-plugin/vite.config.ts create mode 100644 plugins/apps/poc-state-plugin/eslint.config.js create mode 100644 plugins/apps/poc-state-plugin/project.json create mode 100644 plugins/apps/poc-state-plugin/src/app/app.component.css create mode 100644 plugins/apps/poc-state-plugin/src/app/app.component.ts create mode 100644 plugins/apps/poc-state-plugin/src/assets/manifest.json create mode 100644 plugins/apps/poc-state-plugin/src/favicon.ico create mode 100644 plugins/apps/poc-state-plugin/src/index.html create mode 100644 plugins/apps/poc-state-plugin/src/main.ts create mode 100644 plugins/apps/poc-state-plugin/src/plugin.ts create mode 100644 plugins/apps/poc-state-plugin/src/styles.css create mode 100644 plugins/apps/poc-state-plugin/tsconfig.app.json create mode 100644 plugins/apps/poc-state-plugin/tsconfig.editor.json create mode 100644 plugins/apps/poc-state-plugin/tsconfig.json create mode 100644 plugins/apps/poc-state-plugin/tsconfig.plugin.json create mode 100644 plugins/apps/rename-layers-plugin/eslint.config.js create mode 100644 plugins/apps/rename-layers-plugin/project.json create mode 100644 plugins/apps/rename-layers-plugin/src/app/app.component.css create mode 100644 plugins/apps/rename-layers-plugin/src/app/app.component.html create mode 100644 plugins/apps/rename-layers-plugin/src/app/app.component.ts create mode 100644 plugins/apps/rename-layers-plugin/src/app/app.config.ts create mode 100644 plugins/apps/rename-layers-plugin/src/app/app.routes.ts create mode 100644 plugins/apps/rename-layers-plugin/src/app/model.ts create mode 100644 plugins/apps/rename-layers-plugin/src/assets/icon.png create mode 100644 plugins/apps/rename-layers-plugin/src/assets/manifest.json create mode 100644 plugins/apps/rename-layers-plugin/src/favicon.ico create mode 100644 plugins/apps/rename-layers-plugin/src/index.html create mode 100644 plugins/apps/rename-layers-plugin/src/main.ts create mode 100644 plugins/apps/rename-layers-plugin/src/plugin.ts create mode 100644 plugins/apps/rename-layers-plugin/src/styles.css create mode 100644 plugins/apps/rename-layers-plugin/tsconfig.app.json create mode 100644 plugins/apps/rename-layers-plugin/tsconfig.editor.json create mode 100644 plugins/apps/rename-layers-plugin/tsconfig.json create mode 100644 plugins/apps/rename-layers-plugin/tsconfig.plugin.json create mode 100644 plugins/apps/table-plugin/eslint.config.js create mode 100644 plugins/apps/table-plugin/project.json create mode 100644 plugins/apps/table-plugin/src/app/app.component.css create mode 100644 plugins/apps/table-plugin/src/app/app.component.html create mode 100644 plugins/apps/table-plugin/src/app/app.component.ts create mode 100644 plugins/apps/table-plugin/src/app/app.config.ts create mode 100644 plugins/apps/table-plugin/src/app/app.routes.ts create mode 100644 plugins/apps/table-plugin/src/app/model.ts create mode 100644 plugins/apps/table-plugin/src/app/nx-welcome.component.ts create mode 100644 plugins/apps/table-plugin/src/assets/.gitkeep create mode 100644 plugins/apps/table-plugin/src/assets/close.svg create mode 100644 plugins/apps/table-plugin/src/assets/icon.png create mode 100644 plugins/apps/table-plugin/src/assets/manifest.json create mode 100644 plugins/apps/table-plugin/src/favicon.ico create mode 100644 plugins/apps/table-plugin/src/index.html create mode 100644 plugins/apps/table-plugin/src/main.ts create mode 100644 plugins/apps/table-plugin/src/plugin.ts create mode 100644 plugins/apps/table-plugin/src/styles.css create mode 100644 plugins/apps/table-plugin/tsconfig.app.json create mode 100644 plugins/apps/table-plugin/tsconfig.editor.json create mode 100644 plugins/apps/table-plugin/tsconfig.json create mode 100644 plugins/apps/table-plugin/tsconfig.plugin.json create mode 100644 plugins/commitlint.config.js create mode 100644 plugins/docs/api-docs.md create mode 100644 plugins/docs/create-angular-plugin.md create mode 100644 plugins/docs/create-api.md create mode 100644 plugins/docs/create-plugin.md create mode 100644 plugins/docs/images/plugin-menu.png create mode 100644 plugins/docs/publish-package.md create mode 100644 plugins/docs/test-e2e.md create mode 100644 plugins/eslint.base.config.js create mode 100644 plugins/eslint.config.js create mode 100644 plugins/libs/plugin-types/README.md create mode 100644 plugins/libs/plugin-types/index.d.ts create mode 100644 plugins/libs/plugin-types/package.json create mode 100644 plugins/libs/plugin-types/project.json create mode 100644 plugins/libs/plugin-types/tsconfig.json create mode 100644 plugins/libs/plugins-runtime/README.md create mode 100644 plugins/libs/plugins-runtime/eslint.config.js create mode 100644 plugins/libs/plugins-runtime/package-lock.json create mode 100644 plugins/libs/plugins-runtime/package.json create mode 100644 plugins/libs/plugins-runtime/project.json create mode 100644 plugins/libs/plugins-runtime/src/index.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/api/index.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/api/openUI.api.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/api/plugin-api.spec.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/assets/resize.svg create mode 100644 plugins/libs/plugins-runtime/src/lib/create-modal.spec.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/create-modal.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/create-plugin.spec.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/create-plugin.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/create-sandbox.spec.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/create-sandbox.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/drag-handler.spec.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/drag-handler.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/global.d.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/load-plugin.spec.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/load-plugin.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/modal/plugin-modal.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/modal/plugin.modal.css create mode 100644 plugins/libs/plugins-runtime/src/lib/models/manifest.model.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/models/manifest.schema.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/models/open-ui-options.model.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/models/open-ui-options.schema.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/models/plugin-config.model.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/models/plugin.model.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/parse-manifest.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/parse-translate.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/plugin-manager.spec.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/plugin-manager.ts create mode 100644 plugins/libs/plugins-runtime/src/lib/ses.ts create mode 100644 plugins/libs/plugins-runtime/tsconfig.json create mode 100644 plugins/libs/plugins-runtime/tsconfig.lib.json create mode 100644 plugins/libs/plugins-runtime/tsconfig.spec.json create mode 100644 plugins/libs/plugins-runtime/vite.config.ts create mode 100644 plugins/libs/plugins-styles/README.md create mode 100644 plugins/libs/plugins-styles/package.json create mode 100644 plugins/libs/plugins-styles/project.json create mode 100644 plugins/libs/plugins-styles/src/lib/components/button.css create mode 100644 plugins/libs/plugins-styles/src/lib/components/checkbox.css create mode 100644 plugins/libs/plugins-styles/src/lib/components/icon.css create mode 100644 plugins/libs/plugins-styles/src/lib/components/input.css create mode 100644 plugins/libs/plugins-styles/src/lib/components/radio-button.css create mode 100644 plugins/libs/plugins-styles/src/lib/components/select.css create mode 100644 plugins/libs/plugins-styles/src/lib/components/switch.css create mode 100644 plugins/libs/plugins-styles/src/lib/core/fonts.css create mode 100644 plugins/libs/plugins-styles/src/lib/core/generic.css create mode 100644 plugins/libs/plugins-styles/src/lib/core/spacing.css create mode 100644 plugins/libs/plugins-styles/src/lib/core/swatches.css create mode 100644 plugins/libs/plugins-styles/src/lib/icons/chevron-bottom.svg create mode 100644 plugins/libs/plugins-styles/src/lib/styles.css create mode 100644 plugins/nx.json create mode 100644 plugins/package-lock.json create mode 100644 plugins/package.json create mode 100644 plugins/project.json create mode 100644 plugins/tools/eslint.config.js create mode 100644 plugins/tools/plugins/plugin-tasks.ts create mode 100644 plugins/tools/scripts/build-css.mjs create mode 100644 plugins/tools/scripts/build-types.mjs create mode 100644 plugins/tools/scripts/publish.ts create mode 100644 plugins/tools/tsconfig.json create mode 100644 plugins/tools/typedoc.css create mode 100644 plugins/tsconfig.base.json create mode 100644 plugins/typedoc.json create mode 100644 plugins/vitest.workspace.ts diff --git a/plugins/.env.example b/plugins/.env.example new file mode 100644 index 0000000000..f5705bb307 --- /dev/null +++ b/plugins/.env.example @@ -0,0 +1,3 @@ +E2E_LOGIN_EMAIL="" +E2E_LOGIN_PASSWORD="" +E2E_SCREENSHOTS= "false" diff --git a/plugins/.gitignore b/plugins/.gitignore new file mode 100644 index 0000000000..4e7bf462a8 --- /dev/null +++ b/plugins/.gitignore @@ -0,0 +1,55 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +dist +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 +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db + +.nx/cache +.nx/workspace-data +.env + +.angular + +**/assets/plugin.js + +docs/api + + +apps/e2e/screenshots/*.png + +vite.config.*.timestamp* +vitest.config.*.timestamp* \ No newline at end of file diff --git a/plugins/.husky/commit-msg b/plugins/.husky/commit-msg new file mode 100644 index 0000000000..0a4b97de53 --- /dev/null +++ b/plugins/.husky/commit-msg @@ -0,0 +1 @@ +npx --no -- commitlint --edit $1 diff --git a/plugins/.husky/pre-commit b/plugins/.husky/pre-commit new file mode 100644 index 0000000000..da759d5b04 --- /dev/null +++ b/plugins/.husky/pre-commit @@ -0,0 +1,5 @@ +#!/bin/bash + +if [ -z "$HUSKY_HOOK" ] || [ "$HUSKY_HOOK" = "pre-commit" ]; then + npm run lint:affected +fi diff --git a/plugins/.husky/pre-push b/plugins/.husky/pre-push new file mode 100644 index 0000000000..63a7e85031 --- /dev/null +++ b/plugins/.husky/pre-push @@ -0,0 +1,5 @@ +#!/bin/bash + +if [ "$HUSKY_HOOK" = "pre-push" ]; then + npm run lint:affected +fi diff --git a/plugins/.nvmrc b/plugins/.nvmrc new file mode 100644 index 0000000000..7bceec795e --- /dev/null +++ b/plugins/.nvmrc @@ -0,0 +1 @@ +v22.2.0 diff --git a/plugins/.prettierignore b/plugins/.prettierignore new file mode 100644 index 0000000000..31c80bfd66 --- /dev/null +++ b/plugins/.prettierignore @@ -0,0 +1,7 @@ +# Add files here to ignore them from prettier formatting +/dist +/coverage +/.nx/cache +.angular + +/.nx/workspace-data \ No newline at end of file diff --git a/plugins/.prettierrc b/plugins/.prettierrc new file mode 100644 index 0000000000..544138be45 --- /dev/null +++ b/plugins/.prettierrc @@ -0,0 +1,3 @@ +{ + "singleQuote": true +} diff --git a/plugins/.verdaccio/config.yml b/plugins/.verdaccio/config.yml new file mode 100644 index 0000000000..3a391bc39b --- /dev/null +++ b/plugins/.verdaccio/config.yml @@ -0,0 +1,25 @@ +# a list of other known repositories we can talk to +uplinks: + npmjs: + url: https://registry.npmjs.org/ + maxage: 60m + +packages: + '**': + # give all users (including non-authenticated users) full access + # because it is a local registry + access: $all + publish: $all + unpublish: $all + + # if package is not available locally, proxy requests to npm registry + proxy: npmjs + +# log settings +logs: + type: stdout + format: pretty + level: warn + +publish: + allow_offline: true # set offline to true to allow publish offline diff --git a/plugins/.vscode/extensions.json b/plugins/.vscode/extensions.json new file mode 100644 index 0000000000..6a302fe536 --- /dev/null +++ b/plugins/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "nrwl.angular-console", + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint", + "firsttris.vscode-jest-runner" + ] +} diff --git a/plugins/.vscode/settings.json b/plugins/.vscode/settings.json new file mode 100644 index 0000000000..8b54f915c7 --- /dev/null +++ b/plugins/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "prettier.singleQuote": true +} diff --git a/plugins/CHANGELOG.md b/plugins/CHANGELOG.md new file mode 100644 index 0000000000..67b0b183fa --- /dev/null +++ b/plugins/CHANGELOG.md @@ -0,0 +1,221 @@ +## 1.3.2 (2025-07-04) + +### 🩹 Fixes + +- plugins-runtime public package.json ([70fd69f](https://github.com/penpot/penpot-plugins/commit/70fd69f)) + +### ❤️ Thank You + +- Juanfran @juanfran + +## 1.3.1 (2025-07-04) + +### 🚀 Features + +- plugins-runtime as npm library ([41c56b1](https://github.com/penpot/penpot-plugins/commit/41c56b1)) + +### 🩹 Fixes + +- package-lock.json ([16b29f8](https://github.com/penpot/penpot-plugins/commit/16b29f8)) + +### ❤️ Thank You + +- Juanfran @juanfran + +## 1.3.0 (2025-06-25) + +### 🚀 Features + +- **plugin-types:** add skipChildren to exports ([b3373ba](https://github.com/penpot/penpot-plugins/commit/b3373ba)) +- **plugins-runtime:** change plugins modal z-index ([c6a4a7d](https://github.com/penpot/penpot-plugins/commit/c6a4a7d)) +- **plugins-runtime:** adds max resize to the screen size ([f2fe501](https://github.com/penpot/penpot-plugins/commit/f2fe501)) +- **plugins-runtime:** adds localstorage wrapper API for plugins ([0006ca9](https://github.com/penpot/penpot-plugins/commit/0006ca9)) +- **plugins-runtime:** add generateFontFaces method ([30e1d02](https://github.com/penpot/penpot-plugins/commit/30e1d02)) +- **poc-state-plugins:** add some methods to the example ([b95961a](https://github.com/penpot/penpot-plugins/commit/b95961a)) +- **poc-state-plugins:** example using the localstorage api ([b101523](https://github.com/penpot/penpot-plugins/commit/b101523)) + +### 🩹 Fixes + +- **plugin-colors-to-tokens:** adapt to Penpot tokens metadata format ([3a1ff00](https://github.com/penpot/penpot-plugins/commit/3a1ff00)) +- **plugin-colors-to-tokens:** avoid unvalid character in names ([dd0fd1a](https://github.com/penpot/penpot-plugins/commit/dd0fd1a)) +- **plugin-types:** add missing board properties ([de4a2a0](https://github.com/penpot/penpot-plugins/commit/de4a2a0)) +- **plugin-types:** fix problem with type ([9759964](https://github.com/penpot/penpot-plugins/commit/9759964)) +- **plugins-runtime:** add allow-same-origin to iframe ([65d5351](https://github.com/penpot/penpot-plugins/commit/65d5351)) +- **plugins-runtime:** fixes null checking issue ([6b5b562](https://github.com/penpot/penpot-plugins/commit/6b5b562)) +- **plugins-runtime:** fix problem with resize modal position ([45dc41d](https://github.com/penpot/penpot-plugins/commit/45dc41d)) +- **plugins-styles:** migrate to fonts css api v2 ([45a9ee9](https://github.com/penpot/penpot-plugins/commit/45a9ee9)) + +### ❤️ Thank You + +- alonso.torres +- Martynas Barzda +- Xavier Julian + +## 1.2.0 (2025-02-27) + +### 🚀 Features + +- upgrade nx & angular & prettier ([32de075](https://github.com/penpot/penpot-plugins/commit/32de075)) +- add ui.resize & ui.size api ([815181d](https://github.com/penpot/penpot-plugins/commit/815181d)) +- colors to tokens export plugin ([7f8a011](https://github.com/penpot/penpot-plugins/commit/7f8a011)) +- transform color & opacity to rgba ([9a3e6e0](https://github.com/penpot/penpot-plugins/commit/9a3e6e0)) +- **plugin-colors-to-tokens:** only rgba when the opacity is not 1 ([e922cf9](https://github.com/penpot/penpot-plugins/commit/e922cf9)) +- **plugin-types:** deprecated fields in colors ([6adcc4c](https://github.com/penpot/penpot-plugins/commit/6adcc4c)) +- **plugins-runtime:** add upload svg with images ([df925b5](https://github.com/penpot/penpot-plugins/commit/df925b5)) + +### 🩹 Fixes + +- duplicated css ([19ca648](https://github.com/penpot/penpot-plugins/commit/19ca648)) +- add error styles on invalid input ([1c29c34](https://github.com/penpot/penpot-plugins/commit/1c29c34)) +- remove nonexistent api ([3837f1c](https://github.com/penpot/penpot-plugins/commit/3837f1c)) + +### ❤️ Thank You + +- alonso.torres +- Juanfran @juanfran +- Michał Korczak + +## 1.1.0 (2024-12-12) + +### 🚀 Features + +- updated doc links ([cb49dfb](https://github.com/penpot/penpot-plugins/commit/cb49dfb)) +- **plugin-types:** add support for file history versions ([eab57d7](https://github.com/penpot/penpot-plugins/commit/eab57d7)) + +### 🩹 Fixes + +- styles rename layers ([40e08f8](https://github.com/penpot/penpot-plugins/commit/40e08f8)) +- **rename-layers:** i#8951 disable buttons when empty ([#8951](https://github.com/penpot/penpot-plugins/issues/8951)) + +### ❤️ Thank You + +- alonso.torres +- María Valderrama @mavalroot +- Marina López @cocotime + +# 1.0.0 (2024-10-25) + +### 🚀 Features + +- **plugins-runtime:** add close callback to load api ([aeddab7](https://github.com/penpot/penpot-plugins/commit/aeddab7)) +- **runtime:** unload plugin ([b4d0463](https://github.com/penpot/penpot-plugins/commit/b4d0463)) + +### 🩹 Fixes + +- search in icons plugin ([b4664a2](https://github.com/penpot/penpot-plugins/commit/b4664a2)) +- **table-plugin:** i#8965 empty cell values when importing csv files ([#8965](https://github.com/penpot/penpot-plugins/issues/8965)) + +### ❤️ Thank You + +- alonso.torres +- Juanfran @juanfran +- María Valderrama @mavalroot +- Marina López @cocotime + +## 0.12.0 (2024-10-04) + +### 🚀 Features + +- e2e tests ([1371af9](https://github.com/penpot/penpot-plugins/commit/1371af9)) +- add build to CI ([a434209](https://github.com/penpot/penpot-plugins/commit/a434209)) +- **api-doc:** update readme ([99ff81d](https://github.com/penpot/penpot-plugins/commit/99ff81d)) +- **docs:** add examples for new permissions ([2f0f7a6](https://github.com/penpot/penpot-plugins/commit/2f0f7a6)) +- **e2e:** add screenshots ENV variable ([9292bf2](https://github.com/penpot/penpot-plugins/commit/9292bf2)) +- **plugin-types:** add ruler guides and new zoom methods ([c8066be](https://github.com/penpot/penpot-plugins/commit/c8066be)) +- **plugin-types:** add apis for comments ([e34e56c](https://github.com/penpot/penpot-plugins/commit/e34e56c)) +- **plugin-types:** update comment related methods ([50bc7ba](https://github.com/penpot/penpot-plugins/commit/50bc7ba)) +- **plugin-types:** removed old method and replaced with attributes ([1866299](https://github.com/penpot/penpot-plugins/commit/1866299)) +- **plugins-runtime:** plugin live reload ([bbc77e4](https://github.com/penpot/penpot-plugins/commit/bbc77e4)) +- **plugins-runtime:** adds new permissions `comment:read`, `comment:write` and `allow:downloads` ([5adbee2](https://github.com/penpot/penpot-plugins/commit/5adbee2)) +- **plugins-runtime:** expose some public JS APIs to the plugins code ([22dfa92](https://github.com/penpot/penpot-plugins/commit/22dfa92)) +- **poc-state-plugin:** add new functions to the plugin to test comments and rulers ([6adee11](https://github.com/penpot/penpot-plugins/commit/6adee11)) +- **rename-layers:** final review - undo group ([2909bcc](https://github.com/penpot/penpot-plugins/commit/2909bcc)) +- **runtime:** refactor plugin state ([16595c2](https://github.com/penpot/penpot-plugins/commit/16595c2)) +- **runtime:** remove deprecated method ([ccc5f78](https://github.com/penpot/penpot-plugins/commit/ccc5f78)) +- **table-plugin:** enhancement save config ([07af57d](https://github.com/penpot/penpot-plugins/commit/07af57d)) + +### 🩹 Fixes + +- **e2e:** update dump params to shape model ([ade39ee](https://github.com/penpot/penpot-plugins/commit/ade39ee)) +- **plugin-types:** optional path curves ([0ea57f1](https://github.com/penpot/penpot-plugins/commit/0ea57f1)) +- **plugins-runtime:** clean pending timeouts ([8870dda](https://github.com/penpot/penpot-plugins/commit/8870dda)) +- **plugins-runtime:** prevent plugin execution after close ([b65492a](https://github.com/penpot/penpot-plugins/commit/b65492a)) +- **plugins-styles:** import svg inline ([567b0b5](https://github.com/penpot/penpot-plugins/commit/567b0b5)) +- **runtime:** ses errorTrapping interferes with penpot error handler ([8c0e36d](https://github.com/penpot/penpot-plugins/commit/8c0e36d)) +- **runtime:** prevent override Penpot objects ([120e9e5](https://github.com/penpot/penpot-plugins/commit/120e9e5)) + +### ❤️ Thank You + +- alonso.torres +- Juanfran @juanfran +- María Valderrama @mavalroot + +## 0.10.0 (2024-07-31) + +### 🚀 Features + +- change permissions names ([99126f8](https://github.com/penpot/penpot-plugins/commit/99126f8)) +- stop offering icons in the style library ([5a219e9](https://github.com/penpot/penpot-plugins/commit/5a219e9)) +- new publish script ([5114e78](https://github.com/penpot/penpot-plugins/commit/5114e78)) +- init e2e test ([b0af705](https://github.com/penpot/penpot-plugins/commit/b0af705)) +- **docs:** how api docs are generated ([e047977](https://github.com/penpot/penpot-plugins/commit/e047977)) +- **docs:** basic css theme for typedoc ([0eac44d](https://github.com/penpot/penpot-plugins/commit/0eac44d)) +- **plugin-types:** update API types ([bffa467](https://github.com/penpot/penpot-plugins/commit/bffa467)) +- **plugin-types:** add pages info to the file ([b54edb3](https://github.com/penpot/penpot-plugins/commit/b54edb3)) +- **plugin-types:** add parent reference to the shape ([2588778](https://github.com/penpot/penpot-plugins/commit/2588778)) +- **plugin-types:** add root shape reference to the pages ([c712759](https://github.com/penpot/penpot-plugins/commit/c712759)) +- **plugin-types:** add undo block operations to api ([1d3ad89](https://github.com/penpot/penpot-plugins/commit/1d3ad89)) +- **plugins-runtime:** update selection ([f36fa23](https://github.com/penpot/penpot-plugins/commit/f36fa23)) +- **plugins-runtime:** add new events 'contentsave' and 'shapechange', changed on/off signatures ([2b8a76b](https://github.com/penpot/penpot-plugins/commit/2b8a76b)) +- **plugins-runtime:** add detach shape from component method ([ff488d4](https://github.com/penpot/penpot-plugins/commit/ff488d4)) +- **plugins-runtime:** add API to access to prototypes ([a554775](https://github.com/penpot/penpot-plugins/commit/a554775)) +- **plugins-runtime:** add method for pages ([9a9b33a](https://github.com/penpot/penpot-plugins/commit/9a9b33a)) +- **plugins-types:** expose new attributes ([9ce45a2](https://github.com/penpot/penpot-plugins/commit/9ce45a2)) + +### 🩹 Fixes + +- typo checkox > checkbox ([877a3f2](https://github.com/penpot/penpot-plugins/commit/877a3f2)) +- avoid plugin location question ([b4c6165](https://github.com/penpot/penpot-plugins/commit/b4c6165)) +- add files so no unexpected when creating new plugin ([ef5629a](https://github.com/penpot/penpot-plugins/commit/ef5629a)) +- eslint migration to ESM docs ([249ea62](https://github.com/penpot/penpot-plugins/commit/249ea62)) +- fix runtime version ([95afbf3](https://github.com/penpot/penpot-plugins/commit/95afbf3)) +- horizontal scroll height on plugins modal ([08f989a](https://github.com/penpot/penpot-plugins/commit/08f989a)) +- **contrast-plugin:** update colors when shape change ([8ce04d3](https://github.com/penpot/penpot-plugins/commit/8ce04d3)) +- **docs:** add missing variant on destructive button ([9fa96e9](https://github.com/penpot/penpot-plugins/commit/9fa96e9)) +- **plugin-types:** readonly PenpotShapeBase width & height ([415284f](https://github.com/penpot/penpot-plugins/commit/415284f)) +- **plugins-runtime:** remove plugin event listener on close ([2138985](https://github.com/penpot/penpot-plugins/commit/2138985)) +- **plugins-runtime:** fix problem with types in test ([17db173](https://github.com/penpot/penpot-plugins/commit/17db173)) +- **styles:** input, button & select worksans font family ([1b9d3b2](https://github.com/penpot/penpot-plugins/commit/1b9d3b2)) + +### ❤️ Thank You + +- alonso.torres +- Juanfran @juanfran +- María Valderrama @mavalroot +- Marina López @cocotime +- Xaviju + +## 0.9.0 (2024-07-10) + +### 🚀 Features + +- change permissions names ([99126f8](https://github.com/penpot/penpot-plugins/commit/99126f8)) +- stop offering icons in the style library ([5a219e9](https://github.com/penpot/penpot-plugins/commit/5a219e9)) +- new publish script ([5114e78](https://github.com/penpot/penpot-plugins/commit/5114e78)) +- **plugin-types:** update API types ([bffa467](https://github.com/penpot/penpot-plugins/commit/bffa467)) +- **plugins-runtime:** update selection ([f36fa23](https://github.com/penpot/penpot-plugins/commit/f36fa23)) +- **plugins-types:** expose new attributes ([9ce45a2](https://github.com/penpot/penpot-plugins/commit/9ce45a2)) + +### 🩹 Fixes + +- typo checkox > checkbox ([877a3f2](https://github.com/penpot/penpot-plugins/commit/877a3f2)) +- avoid plugin location question ([b4c6165](https://github.com/penpot/penpot-plugins/commit/b4c6165)) +- fix runtime version ([2401a77](https://github.com/penpot/penpot-plugins/commit/2401a77)) +- **styles:** input, button & select worksans font family ([1b9d3b2](https://github.com/penpot/penpot-plugins/commit/1b9d3b2)) + +### ❤️ Thank You + +- alonso.torres +- Juanfran @juanfran +- Marina López @cocotime +- Xaviju @xaviju diff --git a/plugins/CONTRIBUTING.md b/plugins/CONTRIBUTING.md new file mode 100644 index 0000000000..e4440cf083 --- /dev/null +++ b/plugins/CONTRIBUTING.md @@ -0,0 +1,134 @@ +# Contributing Guide + +Thank you for your interest in contributing to Penpot Plugins. This is a +generic guide that details how to contribute to Penpot Plugins in a way that +is efficient for everyone. If you want a specific documentation for +different parts of the platform, please refer to `docs/` directory. + +## Reporting Bugs + +We are using [GitHub Issues](https://github.com/penpot/penpot-plugins/issues) +for our public bugs. We keep a close eye on this and try to make it +clear when we have an internal fix in progress. Before filing a new +task, try to make sure your problem doesn't already exist. + +If you found a bug, please report it, as far as possible with: + +- a detailed explanation of steps to reproduce the error +- a browser and the browser version used +- a dev tools console exception stack trace (if it is available) + +If you found a bug that you consider better discuss in private (for +example: security bugs), consider first send an email to +`support@penpot.app`. + +**We don't have formal bug bounty program for security reports; this +is an open source application and your contribution will be recognized +in the changelog.** + +## Pull requests + +If you want propose a change or bug fix with the Pull-Request system +firstly you should carefully read the **DCO** section and format your +commits accordingly. + +If you intend to fix a bug it's fine to submit a pull request right +away but we still recommend to file an issue detailing what you're +fixing. This is helpful in case we don't accept that specific fix but +want to keep track of the issue. + +If you want to implement or start working in a new feature, please +open a **question** / **discussion** issue for it. No pull-request +will be accepted without previous chat about the changes, +independently if it is a new feature, already planned feature or small +quick win. + +If is going to be your first pull request, You can learn how from this +free video series: + +https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github + +We will use the `easy fix` mark for tag for indicate issues that are +easy for beginners. + +## Commit Guidelines + +To maintain a clear and organized commit history in this repository, we adhere to the Conventional Commits specification. Conventional Commits provide a structured format for commit messages, making it easier to track changes, automate versioning, and improve readability. + +Please familiarize yourself with the Conventional Commits rules by visiting the [official Conventional Commits website](https://www.conventionalcommits.org/en/v1.0.0/). This specification outlines how to structure your commit messages, including types, scopes, and descriptions. + +## Code of conduct + +As contributors and maintainers of this project, we pledge to respect +all people who contribute through reporting issues, posting feature +requests, updating documentation, submitting pull requests or patches, +and other activities. + +We are committed to making participation in this project a +harassment-free experience for everyone, regardless of level of +experience, gender, gender identity and expression, sexual +orientation, disability, personal appearance, body size, race, +ethnicity, age, or religion. + +Examples of unacceptable behavior by participants include the use of +sexual language or imagery, derogatory comments or personal attacks, +trolling, public or private harassment, insults, or other +unprofessional conduct. + +Project maintainers have the right and responsibility to remove, edit, +or reject comments, commits, code, wiki edits, issues, and other +contributions that are not aligned to this Code of Conduct. Project +maintainers who do not follow the Code of Conduct may be removed from +the project team. + +This code of conduct applies both within project spaces and in public +spaces when an individual is representing the project or its +community. + +Instances of abusive, harassing, or otherwise unacceptable behavior +may be reported by opening an issue or contacting one or more of the +project maintainers. + +This Code of Conduct is adapted from the Contributor Covenant, version +1.1.0, available from http://contributor-covenant.org/version/1/1/0/ + +## Developer's Certificate of Origin (DCO) + +By submitting code you are agree and can certify the below: + + Developer's Certificate of Origin 1.1 + + By making a contribution to this project, I certify that: + + (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + + (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + + (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + + (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +Then, all your code patches (**documentation are excluded**) should +contain a sign-off at the end of the patch/commit description body. It +can be automatically added on adding `-s` parameter to `git commit`. + +This is an example of the aspect of the line: + + Signed-off-by: Andrey Antukh + +Please, use your real name (sorry, no pseudonyms or anonymous +contributions are allowed). diff --git a/plugins/LICENSE b/plugins/LICENSE new file mode 100644 index 0000000000..0350025fa2 --- /dev/null +++ b/plugins/LICENSE @@ -0,0 +1,382 @@ +# Mozilla Public License Version 2.0 + +1. Definitions + +--- + +1.1. "Contributor" +means each individual or legal entity that creates, contributes to +the creation of, or owns Covered Software. + +1.2. "Contributor Version" +means the combination of the Contributions of others (if any) used +by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" +means Covered Software of a particular Contributor. + +1.4. "Covered Software" +means Source Code Form to which the initial Contributor has attached +the notice in Exhibit A, the Executable Form of such Source Code +Form, and Modifications of such Source Code Form, in each case +including portions thereof. + +1.5. "Incompatible With Secondary Licenses" +means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" +means any form of the work other than Source Code Form. + +1.7. "Larger Work" +means a work that combines Covered Software with other material, in +a separate file or files, that is not Covered Software. + +1.8. "License" +means this document. + +1.9. "Licensable" +means having the right to grant, to the maximum extent possible, +whether at the time of the initial grant or subsequently, any and +all of the rights conveyed by this License. + +1.10. "Modifications" +means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor +means any patent claim(s), including without limitation, method, +process, and apparatus claims, in any patent Licensable by such +Contributor that would be infringed, but for the grant of the +License, by the making, using, selling, offering for sale, having +made, import, or transfer of either its Contributions or its +Contributor Version. + +1.12. "Secondary License" +means either the GNU General Public License, Version 2.0, the GNU +Lesser General Public License, Version 2.1, the GNU Affero General +Public License, Version 3.0, or any later versions of those +licenses. + +1.13. "Source Code Form" +means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") +means an individual or a legal entity exercising rights under this +License. For legal entities, "You" includes any entity that +controls, is controlled by, or is under common control with You. For +purposes of this definition, "control" means (a) the power, direct +or indirect, to cause the direction or management of such entity, +whether by contract or otherwise, or (b) ownership of more than +fifty percent (50%) of the outstanding shares or beneficial +ownership of such entity. + +2. License Grants and Conditions + +--- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) +Licensable by such Contributor to use, reproduce, make available, +modify, display, perform, distribute, and otherwise exploit its +Contributions, either on an unmodified basis, with Modifications, or +as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer +for sale, have made, import, and otherwise transfer either its +Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; +or + +(b) for infringements caused by: (i) Your and any other third party's +modifications of Covered Software, or (ii) the combination of its +Contributions with other software (except as part of its Contributor +Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of +its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities + +--- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code +Form, as described in Section 3.1, and You must inform recipients of +the Executable Form how they can obtain a copy of such Source Code +Form by reasonable means in a timely manner, at a charge no more +than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this +License, or sublicense it under different terms, provided that the +license for the Executable Form does not attempt to limit or alter +the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + +--- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination + +--- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +--- + +- * +- 6. Disclaimer of Warranty \* +- ------------------------- \* +- * +- Covered Software is provided under this License on an "as is" \* +- basis, without warranty of any kind, either expressed, implied, or \* +- statutory, including, without limitation, warranties that the \* +- Covered Software is free of defects, merchantable, fit for a \* +- particular purpose or non-infringing. The entire risk as to the \* +- quality and performance of the Covered Software is with You. \* +- Should any Covered Software prove defective in any respect, You \* +- (not any Contributor) assume the cost of any necessary servicing, \* +- repair, or correction. This disclaimer of warranty constitutes an \* +- essential part of this License. No use of any Covered Software is \* +- authorized under this License except under this disclaimer. \* +- * + +--- + +--- + +- * +- 7. Limitation of Liability \* +- -------------------------- \* +- * +- Under no circumstances and under no legal theory, whether tort \* +- (including negligence), contract, or otherwise, shall any \* +- Contributor, or anyone who distributes Covered Software as \* +- permitted above, be liable to You for any direct, indirect, \* +- special, incidental, or consequential damages of any character \* +- including, without limitation, damages for lost profits, loss of \* +- goodwill, work stoppage, computer failure or malfunction, or any \* +- and all other commercial damages or losses, even if such party \* +- shall have been informed of the possibility of such damages. This \* +- limitation of liability shall not apply to liability for death or \* +- personal injury resulting from such party's negligence to the \* +- extent applicable law prohibits such limitation. Some \* +- jurisdictions do not allow the exclusion or limitation of \* +- incidental or consequential damages, so this exclusion and \* +- limitation may not apply to You. \* +- * + +--- + +8. Litigation + +--- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous + +--- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License + +--- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +## Exhibit A - Source Code Form License Notice + +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +## Exhibit B - "Incompatible With Secondary Licenses" Notice + +This Source Code Form is "Incompatible With Secondary Licenses", as +defined by the Mozilla Public License, v. 2.0. diff --git a/plugins/README.md b/plugins/README.md new file mode 100644 index 0000000000..399aa37943 --- /dev/null +++ b/plugins/README.md @@ -0,0 +1,82 @@ +# Penpot Plugins + +## What can you find here? + +We've been working in an MVP to allow users to develop their own plugins and use the existing ones. + +There are 2 important folders to keep an eye on: `apps` and `libs`. + +In the `libs` folder you'll find: + +- plugins-runtime: here you'll find the code that initializes the plugin and sets a few listeners to know when the penpot page/file/selection changes. + It has its own [README](libs/plugins-runtime/README.md). +- plugins-styles: basic css library with penpot styles in case you need help for styling your plugins. + +In the `apps` folder you'll find some examples that use the libraries mentioned above. + +- contrast-plugin: to run this example check Create a plugin from scratch + +- example-styles: to run this example you should run + +``` +npm run start:styles-example +``` + +Open in your browser: `http://localhost:4202/` + +## Run Penpot sample plugins + +This guide will help you launch a Penpot plugin from the penpot-plugins repository. Before proceeding, ensure that you have Penpot running locally by following the [setup instructions](https://help.penpot.app/technical-guide/developer/devenv/). + +In the terminal, navigate to the **penpot-plugins** repository and run `npm install` to install the required dependencies. +Then, run `npm start` to launch the plugins wrapper. + +After installing the dependencies, choose a plugin to launch. You can either run one of the provided examples or create your own (see "Creating a plugin from scratch" below). +To launch a plugin, Open a new terminal tab and run the appropriate startup script for the chosen plugin. + +For instance, to launch the Contrast plugin, use the following command: + +``` +// for the contrast plugin +npm run start:plugin:contrast +``` + +Finally, open in your browser the specific port. In this specific example would be `http://localhost:4302` + +A table listing the available plugins and their corresponding startup commands is provided below. + +## Sample plugins + +| Plugin | Description | PORT | Start command | Manifest URL | +| ----------------------- | ----------------------------------------------------------- | ---- | ------------------------------------- | ------------------------------------------ | +| poc-state-plugin | Sandbox plugin to test new plugins api functionality | 4301 | npm run start:plugin:poc-state | http://localhost:4301/assets/manifest.json | +| contrast-plugin | Sample plugin that gives you color contrast information | 4302 | npm run start:plugin:contrast | http://localhost:4302/assets/manifest.json | +| icons-plugin | Tool to add icons from [Feather](https://feathericons.com/) | 4303 | npm run start:plugin:icons | http://localhost:4303/assets/manifest.json | +| lorem-ipsum-plugin | Generate Lorem ipsum text | 4304 | npm run start:plugin:loremipsum | http://localhost:4304/assets/manifest.json | +| create-palette-plugin | Creates a board with all the palette colors | 4305 | npm run start:plugin:palette | http://localhost:4305/assets/manifest.json | +| table-plugin | Create or import table | 4306 | npm run start:table-plugin | http://localhost:4306/assets/manifest.json | +| rename-layers-plugin | Rename layers in bulk | 4307 | npm run start:plugin:renamelayers | http://localhost:4307/assets/manifest.json | +| colors-to-tokens-plugin | Generate tokens JSON file | 4308 | npm run start:plugin:colors-to-tokens | http://localhost:4308/assets/manifest.json | + +## Web Apps + +| App | Description | PORT | Start command | URL | +| --------------- | ----------------------------------------------------------------- | ---- | -------------------------------- | ---------------------- | +| plugins-runtime | Runtime for the plugins subsystem | 4200 | npm run start:app:runtime | | +| example-styles | Showcase of some of the Penpot styles that can be used in plugins | 4201 | npm run start:app:styles-example | http://localhost:4201/ | + +## Creating a plugin from scratch + +If you want to create a new plugin, read the following [README](docs/create-plugin.md) + +## License + +``` +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. + +Copyright (c) KALEIDOS INC +``` + +Penpot is a Kaleidos’ [open source project](https://kaleidos.net/) diff --git a/plugins/apps/colors-to-tokens-plugin/eslint.config.js b/plugins/apps/colors-to-tokens-plugin/eslint.config.js new file mode 100644 index 0000000000..7aa90c2ab0 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/eslint.config.js @@ -0,0 +1,51 @@ +import baseConfig from '../../eslint.config.js'; +import { compat } from '../../eslint.base.config.js'; + +export default [ + ...baseConfig, + ...compat + .config({ + extends: [ + 'plugin:@nx/angular', + 'plugin:@angular-eslint/template/process-inline-templates', + ], + }) + .map((config) => ({ + ...config, + files: ['**/*.ts'], + rules: { + '@angular-eslint/directive-selector': [ + 'error', + { + type: 'attribute', + prefix: 'app', + style: 'camelCase', + }, + ], + '@angular-eslint/component-selector': [ + 'error', + { + type: 'element', + prefix: 'app', + style: 'kebab-case', + }, + ], + }, + })), + ...compat + .config({ extends: ['plugin:@nx/angular-template'] }) + .map((config) => ({ + ...config, + files: ['**/*.html'], + rules: {}, + })), + { ignores: ['**/assets/*.js'] }, + { + languageOptions: { + parserOptions: { + project: './tsconfig.*?.json', + tsconfigRootDir: import.meta.dirname, + }, + }, + }, +]; diff --git a/plugins/apps/colors-to-tokens-plugin/project.json b/plugins/apps/colors-to-tokens-plugin/project.json new file mode 100644 index 0000000000..01ad02bbe6 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/project.json @@ -0,0 +1,79 @@ +{ + "name": "colors-to-tokens-plugin", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "prefix": "app", + "sourceRoot": "apps/colors-to-tokens-plugin/src", + "tags": ["type:plugin"], + "targets": { + "build": { + "executor": "@angular-devkit/build-angular:application", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/apps/colors-to-tokens-plugin", + "index": "apps/colors-to-tokens-plugin/src/index.html", + "browser": "apps/colors-to-tokens-plugin/src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "apps/colors-to-tokens-plugin/tsconfig.app.json", + "assets": [ + "apps/colors-to-tokens-plugin/src/favicon.ico", + "apps/colors-to-tokens-plugin/src/assets" + ], + "styles": [ + "libs/plugins-styles/src/lib/styles.css", + "apps/colors-to-tokens-plugin/src/styles.css" + ], + "scripts": [], + "optimization": { + "scripts": true, + "styles": true, + "fonts": false + } + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production", + "dependsOn": ["buildPlugin"] + }, + "serve": { + "executor": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "colors-to-tokens-plugin:build:production" + }, + "development": { + "buildTarget": "colors-to-tokens-plugin:build:development", + "host": "0.0.0.0", + "port": 4308 + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "executor": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "colors-to-tokens-plugin:build" + } + } + } +} diff --git a/plugins/apps/colors-to-tokens-plugin/src/app/app.component.css b/plugins/apps/colors-to-tokens-plugin/src/app/app.component.css new file mode 100644 index 0000000000..e147bb30b6 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/src/app/app.component.css @@ -0,0 +1,87 @@ +:host { + display: flex; + flex-direction: column; + gap: var(--spacing-24); + padding-top: var(--spacing-36); +} + +.title { + color: var(--foreground-primary); +} + +.description { + padding-bottom: var(--spacing-4); + + a { + color: var(--accent-primary); + text-decoration: none; + } +} + +.title, +.description { + text-wrap: pretty; + text-align: center; +} + +.actions { + display: flex; + gap: var(--spacing-8); + justify-content: center; +} + +.download-btn { + display: flex; + gap: var(--spacing-4); + align-items: center; + + app-svg { + --svg-stroke-color: var(--background-primary); + } +} + +.restart-btn { + display: flex; + gap: var(--spacing-4); + align-items: center; + + app-svg { + --svg-stroke-color: var(--foreground-secondary); + } + + &:hover { + app-svg { + --svg-stroke-color: var(--accent-primary); + } + } +} + +/* Override default button appearance */ +.download-btn[data-appearance='primary']:is(button):disabled { + color: var(--background-secondary); + background-color: var(--accent-primary-muted); + border: 2px solid var(--accent-primary-muted); + + app-svg { + --svg-stroke-color: var(--background-primary); + } +} + +.success { + display: flex; + background-color: var(--success-950); + border-radius: var(--spacing-8); + border: 1px solid var(--success-500); + color: var(--app-white); + gap: var(--spacing-8); + padding: var(--spacing-8); + + app-svg { + --svg-stroke-color: var(--success-500); + } +} + +.download-note { + padding: 0 var(--spacing-8); + text-align: center; +} diff --git a/plugins/apps/colors-to-tokens-plugin/src/app/app.component.ts b/plugins/apps/colors-to-tokens-plugin/src/app/app.component.ts new file mode 100644 index 0000000000..7403a5aceb --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/src/app/app.component.ts @@ -0,0 +1,183 @@ +import { Component, effect, inject, linkedSignal } from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { ActivatedRoute } from '@angular/router'; +import type { + PluginMessageEvent, + PluginUIEvent, + ThemePluginEvent, + SetColorsPluginEvent, + TokenFileExtraData, +} from '../model'; +import { filter, fromEvent, map, merge, take } from 'rxjs'; +import { transformToToken } from './utils/transform-to-token'; +import { SvgComponent } from './components/svg.component'; + +@Component({ + selector: 'app-root', + imports: [SvgComponent], + template: ` +

Convert your colors assets to Design Tokens

+

+ A Penpot plugin to generate a JSON file with your color styles in a + Design Token Standard format. +

+ @if (result()) { +
+ + Colors convertered to tokens successfully! +
+ } +
+ @if (result()) { + + } @else { + + } + + +
+ + + `, + styleUrl: './app.component.css', + host: { + '[attr.data-theme]': 'theme()', + }, +}) +export class AppComponent { + route = inject(ActivatedRoute); + messages$ = fromEvent>(window, 'message'); + + initialTheme$ = this.route.queryParamMap.pipe( + map((params) => params.get('theme')), + filter((theme) => !!theme), + take(1), + ); + + theme = toSignal( + merge( + this.initialTheme$, + this.messages$.pipe( + filter( + (event): event is MessageEvent => + event.data.type === 'theme', + ), + map((event) => { + return event.data.content; + }), + ), + ), + ); + + #result = toSignal( + this.messages$.pipe( + filter( + (event): event is MessageEvent => + event.data.type === 'set-colors', + ), + map((event) => { + if (event.data.colors) { + try { + const tokens = transformToToken(event.data.colors); + + return { + tokens, + name: event.data.fileName, + }; + } catch (error) { + console.error(error); + } + } + + return null; + }), + ), + { + initialValue: null, + }, + ); + + result = linkedSignal(() => this.#result()); + + constructor() { + effect(() => { + if (this.result()) { + this.#sendMessage({ + type: 'resize', + width: 410, + height: 340, + }); + } else { + this.#sendMessage({ type: 'reset' }); + } + }); + } + + #sendMessage(message: PluginUIEvent): void { + parent.postMessage(message, '*'); + } + + convert(): void { + this.#sendMessage({ type: 'get-colors' }); + } + + restart(): void { + this.result.set(null); + } + + handleDownload() { + const fileTokens = this.#result(); + if (!fileTokens) return; + + const extraData: TokenFileExtraData = { + $themes: [], + $metadata: { + activeThemes: [], + tokenSetOrder: [], + activeSets: [], + }, + }; + + const tokensStructure = { + ...fileTokens.tokens, + ...extraData, + }; + + const blob = new Blob([JSON.stringify(tokensStructure)], { + type: 'text/json', + }); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = fileTokens.name + '-tokens.json'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + } +} diff --git a/plugins/apps/colors-to-tokens-plugin/src/app/app.config.ts b/plugins/apps/colors-to-tokens-plugin/src/app/app.config.ts new file mode 100644 index 0000000000..1b3e4af314 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/src/app/app.config.ts @@ -0,0 +1,6 @@ +import { ApplicationConfig } from '@angular/core'; +import { provideRouter } from '@angular/router'; + +export const appConfig: ApplicationConfig = { + providers: [provideRouter([])], +}; diff --git a/plugins/apps/colors-to-tokens-plugin/src/app/components/svg.component.css b/plugins/apps/colors-to-tokens-plugin/src/app/components/svg.component.css new file mode 100644 index 0000000000..5d617edb0f --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/src/app/components/svg.component.css @@ -0,0 +1,14 @@ +:host { + display: block; + + --svg-stroke-color: transparent; + --svg-fill-color: transparent; + + inline-size: var(--spacing-16); + block-size: var(--spacing-16); +} + +svg { + stroke: var(--svg-stroke-color); + fill: var(--svg-fill-color); +} diff --git a/plugins/apps/colors-to-tokens-plugin/src/app/components/svg.component.ts b/plugins/apps/colors-to-tokens-plugin/src/app/components/svg.component.ts new file mode 100644 index 0000000000..f2750bea00 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/src/app/components/svg.component.ts @@ -0,0 +1,48 @@ +import { Component, input } from '@angular/core'; + +@Component({ + selector: 'app-svg', + template: ` + @switch (name()) { + @case ('tick') { + + + + + } + @case ('download') { + + + + } + @case ('reload') { + + + + } + } + `, + styleUrl: './svg.component.css', +}) +export class SvgComponent { + name = input.required<'tick' | 'download' | 'reload'>(); +} diff --git a/plugins/apps/colors-to-tokens-plugin/src/app/utils/__snapshots__/transform-to-token.spec.ts.snap b/plugins/apps/colors-to-tokens-plugin/src/app/utils/__snapshots__/transform-to-token.spec.ts.snap new file mode 100644 index 0000000000..a21c365980 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/src/app/utils/__snapshots__/transform-to-token.spec.ts.snap @@ -0,0 +1,498 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`transform colors to tokens 1`] = ` +{ + "colors": { + "blue": { + "050": { + "$type": "color", + "$value": "#ebf8ff", + }, + "100": { + "$type": "color", + "$value": "#bee3f8", + }, + "650": { + "$type": "color", + "$value": "#2a4365", + }, + "700": { + "$type": "color", + "$value": "#2c5282", + }, + "900": { + "$type": "color", + "$value": "#1a365d", + }, + }, + "gray": { + "100": { + "$type": "color", + "$value": "#edf2f7", + }, + "200": { + "$type": "color", + "$value": "#e2e8f0", + }, + "400": { + "$type": "color", + "$value": "#a0aec0", + }, + "600": { + "$type": "color", + "$value": "#4a5568", + }, + "700": { + "$type": "color", + "$value": "#2d3748", + }, + "800": { + "$type": "color", + "$value": "#1a202c", + }, + }, + "green": { + "050": { + "$type": "color", + "$value": "#f0fff4", + }, + "100": { + "$type": "color", + "$value": "#c6f6d5", + }, + "300": { + "$type": "color", + "$value": "#68d391", + }, + "500": { + "$type": "color", + "$value": "#38a169", + }, + "600": { + "$type": "color", + "$value": "#2f855a", + }, + "700": { + "$type": "color", + "$value": "#276749", + }, + "800": { + "$type": "color", + "$value": "#22543d", + }, + }, + "pink": { + "100": { + "$type": "color", + "$value": "#fed7e2", + }, + }, + "purple": { + "100": { + "$type": "color", + "$value": "#e9d8fd", + }, + "300": { + "$type": "color", + "$value": "#b794f4", + }, + "500": { + "$type": "color", + "$value": "#805ad5", + }, + }, + "red": { + "100": { + "$type": "color", + "$value": "#FED7D7", + }, + "300": { + "$type": "color", + "$value": "#FC8181", + }, + "500": { + "$type": "color", + "$value": "#e53e3e", + }, + "600": { + "$type": "color", + "$value": "#c53030", + }, + "800": { + "$type": "color", + "$value": "#822727", + }, + }, + "shadow": { + "dark": { + "$type": "color", + "$value": "rgba(0, 0, 0, 0.69803923)", + }, + "light": { + "$type": "color", + "$value": "rgba(0, 0, 0, 0.16078432)", + }, + "mid": { + "$type": "color", + "$value": "rgba(0, 0, 0, 0.6)", + }, + }, + "white": { + "$type": "color", + "$value": "#ffffff", + }, + "yellow": { + "050": { + "$type": "color", + "$value": "#fffff0", + }, + "100": { + "$type": "color", + "$value": "#fefcbf", + }, + "200": { + "$type": "color", + "$value": "#faf089", + }, + "700": { + "$type": "color", + "$value": "#975a16", + }, + "800": { + "$type": "color", + "$value": "#744210", + }, + }, + }, + "ui/darkmode": { + "dm": { + "background": { + "blue": { + "$type": "color", + "$value": "#1a365d", + }, + "green": { + "$type": "color", + "$value": "#1c4532", + }, + "yellow": { + "$type": "color", + "$value": "#5f370e", + }, + }, + "button": { + "blue": { + "$type": "color", + "$value": "#2b6cb0", + }, + "default": { + "$type": "color", + "$value": "#4a5568", + }, + "green": { + "$type": "color", + "$value": "#2f855a", + }, + "yellow": { + "$type": "color", + "$value": "#975a16", + }, + "yellow[DONTUSE]": { + "$type": "color", + "$value": "#fefcbf", + }, + }, + "card": { + "background": { + "$type": "color", + "$value": "#2d3748", + }, + }, + "chart": { + "accent": { + "$type": "color", + "$value": "#9f7aea", + "alt": { + "$type": "color", + "$value": "#ecc94b", + }, + }, + "background": { + "$type": "color", + "$value": "#4a5568", + }, + "green": { + "$type": "color", + "$value": "#38a169", + }, + "red": { + "$type": "color", + "$value": "#e53e3e", + }, + "yellow": { + "$type": "color", + "$value": "#ecc94b", + }, + }, + "dashboard": { + "background": { + "$type": "color", + "$value": "#1a202c", + }, + }, + "footer": { + "$type": "color", + "$value": "#1a202c", + }, + "icon": { + "default": { + "$type": "color", + "$value": "#e2e8f0", + }, + "secondary": { + "$type": "color", + "$value": "#718096", + }, + }, + "input": { + "$type": "color", + "$value": "#4a5568", + }, + "label": { + "$type": "color", + "$value": "#a0aec0", + }, + "sidebar": { + "$type": "color", + "$value": "#171923", + }, + "text": { + "blue": { + "$type": "color", + "$value": "#63b3ed", + }, + "default": { + "$type": "color", + "$value": "#a0aec0", + }, + "emphasis": { + "$type": "color", + "$value": "#edf2f7", + }, + "green": { + "default": { + "$type": "color", + "$value": "#68d391", + }, + "emphasis": { + "$type": "color", + "$value": "#9ae6b4", + }, + }, + "red": { + "default": { + "$type": "color", + "$value": "#f56565", + }, + "emphasis": { + "$type": "color", + "$value": "#FC8181", + }, + }, + "yellow": { + "$type": "color", + "$value": "#faf089", + }, + }, + }, + }, + "ui/lightmode": { + "lm": { + "axis": { + "line": { + "$type": "color", + "$value": "#a0aec0", + }, + }, + "background": { + "blue": { + "$type": "color", + "$value": "#ebf8ff", + }, + "green": { + "$type": "color", + "$value": "#f0fff4", + }, + "yellow": { + "$type": "color", + "$value": "#fffff0", + }, + }, + "bar": { + "line": { + "$type": "color", + "$value": "rgba(160, 174, 192, 0.4)", + }, + }, + "button": { + "$type": "color", + "$value": "#E2E8F0", + "active": { + "$type": "color", + "$value": "#a0aec0", + }, + "blue": { + "$type": "color", + "$value": "#bee3f8", + }, + "green": { + "$type": "color", + "$value": "#c6f6d5", + }, + "yellow": { + "$type": "color", + "$value": "#fefcbf", + }, + }, + "card": { + "background": { + "$type": "color", + "$value": "#ffffff", + }, + }, + "chart": { + "accent": { + "$type": "color", + "$value": "#b794f4", + "alt": { + "$type": "color", + "$value": "#faf089", + }, + }, + "background": { + "$type": "color", + "$value": "#E2E8F0", + }, + "green": { + "$type": "color", + "$value": "#68d391", + }, + "red": { + "$type": "color", + "$value": "#FC8181", + }, + "yellow": { + "$type": "color", + "$value": "#faf089", + }, + }, + "dashboard": { + "background": { + "$type": "color", + "$value": "#EDF2F7", + }, + }, + "footer": { + "$type": "color", + "$value": "#e2e8f0", + }, + "icon": { + "blue": { + "$type": "color", + "$value": "#2a4365", + }, + "blue1": { + "$type": "color", + "$value": "#bee3f8", + }, + "blue2": { + "$type": "color", + "$value": "#0000ff", + }, + "default": { + "$type": "color", + "$value": "#A0AEC0", + }, + "green": { + "$type": "color", + "$value": "#276749", + }, + "red": { + "$type": "color", + "$value": "#c53030", + }, + "secondary": { + "$type": "color", + "$value": "#e2e8f0", + }, + "yellow": { + "$type": "color", + "$value": "#744210", + }, + }, + "input": { + "$type": "color", + "$value": "#EDF2F7", + }, + "label": { + "$type": "color", + "$value": "#4a5568", + }, + "placeholder": { + "$type": "color", + "$value": "#718096", + }, + "shadow": { + "$type": "color", + "$value": "rgba(0, 0, 0, 0.2)", + }, + "sidebar": { + "$type": "color", + "$value": "#1a202c", + }, + "text": { + "blue": { + "$type": "color", + "$value": "#2a4365", + }, + "default": { + "$type": "color", + "$value": "#2d3748", + }, + "emphasis": { + "$type": "color", + "$value": "#000000", + }, + "green": { + "default": { + "$type": "color", + "$value": "#22543d", + }, + "emphasis": { + "$type": "color", + "$value": "#38a169", + }, + }, + "red": { + "default": { + "$type": "color", + "$value": "#822727", + }, + "emphasis": { + "$type": "color", + "$value": "#e53e3e", + }, + }, + "secondary": { + "$type": "color", + "$value": "#718096", + }, + "yellow": { + "$type": "color", + "$value": "#744210", + }, + }, + }, + }, +} +`; diff --git a/plugins/apps/colors-to-tokens-plugin/src/app/utils/transform-to-token.spec.ts b/plugins/apps/colors-to-tokens-plugin/src/app/utils/transform-to-token.spec.ts new file mode 100644 index 0000000000..876819da2c --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/src/app/utils/transform-to-token.spec.ts @@ -0,0 +1,654 @@ +import { expect, test } from 'vitest'; +import { transformToToken } from './transform-to-token'; + +const initColors = [ + { + name: 'dm chart yellow', + color: '#ecc94b', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'dm text blue', + color: '#63b3ed', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'green 700', + color: '#276749', + opacity: 1, + path: 'colors', + }, + { + name: 'dm text green emphasis', + color: '#9ae6b4', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'lm icon blue', + color: '#2a4365', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'lm card background', + color: '#ffffff', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'gray 600', + color: '#4a5568', + opacity: 1, + path: 'colors', + }, + { + name: 'yellow 200', + color: '#faf089', + opacity: 1, + path: 'colors', + }, + { + name: 'lm button', + color: '#E2E8F0', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'green 300', + color: '#68d391', + opacity: 1, + path: 'colors', + }, + { + name: 'dm chart red', + color: '#e53e3e', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'gray 400', + color: '#a0aec0', + opacity: 1, + path: 'colors', + }, + { + name: 'lm dashboard background', + color: '#EDF2F7', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'lm text yellow', + color: '#744210', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'pink 100', + color: '#fed7e2', + opacity: 1, + path: 'colors', + }, + { + name: 'lm text secondary', + color: '#718096', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'blue 900', + color: '#1a365d', + opacity: 1, + path: 'colors', + }, + { + name: 'green 800', + color: '#22543d', + opacity: 1, + path: 'colors', + }, + { + name: 'red 300', + color: '#FC8181', + opacity: 1, + path: 'colors', + }, + { + name: 'lm button yellow', + color: '#fefcbf', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'lm text red emphasis', + color: '#e53e3e', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'dm chart green', + color: '#38a169', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'lm placeholder', + color: '#718096', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'purple 500', + color: '#805ad5', + opacity: 1, + path: 'colors', + }, + { + name: 'lm chart yellow', + color: '#faf089', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'shadow light', + color: '#000000', + opacity: 0.16078432, + path: 'colors', + }, + { + name: 'dm footer', + color: '#1a202c', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'red 800', + color: '#822727', + opacity: 1, + path: 'colors', + }, + { + name: 'lm text blue', + color: '#2a4365', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'purple 300', + color: '#b794f4', + opacity: 1, + path: 'colors', + }, + { + name: 'purple 100', + color: '#e9d8fd', + opacity: 1, + path: 'colors', + }, + { + name: 'dm background blue', + color: '#1a365d', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'dm text red default', + color: '#f56565', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'gray 700', + color: '#2d3748', + opacity: 1, + path: 'colors', + }, + { + name: 'lm button blue', + color: '#bee3f8', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'dm icon default', + color: '#e2e8f0', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'green 600', + color: '#2f855a', + opacity: 1, + path: 'colors', + }, + { + name: 'yellow 100', + color: '#fefcbf', + opacity: 1, + path: 'colors', + }, + { + name: 'blue 100', + color: '#bee3f8', + opacity: 1, + path: 'colors', + }, + { + name: 'dm background yellow', + color: '#5f370e', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'blue 650', + color: '#2a4365', + opacity: 1, + path: 'colors', + }, + { + name: 'dm text green default', + color: '#68d391', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'lm bar line', + color: '#a0aec0', + opacity: 0.4, + path: 'ui / light mode', + }, + { + name: 'dm background green', + color: '#1c4532', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'dm button blue', + color: '#2b6cb0', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'gray 100', + color: '#edf2f7', + opacity: 1, + path: 'colors', + }, + { + name: 'dm button yellow', + color: '#975a16', + opacity: 1, + path: 'ui / dark mode', + }, + /* 3 different blue colors in the same path */ + { + name: 'lm icon blue', + color: '#bee3f8', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'lm icon blue', + color: '#0000ff', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'lm text default', + color: '#2d3748', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'lm icon red', + color: '#c53030', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'lm text green default', + color: '#22543d', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'lm icon green', + color: '#276749', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'shadow dark', + color: '#000000', + opacity: 0.69803923, + path: 'colors', + }, + { + name: 'lm chart background', + color: '#E2E8F0', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'yellow 050', + color: '#fffff0', + opacity: 1, + path: 'colors', + }, + { + name: 'green 100', + color: '#c6f6d5', + opacity: 1, + path: 'colors', + }, + { + name: 'lm sidebar', + color: '#1a202c', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'dm label', + color: '#a0aec0', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'green 050', + color: '#f0fff4', + opacity: 1, + path: 'colors', + }, + { + name: 'dm button green', + color: '#2f855a', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'lm label', + color: '#4a5568', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'lm button active', + color: '#a0aec0', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'dm icon secondary', + color: '#718096', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'dm chart background', + color: '#4a5568', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'lm axis line', + color: '#a0aec0', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'dm button yellow[DONTUSE]', + color: '#fefcbf', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'dm sidebar', + color: '#171923', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'dm text emphasis', + color: '#edf2f7', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'lm chart green', + color: '#68d391', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'lm background blue', + color: '#ebf8ff', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'red 100', + color: '#FED7D7', + opacity: 1, + path: 'colors', + }, + { + name: 'dm text default', + color: '#a0aec0', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'red 500', + color: '#e53e3e', + opacity: 1, + path: 'colors', + }, + { + name: 'yellow 800', + color: '#744210', + opacity: 1, + path: 'colors', + }, + { + name: 'blue 050', + color: '#ebf8ff', + opacity: 1, + path: 'colors', + }, + { + name: 'gray 800', + color: '#1a202c', + opacity: 1, + path: 'colors', + }, + { + name: 'lm background yellow', + color: '#fffff0', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'dm chart accent', + color: '#9f7aea', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'lm shadow', + color: '#000000', + opacity: 0.2, + path: 'ui / light mode', + }, + { + name: 'dm text red emphasis', + color: '#FC8181', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'dm input', + color: '#4a5568', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'dm chart accent alt', + color: '#ecc94b', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'lm button green', + color: '#c6f6d5', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'red 600', + color: '#c53030', + opacity: 1, + path: 'colors', + }, + { + name: 'lm icon secondary', + color: '#e2e8f0', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'dm text yellow', + color: '#faf089', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'green 500', + color: '#38a169', + opacity: 1, + path: 'colors', + }, + { + name: 'shadow mid', + color: '#000000', + opacity: 0.6, + path: 'colors', + }, + { + name: 'lm text green emphasis', + color: '#38a169', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'blue 700', + color: '#2c5282', + opacity: 1, + path: 'colors', + }, + { + name: 'lm text red default', + color: '#822727', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'lm footer', + color: '#e2e8f0', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'lm text emphasis', + color: '#000000', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'dm card background', + color: '#2d3748', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'lm chart accent', + color: '#b794f4', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'white', + color: '#ffffff', + opacity: 1, + path: 'colors', + }, + { + name: 'dm button default', + color: '#4a5568', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'lm input', + color: '#EDF2F7', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'lm chart accent alt', + color: '#faf089', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'gray 200', + color: '#e2e8f0', + opacity: 1, + path: 'colors', + }, + { + name: 'lm icon yellow', + color: '#744210', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'dm dashboard background', + color: '#1a202c', + opacity: 1, + path: 'ui / dark mode', + }, + { + name: 'lm icon default', + color: '#A0AEC0', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'yellow 700', + color: '#975a16', + opacity: 1, + path: 'colors', + }, + { + name: 'lm background green', + color: '#f0fff4', + opacity: 1, + path: 'ui / light mode', + }, + { + name: 'lm chart red', + color: '#FC8181', + opacity: 1, + path: 'ui / light mode', + }, +]; + +test('transform colors to tokens', () => { + const result = transformToToken(initColors); + + expect(result).toMatchSnapshot(); +}); diff --git a/plugins/apps/colors-to-tokens-plugin/src/app/utils/transform-to-token.ts b/plugins/apps/colors-to-tokens-plugin/src/app/utils/transform-to-token.ts new file mode 100644 index 0000000000..a75c68a1f7 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/src/app/utils/transform-to-token.ts @@ -0,0 +1,72 @@ +import { LibraryColor } from '@penpot/plugin-types'; +import { TokenStructure } from '../../model'; + +function transformToRgba({ + color, + opacity, +}: Required>) { + color = color.slice(1); + + const r = parseInt(color.substring(0, 2), 16); + const g = parseInt(color.substring(2, 4), 16); + const b = parseInt(color.substring(4, 6), 16); + + return `rgba(${r}, ${g}, ${b}, ${opacity})`; +} + +interface Color extends LibraryColor { + color: string; +} + +export function transformToToken(colors: LibraryColor[]) { + const result: TokenStructure = {}; + + colors + .filter((data): data is Color => !!data.color) + .forEach((data) => { + const currentOpacity = data.opacity ?? 1; + const value = + currentOpacity === 1 + ? data.color + : transformToRgba({ + opacity: currentOpacity, + color: data.color, + }); + + const names: string[] = data.name.replace(/[#{}$]/g, '').split(' '); + const key: string = + data.path.replace(' \\/ ', '/').replace(/ /g, '') || 'global'; + + if (!result[key]) { + result[key] = {}; + } + + const props = [key, ...names]; + let acc = result; + + props.forEach((prop, index) => { + if (!acc[prop]) { + acc[prop] = {}; + } + + if (index === props.length - 1) { + let propIndex = 1; + const initialProp = prop; + + while (acc[prop]?.$value) { + prop = `${initialProp}${propIndex}`; + propIndex++; + } + + acc[prop] = { + $value: value, + $type: 'color', + }; + } + + acc = acc[prop] as TokenStructure; + }); + }); + + return result; +} diff --git a/plugins/apps/colors-to-tokens-plugin/src/assets/icon.png b/plugins/apps/colors-to-tokens-plugin/src/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6c13d20ddf4f21d316214bb31bdee2b08bfe34ec GIT binary patch literal 4648 zcmV+@64&jCP)ZgXgFbngSdJ^%m!Ep$a#bVG7w zVRUJ4ZXi@?ZDjydb!8wjF(67|ZXhx+GBqGDI65&nIx;dKK}{e-MO3t;KvDnz5rIiW zK~#90?VV|S6ji#1pQ`S3(%Bc52n2)($c~8UfQWzuTv%kp1qD|GMIF6(UGB`iBjR|) zeF1kA92b<;i7bLZ06`oe$R8>*$LKKqf>gww1#CwP5_v1^|sq>!x zQ+3XJ-t(RliP#H;C_B!1nhv?S8}RSQdC{8z8PVKL`1j-do8Amqo5YGM8*y?iIFCS8 z5m@X<{r&>>R!w65_eN+%ckD)-{1(cx&b{t+BTjEXO1&kd=6|n*M)b-&MAoNJcF1>` z!X0p4baN2LmqN}e{{?GGq5K5ITxgo@{K8V!Z2XDns0jXWX;+e4C74#XnV2VftrM~D ztvVs~QhK1V=&mx9ovTq!Wg#4=kz5W$Z4G#px_=Uc%}Q@nmDA;B^24ulD$nujwfpZF z$&@?Nut(U8{iYCMj_AdE5Qjd7T30}i3CBJ>8+Rgdk3o4cvd4{V@d7^FD#>?Ui_*88 zBRIhOpMJ}-RonQ_2XExM;g<%~wooE#{Sf~M#IZ$nZ+L)$15kJn%b^Uc&TOp0^{e1U za1=Y$O*qPUV%B^nKKKd;vQ8SV-%O1A=~YFD%vo@9jdAPYGKx3M`15CR>$t(h#YXzP zzvt%@Oqep8nXfFQq|CqzVj{*wcOI=1+?5k_1C&U6&~*T`Z`+b3A3nwK!M!!hElS_Q zwG(IZ$)XLW*foL_aFnrN8{*(R(;DDC?nXY67tk~EtnW1M@7R5WS+9M`(G%MBwr|^# zzs|Uo%lmZ+$bPT{CVI(!#NIc+%z%v|P}XK6$%^hr{D}^rD1yb`Y~ihWEBtmRLkIQZ z>4$HkO>&~{HUxuy(Va&TyI%(3F})F<4TV@d`ukZuqSsSVS;gD)SMk}B3_M=n|FL0V zR_?rcC{rhm3b~7^PxQ(>#IEPT>kdgHJO?YVu4Pgj zGp3E@h7p$qY(p>pMfX%9c0LQ$4&P;h#Vb(0`vpnX*KHXQy`CR45A)pXUvWG;U$b1V zZXI~$@!RN{+SafwUucUiyolW|g7cW^h8yBpmxo2s_ay}*I)K-!@YO%QXU@kfD05c& zEGJ14H(q-Mk4+szLR@rEHqWV7OLX0Fl%NrKvx<>Vs84Vj60GR;l)K!_`Dg_Tzut^j zqrZ=iir~S!u4Cf(Ay_TJFG2Vg-SrD1^KY2ysWik}12s;B#|6R*dnKs!KSef6^m?*S z6*BXch5VR#ShJj2E~dKZ!h_iUKTuT|ROLQVYN5IqQCrU00Ttz>75S8Z*U@az>)Etz zKQGQ*$_YP%`qcw_@#I6}NomuF0~LheRG6>1|8HBP8wd>z3+cUT9k>%+XBUV0&AVSAaKFYAl5pe*7t%&bBYd7TqWFrM8rhsYLuucGb}iOX#M+I(`-m$d^FEI zej9h+I^1WO16e0I_KSLG+5Z};rxd~pLAHV2hN!GTa+E`5t$KNHbzMSH5XdPOgn^Z{ zGG`@gH~mDJvx2zTC=%kLX?H;qT`w{>ev-NOD6{7*W&fdU&2m5P%A!+;lEVenXL%YzLFn{SG>Nx@MFOw>*>F*@lRw`30*;c#Us#*uM6Ma! zhcP1uaPdX$3^yz1R1q(~yNq?4^>wwyDs2J3q6>uZ5$uYIsOxSjs*wuIq1uD+RMgEj zgGG{{RRrYf4<)bN_>-#O0H^bc`DD=sK3TMZ;e&hg=#(*ZY~NaU-Oln#-u&f0{Dd zZ~4D3&fuN-D{*SfP6I{rO&4X~gU&Hc#M+@_N60<_ZWC79TgOB9?nvDSA`iL=!hNsw z0}Q#M2QOG;&1m7-eDK*CemPah>_1N?EUd8%Yd7uY)%TW@b4q)BN=k^~p?j{UpvcKP z3s#PO@VZox{fDxdJ!dJIdyo3HId#%V?wgo~ z-EL#<$15A%7e0Q!Z_%CGKsK0()T$*|c0r8<#og=v$V$W1p4 zJm*?fbuB;aILM20m#WStckVgLf6xAu8Pmq`+WY@t#dkaW+8Ld88Go8GhUAv< zbm7|Lzd!dy@nNugzz)RL)(P(jhg#ni%Drbm`|AxF^i4!~7()m3V(6e=y!_5`=6|`a zQJGciGg-Ah({Eju_DEr3qwS7=+@-4bI&$#HySxHC|kW>vxRZtoZ`F8M}+il3* z9|(!y4SD>5adb^>%hS()63}xgZCdce^zjTG)XS81sEh8c0GpS9`ty3+B@kJyazldn z8i=idq6jDo2O%T183vsu1a8M5qth-UCfd$J|Mi~VvN6$ircEBjoi`6NwGHYcRry{F z2@X*1XAxTlT2(=3CsLe@)K@(|5lXHe*pnxwkJl`7`}iSz`^7V+3l3lvD%y(bAaWGt zVtwVp1X8=9h6l}HnLJ@AOIQBDk>lr120C>}X72M-Noi|rDNYaSZ@S0e+Ncl^uGY1v zl?6IHYRryFOuxJFI8snl8dAZ*hv*CQLpOC^k8naUgi=P+jv|l zE7x8a4;Iz#MHtp)Zm0AEJk-xsW!`hp(fyGmC$dCq-GFZ#-RTku76S?!izxYoJfTTMG>kyGrD(4 z38`K6H{EJ*Miv$cwL1HC3vldJV|Gkp`RZ*{*PQEdMMXx?zt2S>wW~fkvIpTq*ZTiT zwn%Lm6*-CC38^UP-&JQO9|qzGN#@wM0Y}Fh8s}FWLul zI858`ea?0iZ;4=L!sUV63y?J#yLjTc1&yvtlEjQ@<3es9v_!Y}KzMv7NNVATznn1< zDQvUp^MYy-JZm}1_R>jxT85#ak|{h{b&WBEmhxP^2mKR(4k#R)9tF^I~ySB z8pzwCJBbG%&l^d4L}&I!w<1BfK?!W{=_=VlhtefHFZJcFICDIR6FCJeTeXcZmTjWa zt?r^;JFFj5Zcj7Co*p#vUc#U@0&M<$>0i9Dq}w}l*!J7r`c9Iaj*^|@BCyP;T)Bq3 z`6qL8k8qDOl@aaQks4*!_3qavkRJObkG#TCPGskE_}FR9XZrO@<+-Qs2&j$0qM6|( z*?J)Gotlv4O<;Lc7jmrXGq|hdI8J)2s5P)Hva~{C&dFltoGeB{5G{jEl5luo|M13r zzg7aNFUF1>z~7#p6mZ*uMO*ZiqY$~ea8Y^jXA}a#yW&p_h zt!{xtxgU3aO~$T(1b^)QG2AO zNU>}a`eW3I)e+dL13O-CA>3SBPU{0 zO4%p0-$)q=yCb-Gw#{ZGJ~oOGSM_E5b$>8@Cq_e7uG>NSn#L2n1Roo{bbZ73C3I(2 z?SA76N`QpK5IKQ3VP&gQ=5uIm?TW(U32s%Xrp7}-Q5mr@ks%d)$L=Hi?^}yGbmWxk z{r-JBt6tY7dh75cx;P{b#|3{lLtiO|L^+I&N(oLHuf;~@hBlUM23f~X^YYuv*|OdD z>Q_v(-RHQWd$gL8Jb)+5enc^0<6C?6igLVX-unne##U<1>2;wXub_lC zK1}DEwL5&~o%$eY;cR7?8*I}1F`1Cz+=w%@(Pew7(<@L zOPSaBNu*{{T~o`ai!=D}^R=2MVgOt-xDPX?jnkEq7w}oT4_ z>!7>-fJK*prxN<{O!+Q6;pPcoE&pu}V38ooA`@l8(M^Gpv2`D>z5lh}gEUjxw&1ZT zV@SLDl7MX(I#oJ8ESiVIF64FZal_dfXCu|hSX|A!HGTh~Y+iV43A^@b=hw%_Me)F$ z*K*6)!G_QCGJKSGYD@~ZIm-E5E(*$j2e6cf2UkH5(%`)6tbd}*yE!F{TF@pu)!`g$|(ezKb4Qtchx zT{^X4#4 zdv9Ru$jgz9Zd}%Zso%8~i6@h<;@iTXNDnUui*`S6aoLd6cAA;Qfvl6ltOOJ|t-gh3NSR;OA4e?u^v30NJeTzlr=Fx+ge)si0 z&)W(GAsfNkMYZPHsMcgU4)cXK4|l`gp2@#=Rh6;t)IkoFS8>uCNvRarz;^Y(Ud*1m^w-&?nbUT&k)*heLMaXXUjk?f zPUjV~b;m(U%3O>|8$fG=hv0-7Ns8|%l#>4+qW@pv{NI>v27>&9f#)&8`9JL444fCe e88|O`Gw?5WV{W-`G;lls0000 + + + + colors-to-tokens-plugin + + + + + + + diff --git a/plugins/apps/colors-to-tokens-plugin/src/main.ts b/plugins/apps/colors-to-tokens-plugin/src/main.ts new file mode 100644 index 0000000000..8882c4517f --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/src/main.ts @@ -0,0 +1,7 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { AppComponent } from './app/app.component'; + +bootstrapApplication(AppComponent, appConfig).catch((err) => + console.error(err), +); diff --git a/plugins/apps/colors-to-tokens-plugin/src/model.ts b/plugins/apps/colors-to-tokens-plugin/src/model.ts new file mode 100644 index 0000000000..b4b44c5548 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/src/model.ts @@ -0,0 +1,53 @@ +import { LibraryColor } from '@penpot/plugin-types'; + +export interface Token { + $value: string; + $type: string; +} + +export interface TokenFileExtraData { + $themes: []; + $metadata: TokenFileMetada; +} + +export interface TokenFileMetada { + activeThemes: []; + tokenSetOrder: []; + activeSets: []; +} + +export type TokenStructure = { + [key: string]: Token | TokenStructure; +}; + +export interface GETColorsPluginUIEvent { + type: 'get-colors'; +} + +export interface ResetPluginUIEvent { + type: 'reset'; +} + +export interface ResizePluginUIEvent { + type: 'resize'; + height: number; + width: number; +} + +export type PluginUIEvent = + | GETColorsPluginUIEvent + | ResizePluginUIEvent + | ResetPluginUIEvent; + +export interface ThemePluginEvent { + type: 'theme'; + content: string; +} + +export interface SetColorsPluginEvent { + type: 'set-colors'; + colors: LibraryColor[] | null; + fileName: string; +} + +export type PluginMessageEvent = ThemePluginEvent | SetColorsPluginEvent; diff --git a/plugins/apps/colors-to-tokens-plugin/src/plugin.ts b/plugins/apps/colors-to-tokens-plugin/src/plugin.ts new file mode 100644 index 0000000000..eb54d03831 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/src/plugin.ts @@ -0,0 +1,50 @@ +import type { PluginMessageEvent, PluginUIEvent } from './model.js'; + +const defaultSize = { + width: 410, + height: 280, +}; + +penpot.ui.open('COLORS TO TOKENS', `?theme=${penpot.theme}`, { + width: defaultSize.width, + height: defaultSize.height, +}); + +penpot.on('themechange', (theme) => { + sendMessage({ type: 'theme', content: theme }); +}); + +penpot.ui.onMessage((message) => { + if (message.type === 'get-colors') { + const colors = penpot.library.local.colors.filter( + (color) => !color.gradient, + ); + + const fileName = penpot.currentFile?.name ?? 'Untitled'; + + sendMessage({ + type: 'set-colors', + colors, + fileName, + }); + } else if (message.type === 'resize') { + if ( + penpot.ui.size?.width === defaultSize.width && + penpot.ui.size?.height === defaultSize.height + ) { + resize(message.width, message.height); + } + } else if (message.type === 'reset') { + resize(defaultSize.width, defaultSize.height); + } +}); + +function resize(width: number, height: number) { + if ('resize' in penpot.ui) { + (penpot as any).ui.resize(width, height); + } +} + +function sendMessage(message: PluginMessageEvent) { + penpot.ui.sendMessage(message); +} diff --git a/plugins/apps/colors-to-tokens-plugin/src/styles.css b/plugins/apps/colors-to-tokens-plugin/src/styles.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugins/apps/colors-to-tokens-plugin/tsconfig.app.json b/plugins/apps/colors-to-tokens-plugin/tsconfig.app.json new file mode 100644 index 0000000000..fff4a41d44 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/tsconfig.app.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.d.ts"], + "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] +} diff --git a/plugins/apps/colors-to-tokens-plugin/tsconfig.editor.json b/plugins/apps/colors-to-tokens-plugin/tsconfig.editor.json new file mode 100644 index 0000000000..4ee6393404 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/tsconfig.editor.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*.ts"], + "compilerOptions": { + "types": [] + } +} diff --git a/plugins/apps/colors-to-tokens-plugin/tsconfig.json b/plugins/apps/colors-to-tokens-plugin/tsconfig.json new file mode 100644 index 0000000000..4c48587cfe --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "es2022", + "useDefineForClassFields": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.editor.json" + }, + { + "path": "./tsconfig.plugin.json" + } + ], + "extends": "../../tsconfig.base.json", + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/plugins/apps/colors-to-tokens-plugin/tsconfig.plugin.json b/plugins/apps/colors-to-tokens-plugin/tsconfig.plugin.json new file mode 100644 index 0000000000..961987f7a1 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/tsconfig.plugin.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": [] + }, + "files": ["src/plugin.ts"], + "include": ["../../libs/plugin-types/index.d.ts"] +} diff --git a/plugins/apps/colors-to-tokens-plugin/tsconfig.spec.json b/plugins/apps/colors-to-tokens-plugin/tsconfig.spec.json new file mode 100644 index 0000000000..3c002c215a --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/tsconfig.spec.json @@ -0,0 +1,26 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [ + "vitest/globals", + "vitest/importMeta", + "vite/client", + "node", + "vitest" + ] + }, + "include": [ + "vite.config.ts", + "vitest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx", + "src/**/*.d.ts" + ] +} diff --git a/plugins/apps/colors-to-tokens-plugin/vite.config.ts b/plugins/apps/colors-to-tokens-plugin/vite.config.ts new file mode 100644 index 0000000000..7bb188ef75 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/vite.config.ts @@ -0,0 +1,21 @@ +/// +import { defineConfig } from 'vite'; + +export default defineConfig({ + root: __dirname, + cacheDir: '../node_modules/.vite/colors-to-tokens-plugin', + test: { + watch: false, + globals: true, + cache: { + dir: '../node_modules/.vitest', + }, + environment: 'jsdom', + include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + reporters: ['default'], + coverage: { + reportsDirectory: '../coverage/colors-to-tokens-plugin', + provider: 'v8', + }, + }, +}); diff --git a/plugins/apps/contrast-plugin/eslint.config.js b/plugins/apps/contrast-plugin/eslint.config.js new file mode 100644 index 0000000000..7aa90c2ab0 --- /dev/null +++ b/plugins/apps/contrast-plugin/eslint.config.js @@ -0,0 +1,51 @@ +import baseConfig from '../../eslint.config.js'; +import { compat } from '../../eslint.base.config.js'; + +export default [ + ...baseConfig, + ...compat + .config({ + extends: [ + 'plugin:@nx/angular', + 'plugin:@angular-eslint/template/process-inline-templates', + ], + }) + .map((config) => ({ + ...config, + files: ['**/*.ts'], + rules: { + '@angular-eslint/directive-selector': [ + 'error', + { + type: 'attribute', + prefix: 'app', + style: 'camelCase', + }, + ], + '@angular-eslint/component-selector': [ + 'error', + { + type: 'element', + prefix: 'app', + style: 'kebab-case', + }, + ], + }, + })), + ...compat + .config({ extends: ['plugin:@nx/angular-template'] }) + .map((config) => ({ + ...config, + files: ['**/*.html'], + rules: {}, + })), + { ignores: ['**/assets/*.js'] }, + { + languageOptions: { + parserOptions: { + project: './tsconfig.*?.json', + tsconfigRootDir: import.meta.dirname, + }, + }, + }, +]; diff --git a/plugins/apps/contrast-plugin/project.json b/plugins/apps/contrast-plugin/project.json new file mode 100644 index 0000000000..6de0d44104 --- /dev/null +++ b/plugins/apps/contrast-plugin/project.json @@ -0,0 +1,79 @@ +{ + "name": "contrast-plugin", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "prefix": "app", + "sourceRoot": "apps/contrast-plugin/src", + "tags": ["type:plugin"], + "targets": { + "build": { + "executor": "@angular-devkit/build-angular:application", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/apps/contrast-plugin", + "index": "apps/contrast-plugin/src/index.html", + "browser": "apps/contrast-plugin/src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "apps/contrast-plugin/tsconfig.app.json", + "assets": [ + "apps/contrast-plugin/src/favicon.ico", + "apps/contrast-plugin/src/assets" + ], + "styles": [ + "libs/plugins-styles/src/lib/styles.css", + "apps/contrast-plugin/src/styles.css" + ], + "scripts": [], + "optimization": { + "scripts": true, + "styles": true, + "fonts": false + } + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production", + "dependsOn": ["buildPlugin"] + }, + "serve": { + "executor": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "contrast-plugin:build:production" + }, + "development": { + "buildTarget": "contrast-plugin:build:development", + "host": "0.0.0.0", + "port": 4302 + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "executor": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "contrast-plugin:build" + } + } + } +} diff --git a/plugins/apps/contrast-plugin/src/app/app.component.css b/plugins/apps/contrast-plugin/src/app/app.component.css new file mode 100644 index 0000000000..364f0add90 --- /dev/null +++ b/plugins/apps/contrast-plugin/src/app/app.component.css @@ -0,0 +1,97 @@ +.wrapper { + padding-block-start: var(--spacing-24); +} + +.bold { + font-weight: 600; +} + +.contrast-preview { + display: flex; + flex-direction: column; + gap: var(--spacing-8); + padding-block-end: var(--spacing-20); + border-block-end: 2px solid var(--background-quaternary); +} + +.color-box { + block-size: 66px; + border: 1px solid var(--db-quaternary); + border-radius: var(--spacing-8); + background: linear-gradient( + to right, + var(--color1) 0%, + var(--color1) 50%, + var(--color2) 50%, + var(--color2) 100% + ); +} + +.select-colors { + display: flex; + justify-content: space-between; +} + +.contrast-ratio { + padding-block: var(--spacing-24); + + span { + color: var(--foreground-primary); + font-weight: 600; + } +} + +.contrast-results { + display: flex; + flex-direction: column; + gap: var(--spacing-16); +} + +.contrast-result { + .title { + margin-block-end: var(--spacing-4); + } + .list { + display: flex; + gap: var(--spacing-8); + } +} + +.tag { + display: flex; + align-items: center; + justify-content: center; + inline-size: 42px; + block-size: 32px; + color: var(--app-white); + border: 1px solid transparent; + border-radius: var(--spacing-8); + + &.good { + background-color: var(--success-950); + border-color: var(--success-500); + } + + &.fail { + background-color: var(--error-950); + border-color: var(--error-700); + } +} + +:host[data-theme='light'] { + .tag { + color: var(--app-black); + &.good { + background-color: #a7e8d9; + } + + &.fail { + background-color: var(--error-200); + border-color: var(--error-500); + } + } + + .color-box { + border: 1px solid #d0d3d6; + } +} diff --git a/plugins/apps/contrast-plugin/src/app/app.component.ts b/plugins/apps/contrast-plugin/src/app/app.component.ts new file mode 100644 index 0000000000..b482460f78 --- /dev/null +++ b/plugins/apps/contrast-plugin/src/app/app.component.ts @@ -0,0 +1,236 @@ +import { + ChangeDetectionStrategy, + Component, + computed, + inject, +} from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { ActivatedRoute } from '@angular/router'; +import type { + PluginMessageEvent, + PluginUIEvent, + ThemePluginEvent, +} from '../model'; +import { filter, fromEvent, map, merge, take } from 'rxjs'; +import { CommonModule } from '@angular/common'; +import { Shape } from '@penpot/plugin-types'; + +@Component({ + imports: [CommonModule], + selector: 'app-root', + template: ` +
+ @if (selection().length === 0) { +

+ Select two filled shapes to calculate the color contrast between them. +

+ } @else if (selection().length === 1) { +

+ Select one more filled shape to calculate + the color contrast between the selected colors. +

+ } @else if (selection().length >= 2) { +
+

Selected colors:

+
+
    +
  • + {{ color1() }} +
  • +
  • {{ color2() }}
  • +
+
+

+ Contrast ratio: {{ result() }} : 1 +

+
+
+

Normal text:

+
    +
  • + AA +
  • +
  • + AAA +
  • +
+
+
+

+ Large text + (starting from 19px bold or 24px): +

+
    +
  • + AA +
  • +
  • + AAA +
  • +
+
+
+

+ Graphics + (such as form input borders): +

+
    +
  • + AA +
  • +
+
+
+ } +
+ `, + styleUrl: './app.component.css', + host: { + '[attr.data-theme]': 'theme()', + '[style.--color1]': 'color1()', + '[style.--color2]': 'color2()', + }, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AppComponent { + #route = inject(ActivatedRoute); + #messages$ = fromEvent>(window, 'message'); + + #initialTheme$ = this.#route.queryParamMap.pipe( + map((params) => params.get('theme')), + filter((theme) => !!theme), + take(1), + ); + + selection = toSignal( + this.#messages$.pipe( + filter( + (event) => + event.data.type === 'init' || event.data.type === 'selection', + ), + map((event) => { + if (event.data.type === 'init') { + return event.data.content.selection; + } else if (event.data.type === 'selection') { + return event.data.content; + } + + return []; + }), + map((shapes) => { + return shapes + .map((shape) => this.#getShapeColor(shape)) + .filter((color): color is string => !!color); + }), + ), + { + initialValue: [], + }, + ); + + theme = toSignal( + merge( + this.#initialTheme$, + this.#messages$.pipe( + map((event) => event.data), + filter((data): data is ThemePluginEvent => data.type === 'theme'), + map((data) => { + return data.content; + }), + ), + ), + ); + + color1 = computed(() => { + return this.selection().at(-2); + }); + + color2 = computed(() => { + return this.selection().at(-1); + }); + + result = computed(() => { + const color1 = this.color1(); + const color2 = this.color2(); + + if (!color1 || !color2) { + return 0; + } + + const lum1 = this.#getLuminosity(color1) + 0.05; + const lum2 = this.#getLuminosity(color2) + 0.05; + + const result = lum1 > lum2 ? lum1 / lum2 : lum2 / lum1; + + return Number(result.toFixed(2)); + }); + + contrastStandards = { + AA: { + normal: 4.5, + large: 3, + }, + AAA: { + normal: 7, + large: 4.5, + }, + graphics: 3, + } as const; + + constructor() { + this.#sendMessage({ type: 'ready' }); + } + + #getLuminosity(color: string) { + const rgb = this.#hexToRgb(color); + const a = rgb.map((v) => { + v /= 255; + return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); + }); + return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2]; + } + + #hexToRgb(hex: string) { + const r = parseInt(hex.slice(1, 3), 16); + const g = parseInt(hex.slice(3, 5), 16); + const b = parseInt(hex.slice(5, 7), 16); + return [r, g, b]; + } + + #getShapeColor(shape?: Shape): string | undefined { + const fills = shape?.fills; + if (fills && fills !== 'mixed') { + return fills?.[0]?.fillColor ?? shape?.strokes?.[0]?.strokeColor; + } + return undefined; + } + + #sendMessage(message: PluginUIEvent) { + parent.postMessage(message, '*'); + } +} diff --git a/plugins/apps/contrast-plugin/src/app/app.config.ts b/plugins/apps/contrast-plugin/src/app/app.config.ts new file mode 100644 index 0000000000..1b3e4af314 --- /dev/null +++ b/plugins/apps/contrast-plugin/src/app/app.config.ts @@ -0,0 +1,6 @@ +import { ApplicationConfig } from '@angular/core'; +import { provideRouter } from '@angular/router'; + +export const appConfig: ApplicationConfig = { + providers: [provideRouter([])], +}; diff --git a/plugins/apps/contrast-plugin/src/assets/icon.png b/plugins/apps/contrast-plugin/src/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1fdee0a9aa99811850c766609cabc150bfb40dcf GIT binary patch literal 2516 zcmZWrc{tST7yp_NV=0rRqLidAvNMgPkYP;7RwS~eL5+QeOEZ=bAzQX#G>9x&nvq@h zEoB*F2-!+qNyJ#LW!!K7{(jH%zVCU?^Ss+xKA&@9&CQGipeLaK00k$M<(Y6^?gt85D{LTkO59 zBpe)}XQU(l#^%X{4%7}TWh1seOlkSAXww-CmLxk-?{;?B+hMt|x4gFE%@EuFS9EU( zSUWl%Ar-~4w?@lsN~)@qoNaA0tBQ+b9=!4(F~-KWgv)b;g z0HD%nC3L!_rJWs`N~LlFNjW+4Nhs;|KbwBdv^WkOn`%IYNnR!D%A{K0a5w;n(r^3d zqo>EQvHjaM-&(f5W@jfj-~1wqNW9YXeYn7g6Y%u(Jd@g2{NidT{_xGC*D;SpL`3cl z=Ogvg&|Gjhd`PX_%*;$w0^t`q7XRxL&8X3>U$nfkvJ&gya4LsPwlFuRoY2C{KQMl$ zk^Yk(c;DY2i!Ou!jL}g&dC^HCdoL^SYR|J%$ENE2pWH#B3t?$#X`OV4Z70_|!fy1- zm(p!pD>Fi;PL+#ad31T}gYcJO&()9Fa0J}f-@k+E)*mp_5^7{=nKHXHR+&!mVnf}% zybKKtBCDF3a;BO?GSDcLljb=%WRwg7Sc0nzGOUFP;C}e*JXL`Wi z|Cr|;%wG(CD=RDO`Qyijm=z9X*xkLaeW@lcF7uKJhr^2!#< zw|7lmUU=Ld9*o{tj)YVFqJB z^X@hUCAY6wcZkS7xvoWD|z0Ax3l(v3eBf4-lVj2x+S=OYH*XehuC2}Y28D#sl$Di5)$b;P z2{YM5*cAn;0$1*Kuip0YQQ8GF{%u)VnK5Bq^bZ__goN4?#NiXxHa7lknC}DRWk_D( z(9~4?#?lxchf{kb@6Ww|*AaPTrKP=Ds+eNX8`<&k{L`DO&vYK0B`5UQC#4kNP~ni}hWZ)>&KV7Xx&I zg6f7dLC1f7M`*vLbkk?!Gmhi*kc#Ws@E;4PyQ;SKyH-VC(Eg4(N0@U*v~NCKLqkeU%^JlM zZY?`%h(zN4My|nT!Ay;)!4NSR%oT^sgoz2e2xjYp7%Ei-0)UW!tqQgN3=T6aSZr^R zKfE6l86dF~ph=vI$pHHL`r-|woCV5MKnnV*PO107;oOGx^3I<*6Gqkv(a26oX%E=+ zGMZh0golSebaJ9Z7kNk}qv{CT>)!{DYX>R4s4$71-rA@DfX&U#I{Y%p_E%{Pepn8pF$im zW;wkLjg3n^YNaZ2!cdr`r1$!4+v8taJpbNFzuH6~8>;R_*W5LL|fDx@r{f zHYt@TxWneaV5}{UyuvU0`ua9K9-8s_!T9TbU&?t+0EI@w0<6#8l1-}%Js=M99zAiQ zWaPyGQc7rPZmvxy?&(t)lgT8}%Z2v#_QvPuT|Ult#o>UY7cXv{y6n?heDTNPB5!pA z3am%QCrXUr*FZA8OxUR|dh;gPz|imql#j1OMDEr&Wy4%pLgHaInOx4x&;ONterI== zHat9R*ReLi-rwcg-CS0k*i=zb$ppPc6;rUM^JU$;$3*Rd#a=O2mwh+hR>j;_rVV@1ab;I{kiqqu*gdPHNRR_@i%3huC}DSIz@f9GVv8=1^ zykgB9_8PC!D;s3FlVnbxKK(i_?)r_P9|#WiO%_q^Ar`_ktOS@cPFNPy>3@~(0|5K^ WP}idw`BJb=1B{Vo1{L~F5&r@6(c1g~ literal 0 HcmV?d00001 diff --git a/plugins/apps/contrast-plugin/src/assets/manifest.json b/plugins/apps/contrast-plugin/src/assets/manifest.json new file mode 100644 index 0000000000..d5d68343cd --- /dev/null +++ b/plugins/apps/contrast-plugin/src/assets/manifest.json @@ -0,0 +1,7 @@ +{ + "name": "Contrast", + "description": "Measure contrast plugin", + "code": "/assets/plugin.js", + "icon": "/assets/icon.png", + "permissions": ["content:read"] +} diff --git a/plugins/apps/contrast-plugin/src/index.html b/plugins/apps/contrast-plugin/src/index.html new file mode 100644 index 0000000000..a51a16d0cd --- /dev/null +++ b/plugins/apps/contrast-plugin/src/index.html @@ -0,0 +1,12 @@ + + + + + contrast-plugin + + + + + + + diff --git a/plugins/apps/contrast-plugin/src/main.ts b/plugins/apps/contrast-plugin/src/main.ts new file mode 100644 index 0000000000..8882c4517f --- /dev/null +++ b/plugins/apps/contrast-plugin/src/main.ts @@ -0,0 +1,7 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { AppComponent } from './app/app.component'; + +bootstrapApplication(AppComponent, appConfig).catch((err) => + console.error(err), +); diff --git a/plugins/apps/contrast-plugin/src/model.ts b/plugins/apps/contrast-plugin/src/model.ts new file mode 100644 index 0000000000..37de33b748 --- /dev/null +++ b/plugins/apps/contrast-plugin/src/model.ts @@ -0,0 +1,29 @@ +import { Shape } from '@penpot/plugin-types'; + +export interface InitPluginUIEvent { + type: 'ready'; +} + +export type PluginUIEvent = InitPluginUIEvent; + +export interface InitPluginEvent { + type: 'init'; + content: { + theme: string; + selection: Shape[]; + }; +} +export interface SelectionPluginEvent { + type: 'selection'; + content: Shape[]; +} + +export interface ThemePluginEvent { + type: 'theme'; + content: string; +} + +export type PluginMessageEvent = + | InitPluginEvent + | SelectionPluginEvent + | ThemePluginEvent; diff --git a/plugins/apps/contrast-plugin/src/plugin.ts b/plugins/apps/contrast-plugin/src/plugin.ts new file mode 100644 index 0000000000..80e9a98d1d --- /dev/null +++ b/plugins/apps/contrast-plugin/src/plugin.ts @@ -0,0 +1,55 @@ +import type { PluginMessageEvent, PluginUIEvent } from './model.js'; + +penpot.ui.open('CONTRAST PLUGIN', `?theme=${penpot.theme}`, { + width: 285, + height: 525, +}); + +penpot.ui.onMessage((message) => { + if (message.type === 'ready') { + sendMessage({ + type: 'init', + content: { + theme: penpot.theme, + selection: penpot.selection, + }, + }); + + initEvents(); + } +}); + +penpot.on('selectionchange', () => { + const shapes = penpot.selection; + sendMessage({ type: 'selection', content: shapes }); + + initEvents(); +}); + +let listeners: symbol[] = []; + +function initEvents() { + listeners.forEach((listener) => { + penpot.off(listener); + }); + + listeners = penpot.selection.map((shape) => { + return penpot.on( + 'shapechange', + () => { + const shapes = penpot.selection; + sendMessage({ type: 'selection', content: shapes }); + }, + { shapeId: shape.id }, + ); + }); +} + +penpot.on('themechange', () => { + const theme = penpot.theme; + sendMessage({ type: 'theme', content: theme }); +}); + +function sendMessage(message: PluginMessageEvent) { + penpot.ui.sendMessage(message); +} diff --git a/plugins/apps/contrast-plugin/src/styles.css b/plugins/apps/contrast-plugin/src/styles.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugins/apps/contrast-plugin/tsconfig.app.json b/plugins/apps/contrast-plugin/tsconfig.app.json new file mode 100644 index 0000000000..936913d9af --- /dev/null +++ b/plugins/apps/contrast-plugin/tsconfig.app.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.d.ts"], + "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts"] +} diff --git a/plugins/apps/contrast-plugin/tsconfig.editor.json b/plugins/apps/contrast-plugin/tsconfig.editor.json new file mode 100644 index 0000000000..4ee6393404 --- /dev/null +++ b/plugins/apps/contrast-plugin/tsconfig.editor.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*.ts"], + "compilerOptions": { + "types": [] + } +} diff --git a/plugins/apps/contrast-plugin/tsconfig.json b/plugins/apps/contrast-plugin/tsconfig.json new file mode 100644 index 0000000000..4c48587cfe --- /dev/null +++ b/plugins/apps/contrast-plugin/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "es2022", + "useDefineForClassFields": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.editor.json" + }, + { + "path": "./tsconfig.plugin.json" + } + ], + "extends": "../../tsconfig.base.json", + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/plugins/apps/contrast-plugin/tsconfig.plugin.json b/plugins/apps/contrast-plugin/tsconfig.plugin.json new file mode 100644 index 0000000000..961987f7a1 --- /dev/null +++ b/plugins/apps/contrast-plugin/tsconfig.plugin.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": [] + }, + "files": ["src/plugin.ts"], + "include": ["../../libs/plugin-types/index.d.ts"] +} diff --git a/plugins/apps/contrast-plugin/vite.config.ts b/plugins/apps/contrast-plugin/vite.config.ts new file mode 100644 index 0000000000..c5ff14b94c --- /dev/null +++ b/plugins/apps/contrast-plugin/vite.config.ts @@ -0,0 +1,20 @@ +/// +import { defineConfig } from 'vite'; + +export default defineConfig({ + root: __dirname, + cacheDir: '../node_modules/.vite/contrast-plugin', + test: { + globals: true, + cache: { + dir: '../node_modules/.vitest', + }, + environment: 'jsdom', + include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + reporters: ['default'], + coverage: { + reportsDirectory: '../coverage/contrast-plugin', + provider: 'v8', + }, + }, +}); diff --git a/plugins/apps/create-palette-plugin/.babelrc b/plugins/apps/create-palette-plugin/.babelrc new file mode 100644 index 0000000000..f2f3806745 --- /dev/null +++ b/plugins/apps/create-palette-plugin/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@nx/js/babel"] +} diff --git a/plugins/apps/create-palette-plugin/.swcrc b/plugins/apps/create-palette-plugin/.swcrc new file mode 100644 index 0000000000..a2d5b04f47 --- /dev/null +++ b/plugins/apps/create-palette-plugin/.swcrc @@ -0,0 +1,8 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript" + }, + "target": "es2016" + } +} diff --git a/plugins/apps/create-palette-plugin/eslint.config.js b/plugins/apps/create-palette-plugin/eslint.config.js new file mode 100644 index 0000000000..c024963eb4 --- /dev/null +++ b/plugins/apps/create-palette-plugin/eslint.config.js @@ -0,0 +1,26 @@ +import baseConfig from '../../eslint.config.js'; + +export default [ + ...baseConfig, + { + languageOptions: { + parserOptions: { + project: './tsconfig.*?.json', + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], + rules: {}, + }, + { + files: ['**/*.ts', '**/*.tsx'], + rules: {}, + }, + { + files: ['**/*.js', '**/*.jsx'], + rules: {}, + }, + { ignores: ['vite.config.ts'] }, +]; diff --git a/plugins/apps/create-palette-plugin/index.html b/plugins/apps/create-palette-plugin/index.html new file mode 100644 index 0000000000..0cc4e38aa7 --- /dev/null +++ b/plugins/apps/create-palette-plugin/index.html @@ -0,0 +1,2 @@ + + diff --git a/plugins/apps/create-palette-plugin/project.json b/plugins/apps/create-palette-plugin/project.json new file mode 100644 index 0000000000..c91245bf40 --- /dev/null +++ b/plugins/apps/create-palette-plugin/project.json @@ -0,0 +1,8 @@ +{ + "name": "create-palette-plugin", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "sourceRoot": "apps/create-palette-plugin/src", + "tags": ["type:plugin"], + "targets": {} +} diff --git a/plugins/apps/create-palette-plugin/public/assets/icon.png b/plugins/apps/create-palette-plugin/public/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4f010b502f09ca1c2d663af93c67ce45d5182633 GIT binary patch literal 2171 zcmV->2!!{EP)Px-HAzH4RCt{2Tg`7&*A@SrbMKq+%y?om7~8Q^3?}4*#!3m1P+JKRsf!>rU9#z- zQj=91seeXQRqCpnC}EkZMCzuyO0CqCBAT>FsDU6L6zm3Y{Q>@(8P9w7-qXbxdp-oN*;mMZV)8tZt)G#-58mBLQ5aVI=GWmL|e*U9zkjP>>U!@fR5$Bw!D*|UZUg_M;A`s{|Sov>8ZMs#hBEE9Pd#(7&6-KqX`CC8ugGx1M5U$;adUV-)EpJ6LD?vxg{BKL& zEi4cupgxJfE-Y-?Q}w?=Yt#CSxBfRW2T&9}nGI*2u0svt4M22|gQ{!v0&Q+NkBkUq z{DYt<0*{Pr+PlJJP zrW!Pe%Y94iz;SOsy#b&I7&x0TKDwEgSaK&-Q^2`*-Z98#cQ(#u>$(l%hJWDfz#Cpc z*~33KAt@771G2BNWRG#WBLocoxE&}e7SVU+%#J(RcjkK%&RP=pJoys=v;*D-Mh4Q?p)hIM1zAUy!T$BCnh=uK=A^i zuYRrh(dW%ba2Cm-pBel7kAmtHx&;6mgHdu96i*vggDjcD?9>6z?qeg`G& zJSb{>T%i2gJy-7mt6wrD4@vr8cCP;=fy#FiM)v>!04!h^g}6vUxo~q?UM2vbfq`%m z5F7vqs36E3Wt(|}ETz4*T!y)PS-aU;MzWDZ zQ3M_xb^62!gETfM38JM-O09jV*sj%|k%G;PiYc8kHaot%Y*4De`e&k(o6@lwQ9+PD ztr9if!Wx`|y?$NUt5+3Fhi0NR)YOz!ue@TxEool4#hJyw=*_^l5!3&gOG>AVuzxxP zbpdk+oEAI)NSUzy52w*u@5^PR1`hznz<%+CLMs~-i_FqRl@>ez=(Ve?D>s8;@@Io9 zs0ZdDb`ezjr)(vrb4V^;j8cPtEXE+YbSY}&4$;!z6~_x+6*gM@RI_>HqY8uo5Z@Lh zUSrUP{;e$lWObEfanYNg$oxFX%F3p`Uc2UB0! zNOZLM#OT*wH(sYeYv|+0o7S;~W6t(<<_L|FlujF@PGZdx)HBsVhNZ&gQ~Co^-_plIz0NOQO*drW%Lj-{OQ)1~FM! zpya}Z2$hyEx49hjsZ$9L4RvONb`9CZKWVPqY2G-}h)bu9DSqdhV}o#jlmS-;Q3P;5 z#Jf|7K&n+prBWwD`MgjrhsL~5b=p-yW|c@1i0&81{pgkubw!2%00O`f!GYl*^(X$P zkBEqw2>_%XxVJG8Kve&yz7+urw@6n2xLIO1tu!_coNRc(`^51PXAq_MQ>_wDPe;@; z7K_%9iHSsVxy~sd2{P+9BW;%(kBR~qwZ6l~=#gDc0Snl#l$M9oxp+nbb<`y^(0&m> z^Ye=5=2XW!0wTDP5i3JOZN*aAWy-GKj40(^&gfwm_e~lJsO>>rK<1fKg9m_w;HFu( z9!g3Q@cew|;8Cv)JU6GPZFCl7YIk&6@BpCA9BVVTJ8Td&f}LTnl#w!#o8hghBm$b5 ziQqg=sB@sNzizro$;8u&UB#70aUoI-w?0Q&bLZ~4TbP<02JV?KLDZqLO0|(cX0*TU?Tye zE$Wx#{>%6(QXXO3nBS^)lFdpG2+Vbx4Y8aLyBk!6r_Tmy&aAJ-D;v2obvEX^zN&<2_72 xvIjt~9q6^}0nlp)dM$eZ^xA=5%QFwa{{gL)lgoyKnVkRt002ovPDHLkV1g829PI!A literal 0 HcmV?d00001 diff --git a/plugins/apps/create-palette-plugin/public/assets/manifest.json b/plugins/apps/create-palette-plugin/public/assets/manifest.json new file mode 100644 index 0000000000..2e9592ded5 --- /dev/null +++ b/plugins/apps/create-palette-plugin/public/assets/manifest.json @@ -0,0 +1,7 @@ +{ + "name": "Create Palette from library", + "description": "Create a board with all the colors in the local library", + "code": "/plugin.js", + "icon": "/assets/icon.png", + "permissions": ["content:read", "content:write", "library:read"] +} diff --git a/plugins/apps/create-palette-plugin/src/plugin.ts b/plugins/apps/create-palette-plugin/src/plugin.ts new file mode 100644 index 0000000000..bb219b96c3 --- /dev/null +++ b/plugins/apps/create-palette-plugin/src/plugin.ts @@ -0,0 +1,104 @@ +main(); + +function main() { + createPalette(); + penpot.closePlugin(); +} + +function createPalette() { + const colors = penpot.library.local.colors.sort((a, b) => + a.name.toLowerCase() > b.name.toLowerCase() + ? 1 + : a.name.toLowerCase() < b.name.toLowerCase() + ? -1 + : 0, + ); + + const cols = 4; + const rows = Math.ceil(colors.length / cols); + + const width = cols * 200 + Math.max(0, cols - 1) * 10 + 20; + const height = rows * 100 + Math.max(0, rows - 1) * 10 + 20; + + const board = penpot.createBoard(); + board.name = 'Palette'; + + const viewport = penpot.viewport; + board.x = viewport.center.x - width / 2; + board.y = viewport.center.y - height / 2; + + if (colors.length === 0) { + // NO colors return + return; + } + + board.resize(width, height); + board.borderRadius = 8; + + // create grid + const grid = board.addGridLayout(); + + for (let i = 0; i < rows; i++) { + grid.addRow('flex', 1); + } + + for (let i = 0; i < cols; i++) { + grid.addColumn('flex', 1); + } + + grid.alignItems = 'center'; + grid.justifyItems = 'start'; + grid.justifyContent = 'stretch'; + grid.alignContent = 'stretch'; + grid.rowGap = 10; + grid.columnGap = 10; + grid.verticalPadding = 10; + grid.horizontalPadding = 10; + + grid.horizontalSizing = 'auto'; + + // create text + for (let row = 0; row < rows; row++) { + for (let col = 0; col < cols; col++) { + const i = row * cols + col; + const color = colors[i]; + + if (i >= colors.length) { + return; + } + + const board = penpot.createBoard(); + grid.appendChild(board, row + 1, col + 1); + board.fills = [color.asFill()]; + board.strokes = [ + { strokeColor: '#000000', strokeOpacity: 0.3, strokeStyle: 'solid' }, + ]; + + if (board.layoutChild) { + board.layoutChild.horizontalSizing = 'fill'; + board.layoutChild.verticalSizing = 'fill'; + } + + const flex = board.addFlexLayout(); + flex.alignItems = 'center'; + flex.justifyContent = 'center'; + flex.verticalPadding = 8; + flex.horizontalPadding = 8; + + const text = penpot.createText(color.name); + text.fontWeight = 'bold'; + text.fontVariantId = 'bold'; + text.growType = 'auto-width'; + text.strokes = [ + { + strokeColor: '#FFFFFF', + strokeWidth: 1, + strokeAlignment: 'outer', + strokeOpacity: 0.5, + strokeStyle: 'solid', + }, + ]; + board.appendChild(text); + } + } +} diff --git a/plugins/apps/create-palette-plugin/tsconfig.app.json b/plugins/apps/create-palette-plugin/tsconfig.app.json new file mode 100644 index 0000000000..559b7d6a66 --- /dev/null +++ b/plugins/apps/create-palette-plugin/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": ["node"] + }, + "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts"], + "include": ["src/**/*.ts", "../../libs/plugin-types/index.d.ts"] +} diff --git a/plugins/apps/create-palette-plugin/tsconfig.json b/plugins/apps/create-palette-plugin/tsconfig.json new file mode 100644 index 0000000000..cee4bbab6f --- /dev/null +++ b/plugins/apps/create-palette-plugin/tsconfig.json @@ -0,0 +1,30 @@ +{ + "extends": "../../tsconfig.base.json", + "files": [], + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ESNext", "DOM"], + "moduleResolution": "Node", + "strict": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "skipLibCheck": true, + "types": ["vite/client"] + }, + "include": ["src"], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/plugins/apps/create-palette-plugin/tsconfig.spec.json b/plugins/apps/create-palette-plugin/tsconfig.spec.json new file mode 100644 index 0000000000..3c002c215a --- /dev/null +++ b/plugins/apps/create-palette-plugin/tsconfig.spec.json @@ -0,0 +1,26 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [ + "vitest/globals", + "vitest/importMeta", + "vite/client", + "node", + "vitest" + ] + }, + "include": [ + "vite.config.ts", + "vitest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx", + "src/**/*.d.ts" + ] +} diff --git a/plugins/apps/create-palette-plugin/vite.config.ts b/plugins/apps/create-palette-plugin/vite.config.ts new file mode 100644 index 0000000000..4a2baef1a0 --- /dev/null +++ b/plugins/apps/create-palette-plugin/vite.config.ts @@ -0,0 +1,58 @@ +/// +import { defineConfig } from 'vite'; + +import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'; + +export default defineConfig({ + root: __dirname, + cacheDir: '../../node_modules/.vite/apps/create-palette-plugin', + + server: { + port: 4305, + host: '0.0.0.0', + }, + + preview: { + port: 4305, + host: '0.0.0.0', + }, + + plugins: [nxViteTsPaths()], + + // Uncomment this if you are using workers. + // worker: { + // plugins: [ nxViteTsPaths() ], + // }, + + build: { + outDir: '../../dist/apps/create-palette-plugin', + reportCompressedSize: true, + commonjsOptions: { + transformMixedEsModules: true, + }, + rollupOptions: { + input: { + plugin: 'src/plugin.ts', + index: './index.html', + }, + output: { + entryFileNames: '[name].js', + }, + }, + }, + + test: { + globals: true, + cache: { + dir: '../../node_modules/.vitest', + }, + environment: 'jsdom', + include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + + reporters: ['default'], + coverage: { + reportsDirectory: '../../coverage/apps/create-palette-plugin', + provider: 'v8', + }, + }, +}); diff --git a/plugins/apps/e2e/eslint.config.js b/plugins/apps/e2e/eslint.config.js new file mode 100644 index 0000000000..6ad54283da --- /dev/null +++ b/plugins/apps/e2e/eslint.config.js @@ -0,0 +1,32 @@ +import baseConfig from '../../eslint.config.js'; +import typescriptEslintParser from '@typescript-eslint/parser'; +import globals from 'globals'; + +export default [ + ...baseConfig, + { + languageOptions: { + parser: typescriptEslintParser, + parserOptions: { project: './apps/e2e/tsconfig.json' }, + }, + }, + { + files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], + rules: {}, + languageOptions: { + globals: { + ...globals.browser, + ...globals.node, + }, + }, + }, + { + files: ['**/*.ts', '**/*.tsx'], + rules: {}, + }, + { + files: ['**/*.js', '**/*.jsx'], + rules: {}, + }, + { ignores: ['vite.config.ts'] }, +]; diff --git a/plugins/apps/e2e/project.json b/plugins/apps/e2e/project.json new file mode 100644 index 0000000000..30596a8c1d --- /dev/null +++ b/plugins/apps/e2e/project.json @@ -0,0 +1,8 @@ +{ + "name": "e2e", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "implicitDependencies": [], + "tags": ["type:e2e"], + "targets": {} +} diff --git a/plugins/apps/e2e/screenshots/.gitkeep b/plugins/apps/e2e/screenshots/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugins/apps/e2e/src/__snapshots__/plugins.spec.ts.snap b/plugins/apps/e2e/src/__snapshots__/plugins.spec.ts.snap new file mode 100644 index 0000000000..ca5f4161b6 --- /dev/null +++ b/plugins/apps/e2e/src/__snapshots__/plugins.spec.ts.snap @@ -0,0 +1,2421 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Plugins > comments 1`] = ` +[ + { + "fills": [ + { + "fillColor": "#FFFFFF", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 0.01, + "hideFillOnExport": false, + "id": "1", + "name": "Root Frame", + "parentId": "1", + "points": [ + { + "x": 0, + "y": 0, + }, + { + "x": 0.01, + "y": 0, + }, + { + "x": 0.01, + "y": 0.01, + }, + { + "x": 0, + "y": 0.01, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "selrect": { + "height": 0.01, + "width": 0.01, + "x": 0, + "x1": 0, + "x2": 0.01, + "y": 0, + "y1": 0, + "y2": 0.01, + }, + "shapes": [], + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "frame", + "width": 0.01, + "x": 0, + "y": 0, + }, +] +`; + +exports[`Plugins > component library 1`] = ` +[ + { + "fills": [ + { + "fillColor": "#FFFFFF", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 0.01, + "hideFillOnExport": false, + "id": "1", + "name": "Root Frame", + "parentId": "1", + "points": [ + { + "x": 0, + "y": 0, + }, + { + "x": 0.01, + "y": 0, + }, + { + "x": 0.01, + "y": 0.01, + }, + { + "x": 0, + "y": 0.01, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "selrect": { + "height": 0.01, + "width": 0.01, + "x": 0, + "x1": 0, + "x2": 0.01, + "y": 0, + "y1": 0, + "y2": 0.01, + }, + "shapes": [ + "2", + ], + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "frame", + "width": 0.01, + "x": 0, + "y": 0, + }, + { + "fills": [ + { + "fillColor": "#B1B2B5", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 100, + "id": "2", + "name": "Rectangle", + "parentId": "1", + "points": [ + { + "x": 684, + "y": 540, + }, + { + "x": 784, + "y": 540, + }, + { + "x": 784, + "y": 640, + }, + { + "x": 684, + "y": 640, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "rx": 0, + "ry": 0, + "selrect": { + "height": 100, + "width": 100, + "x": 684, + "x1": 684, + "x2": 784, + "y": 540, + "y1": 540, + "y2": 640, + }, + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "rect", + "width": 100, + "x": 684, + "y": 540, + }, +] +`; + +exports[`Plugins > create board - text - rectable 1`] = ` +[ + { + "fills": [ + { + "fillColor": "#FFFFFF", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 0.01, + "hideFillOnExport": false, + "id": "1", + "name": "Root Frame", + "parentId": "1", + "points": [ + { + "x": 0, + "y": 0, + }, + { + "x": 0.01, + "y": 0, + }, + { + "x": 0.01, + "y": 0.01, + }, + { + "x": 0, + "y": 0.01, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "selrect": { + "height": 0.01, + "width": 0.01, + "x": 0, + "x1": 0, + "x2": 0.01, + "y": 0, + "y1": 0, + "y2": 0.01, + }, + "shapes": [ + "2", + "4", + "5", + ], + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "frame", + "width": 0.01, + "x": 0, + "y": 0, + }, + { + "fills": [ + { + "fillColor": "#FFFFFF", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 300, + "hideFillOnExport": false, + "id": "2", + "name": "Board name", + "parentId": "1", + "points": [ + { + "x": 684, + "y": 540, + }, + { + "x": 984, + "y": 540, + }, + { + "x": 984, + "y": 840, + }, + { + "x": 684, + "y": 840, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "rx": 8, + "ry": 8, + "selrect": { + "height": 300, + "width": 300, + "x": 684, + "x1": 684, + "x2": 984, + "y": 540, + "y1": 540, + "y2": 840, + }, + "shapes": [ + "3", + ], + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "frame", + "width": 300, + "x": 684, + "y": 540, + }, + { + "constraintsH": "left", + "constraintsV": "top", + "content": { + "children": [ + { + "children": [ + { + "children": [ + { + "fills": [ + { + "fillColor": "#000000", + "fillOpacity": 1, + }, + ], + "fontFamily": "sourcesanspro", + "fontId": "sourcesanspro", + "fontSize": "14", + "fontStyle": "normal", + "fontVariantId": "regular", + "fontWeight": "400", + "letterSpacing": "0", + "lineHeight": "1.2", + "text": "Hello from board", + "textAlign": "left", + "textDecoration": "none", + "textTransform": "none", + "typographyRefFile": null, + "typographyRefId": null, + }, + ], + "fills": [ + { + "fillColor": "#000000", + "fillOpacity": 1, + }, + ], + "fontFamily": "sourcesanspro", + "fontId": "sourcesanspro", + "fontSize": "14", + "fontStyle": "normal", + "fontVariantId": "regular", + "fontWeight": "400", + "letterSpacing": "0", + "lineHeight": "1.2", + "textAlign": "left", + "textDecoration": "none", + "textTransform": "none", + "type": "paragraph", + "typographyRefFile": null, + "typographyRefId": null, + }, + ], + "type": "paragraph-set", + }, + ], + "type": "root", + }, + "flipX": null, + "flipY": null, + "frameId": "2", + "growType": "auto-width", + "height": 17, + "id": "3", + "name": "Text", + "parentId": "2", + "points": [ + { + "x": 10, + "y": 10, + }, + { + "x": 110, + "y": 10, + }, + { + "x": 110, + "y": 27, + }, + { + "x": 10, + "y": 27, + }, + ], + "positionData": [ + { + "direction": "ltr", + "fills": [ + { + "fillColor": "#000000", + "fillOpacity": 1, + }, + ], + "fontFamily": "sourcesanspro", + "fontSize": "14px", + "fontStyle": "normal", + "fontWeight": "400", + "height": 18, + "letterSpacing": "normal", + "text": "Hello from board", + "textDecoration": "none solid rgb(0, 0, 0)", + "textTransform": "none", + "width": 99.234375, + "x": 10, + "x1": 0, + "x2": 99.234375, + "y": 27, + "y1": -1, + "y2": 17, + }, + ], + "rotation": 0, + "selrect": { + "height": 17, + "width": 100, + "x": 10, + "x1": 10, + "x2": 110, + "y": 10, + "y1": 10, + "y2": 27, + }, + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "text", + "width": 100, + "x": 10, + "y": 10, + }, + { + "fills": [ + { + "fillColor": "#B1B2B5", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 200, + "id": "4", + "name": "Rectangle", + "parentId": "1", + "pluginData": { + "TEST": { + "customKey": "customValue", + }, + }, + "points": [ + { + "x": 684, + "y": 540, + }, + { + "x": 884, + "y": 540, + }, + { + "x": 884, + "y": 740, + }, + { + "x": 684, + "y": 740, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "rx": 0, + "ry": 0, + "selrect": { + "height": 200, + "width": 200, + "x": 684, + "x1": 684, + "x2": 884, + "y": 540, + "y1": 540, + "y2": 740, + }, + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "rect", + "width": 200, + "x": 684, + "y": 540, + }, + { + "content": { + "children": [ + { + "children": [ + { + "children": [ + { + "fills": [ + { + "fillColor": "#000000", + "fillOpacity": 1, + }, + ], + "fontFamily": "sourcesanspro", + "fontId": "sourcesanspro", + "fontSize": "14", + "fontStyle": "normal", + "fontVariantId": "regular", + "fontWeight": "400", + "letterSpacing": "0", + "lineHeight": "1.2", + "text": "Hello from plugin", + "textAlign": "left", + "textDecoration": "none", + "textTransform": "none", + "typographyRefFile": null, + "typographyRefId": null, + }, + ], + "fills": [ + { + "fillColor": "#000000", + "fillOpacity": 1, + }, + ], + "fontFamily": "sourcesanspro", + "fontId": "sourcesanspro", + "fontSize": "14", + "fontStyle": "normal", + "fontVariantId": "regular", + "fontWeight": "400", + "letterSpacing": "0", + "lineHeight": "1.2", + "textAlign": "left", + "textDecoration": "none", + "textTransform": "none", + "type": "paragraph", + "typographyRefFile": null, + "typographyRefId": null, + }, + ], + "type": "paragraph-set", + }, + ], + "type": "root", + }, + "flipX": null, + "flipY": null, + "frameId": "1", + "growType": "auto-width", + "height": 17, + "id": "5", + "name": "Text", + "parentId": "1", + "points": [ + { + "x": 684, + "y": 540, + }, + { + "x": 786, + "y": 540, + }, + { + "x": 786, + "y": 557, + }, + { + "x": 684, + "y": 557, + }, + ], + "positionData": [ + { + "direction": "ltr", + "fills": [ + { + "fillColor": "#000000", + "fillOpacity": 1, + }, + ], + "fontFamily": "sourcesanspro", + "fontSize": "14px", + "fontStyle": "normal", + "fontWeight": "400", + "height": 18, + "letterSpacing": "normal", + "text": "Hello from plugin", + "textDecoration": "none solid rgb(0, 0, 0)", + "textTransform": "none", + "width": 101.53125, + "x": 684, + "x1": 0, + "x2": 101.53125, + "y": 557, + "y1": -1, + "y2": 17, + }, + ], + "rotation": 0, + "selrect": { + "height": 17, + "width": 102, + "x": 684, + "x1": 684, + "x2": 786, + "y": 540, + "y1": 540, + "y2": 557, + }, + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "text", + "width": 102, + "x": 684, + "y": 540, + }, +] +`; + +exports[`Plugins > create flex layout 1`] = ` +[ + { + "fills": [ + { + "fillColor": "#FFFFFF", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 0.01, + "hideFillOnExport": false, + "id": "1", + "name": "Root Frame", + "parentId": "1", + "points": [ + { + "x": 0, + "y": 0, + }, + { + "x": 0.01, + "y": 0, + }, + { + "x": 0.01, + "y": 0.01, + }, + { + "x": 0, + "y": 0.01, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "selrect": { + "height": 0.01, + "width": 0.01, + "x": 0, + "x1": 0, + "x2": 0.01, + "y": 0, + "y1": 0, + "y2": 0.01, + }, + "shapes": [ + "2", + ], + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "frame", + "width": 0.01, + "x": 0, + "y": 0, + }, + { + "fills": [ + { + "fillColor": "#FFFFFF", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 110, + "hideFillOnExport": false, + "id": "2", + "layout": "flex", + "layoutAlignContent": "stretch", + "layoutAlignItems": "center", + "layoutFlexDir": "row", + "layoutGap": { + "columnGap": 0, + "rowGap": 0, + }, + "layoutGapType": "multiple", + "layoutGridDir": "column", + "layoutItemHSizing": "auto", + "layoutItemVSizing": "auto", + "layoutJustifyContent": "center", + "layoutPadding": { + "p1": 5, + "p2": 5, + "p3": 5, + "p4": 5, + }, + "layoutPaddingType": "simple", + "layoutWrapType": "nowrap", + "name": "Board", + "parentId": "1", + "points": [ + { + "x": 684, + "y": 540, + }, + { + "x": 894, + "y": 540, + }, + { + "x": 894, + "y": 650, + }, + { + "x": 684, + "y": 650, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "selrect": { + "height": 110, + "width": 210, + "x": 684, + "x1": 684, + "x2": 894, + "y": 540, + "y1": 540, + "y2": 650, + }, + "shapes": [ + "4", + "3", + ], + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "frame", + "width": 210, + "x": 684, + "y": 540, + }, + { + "constraintsH": "left", + "constraintsV": "top", + "fills": [ + { + "fillColor": "#B1B2B5", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "2", + "height": 100, + "id": "3", + "name": "Rectangle", + "parentId": "2", + "points": [ + { + "x": 689, + "y": 545, + }, + { + "x": 789, + "y": 545, + }, + { + "x": 789, + "y": 645, + }, + { + "x": 689, + "y": 645, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "rx": 0, + "ry": 0, + "selrect": { + "height": 100, + "width": 100, + "x": 689, + "x1": 689, + "x2": 789, + "y": 545, + "y1": 545, + "y2": 645, + }, + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "rect", + "width": 100, + "x": 689, + "y": 545, + }, + { + "constraintsH": "left", + "constraintsV": "top", + "fills": [ + { + "fillColor": "#B1B2B5", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "2", + "height": 100, + "id": "4", + "name": "Ellipse", + "parentId": "2", + "points": [ + { + "x": 789, + "y": 545, + }, + { + "x": 889, + "y": 545, + }, + { + "x": 889, + "y": 645, + }, + { + "x": 789, + "y": 645, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "selrect": { + "height": 100, + "width": 100, + "x": 789, + "x1": 789, + "x2": 889, + "y": 545, + "y1": 545, + "y2": 645, + }, + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "circle", + "width": 100, + "x": 789, + "y": 545, + }, +] +`; + +exports[`Plugins > create grid layout 1`] = ` +[ + { + "fills": [ + { + "fillColor": "#FFFFFF", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 0.01, + "hideFillOnExport": false, + "id": "1", + "name": "Root Frame", + "parentId": "1", + "points": [ + { + "x": 0, + "y": 0, + }, + { + "x": 0.01, + "y": 0, + }, + { + "x": 0.01, + "y": 0.01, + }, + { + "x": 0, + "y": 0.01, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "selrect": { + "height": 0.01, + "width": 0.01, + "x": 0, + "x1": 0, + "x2": 0.01, + "y": 0, + "y1": 0, + "y2": 0.01, + }, + "shapes": [ + "2", + ], + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "frame", + "width": 0.01, + "x": 0, + "y": 0, + }, + { + "fills": [ + { + "fillColor": "#FFFFFF", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 100, + "hideFillOnExport": false, + "id": "2", + "layout": "grid", + "layoutAlignContent": "stretch", + "layoutAlignItems": "center", + "layoutGap": { + "columnGap": 10, + "rowGap": 10, + }, + "layoutGapType": "multiple", + "layoutGridCells": [ + { + "alignSelf": "auto", + "column": 1, + "columnSpan": 1, + "id": "2", + "justifySelf": "auto", + "position": "auto", + "row": 1, + "rowSpan": 1, + "shapes": [], + }, + { + "alignSelf": "auto", + "column": 1, + "columnSpan": 1, + "id": "2", + "justifySelf": "auto", + "position": "auto", + "row": 2, + "rowSpan": 1, + "shapes": [], + }, + { + "alignSelf": "auto", + "column": 2, + "columnSpan": 1, + "id": "2", + "justifySelf": "auto", + "position": "auto", + "row": 1, + "rowSpan": 1, + "shapes": [], + }, + { + "alignSelf": "auto", + "column": 2, + "columnSpan": 1, + "id": "2", + "justifySelf": "auto", + "position": "auto", + "row": 2, + "rowSpan": 1, + "shapes": [], + }, + ], + "layoutGridColumns": [ + { + "type": "flex", + "value": 1, + }, + { + "type": "flex", + "value": 1, + }, + ], + "layoutGridDir": "row", + "layoutGridRows": [ + { + "type": "flex", + "value": 1, + }, + { + "type": "flex", + "value": 1, + }, + ], + "layoutJustifyContent": "space-between", + "layoutJustifyItems": "start", + "layoutPadding": { + "p1": 5, + "p2": 5, + "p3": 5, + "p4": 5, + }, + "layoutPaddingType": "simple", + "name": "Board", + "parentId": "1", + "points": [ + { + "x": 684, + "y": 540, + }, + { + "x": 784, + "y": 540, + }, + { + "x": 784, + "y": 640, + }, + { + "x": 684, + "y": 640, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "selrect": { + "height": 100, + "width": 100, + "x": 684, + "x1": 684, + "x2": 784, + "y": 540, + "y1": 540, + "y2": 640, + }, + "shapes": [], + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "frame", + "width": 100, + "x": 684, + "y": 540, + }, +] +`; + +exports[`Plugins > group and ungroup 1`] = ` +[ + { + "fills": [ + { + "fillColor": "#FFFFFF", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 0.01, + "hideFillOnExport": false, + "id": "1", + "name": "Root Frame", + "parentId": "1", + "points": [ + { + "x": 0, + "y": 0, + }, + { + "x": 0.01, + "y": 0, + }, + { + "x": 0.01, + "y": 0.01, + }, + { + "x": 0, + "y": 0.01, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "selrect": { + "height": 0.01, + "width": 0.01, + "x": 0, + "x1": 0, + "x2": 0.01, + "y": 0, + "y1": 0, + "y2": 0.01, + }, + "shapes": [ + "4", + ], + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "frame", + "width": 0.01, + "x": 0, + "y": 0, + }, + { + "fills": [ + { + "fillColor": "#B1B2B5", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 100, + "id": "2", + "name": "Rectangle", + "parentId": "4", + "points": [ + { + "x": 684, + "y": 540, + }, + { + "x": 784, + "y": 540, + }, + { + "x": 784, + "y": 640, + }, + { + "x": 684, + "y": 640, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "rx": 0, + "ry": 0, + "selrect": { + "height": 100, + "width": 100, + "x": 684, + "x1": 684, + "x2": 784, + "y": 540, + "y1": 540, + "y2": 640, + }, + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "rect", + "width": 100, + "x": 684, + "y": 540, + }, + { + "fills": [ + { + "fillColor": "#B1B2B5", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 100, + "id": "3", + "name": "Rectangle", + "parentId": "4", + "points": [ + { + "x": 784, + "y": 640, + }, + { + "x": 884, + "y": 640, + }, + { + "x": 884, + "y": 740, + }, + { + "x": 784, + "y": 740, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "rx": 0, + "ry": 0, + "selrect": { + "height": 100, + "width": 100, + "x": 784, + "x1": 784, + "x2": 884, + "y": 640, + "y1": 640, + "y2": 740, + }, + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "rect", + "width": 100, + "x": 784, + "y": 640, + }, + { + "fills": [], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 200, + "id": "4", + "index": 2, + "name": "Group", + "parentId": "1", + "points": [ + { + "x": 684, + "y": 540, + }, + { + "x": 884, + "y": 540, + }, + { + "x": 884, + "y": 740, + }, + { + "x": 684, + "y": 740, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "selrect": { + "height": 200, + "width": 200, + "x": 684, + "x1": 684, + "x2": 884, + "y": 540, + "y1": 540, + "y2": 740, + }, + "shapes": [ + "2", + "3", + ], + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "group", + "width": 200, + "x": 684, + "y": 540, + }, +] +`; + +exports[`Plugins > insert svg 1`] = ` +[ + { + "fills": [ + { + "fillColor": "#FFFFFF", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 0.01, + "hideFillOnExport": false, + "id": "1", + "name": "Root Frame", + "parentId": "1", + "points": [ + { + "x": 0, + "y": 0, + }, + { + "x": 0.01, + "y": 0, + }, + { + "x": 0.01, + "y": 0.01, + }, + { + "x": 0, + "y": 0.01, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "selrect": { + "height": 0.01, + "width": 0.01, + "x": 0, + "x1": 0, + "x2": 0.01, + "y": 0, + "y1": 0, + "y2": 0.01, + }, + "shapes": [ + "2", + ], + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "frame", + "width": 0.01, + "x": 0, + "y": 0, + }, + { + "fills": [], + "flipX": false, + "flipY": false, + "frameId": "1", + "height": 130, + "id": "2", + "name": "Test icon", + "parentId": "1", + "points": [ + { + "x": 684, + "y": 540, + }, + { + "x": 984, + "y": 540, + }, + { + "x": 984, + "y": 670, + }, + { + "x": 684, + "y": 670, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "selrect": { + "height": 130, + "width": 300, + "x": 684, + "x1": 684, + "x2": 984, + "y": 540, + "y1": 540, + "y2": 670, + }, + "shapes": [ + "3", + "4", + "5", + ], + "strokes": [], + "svgAttrs": { + "height": "130", + "width": "300", + }, + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "group", + "width": 300, + "x": 684, + "y": 540, + }, + { + "fills": [], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 130, + "hidden": true, + "id": "3", + "name": "base-background", + "parentId": "2", + "points": [ + { + "x": 684, + "y": 540, + }, + { + "x": 984, + "y": 540, + }, + { + "x": 984, + "y": 670, + }, + { + "x": 684, + "y": 670, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "rx": 0, + "ry": 0, + "selrect": { + "height": 130, + "width": 300, + "x": 684, + "x1": 684, + "x2": 984, + "y": 540, + "y1": 540, + "y2": 670, + }, + "strokes": [], + "svgAttrs": { + "fill": "none", + "id": "base-background", + }, + "svgDefs": {}, + "svgViewbox": { + "height": 130, + "width": 300, + "x": 0, + "x1": 0, + "x2": 300, + "y": 0, + "y1": 0, + "y2": 130, + }, + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "rect", + "width": 300, + "x": 684, + "y": 540, + }, + { + "fills": [ + { + "fillColor": "#0000ff", + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 100, + "id": "4", + "name": "svg-rect", + "parentId": "2", + "points": [ + { + "x": 694, + "y": 550, + }, + { + "x": 894, + "y": 550, + }, + { + "x": 894, + "y": 650, + }, + { + "x": 694, + "y": 650, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "rx": 20, + "ry": 20, + "selrect": { + "height": 100, + "width": 200, + "x": 694, + "x1": 694, + "x2": 894, + "y": 550, + "y1": 550, + "y2": 650, + }, + "strokes": [], + "svgAttrs": {}, + "svgDefs": {}, + "svgViewbox": { + "height": 100, + "width": 200, + "x": 10, + "x1": 10, + "x2": 210, + "y": 10, + "y1": 10, + "y2": 110, + }, + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "rect", + "width": 200, + "x": 694, + "y": 550, + }, + { + "content": "Sorry, your browser does not support inline SVG.", + "fills": [], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 130, + "id": "5", + "name": "svg-node", + "parentId": "2", + "points": [ + { + "x": 684, + "y": 540, + }, + { + "x": 984, + "y": 540, + }, + { + "x": 984, + "y": 670, + }, + { + "x": 684, + "y": 670, + }, + ], + "proportion": 2.3076923076923075, + "proportionLock": true, + "rotation": 0, + "selrect": { + "height": 130, + "width": 300, + "x": 684, + "x1": 684, + "x2": 984, + "y": 540, + "y1": 540, + "y2": 670, + }, + "strokes": [], + "svgAttrs": {}, + "svgDefs": {}, + "svgViewbox": { + "height": 130, + "width": 300, + "x": 0, + "x1": 0, + "x2": 300, + "y": 0, + "y1": 0, + "y2": 130, + }, + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "svg-raw", + "width": 300, + "x": 684, + "y": 540, + }, +] +`; + +exports[`Plugins > plugin data 1`] = ` +[ + { + "fills": [ + { + "fillColor": "#FFFFFF", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 0.01, + "hideFillOnExport": false, + "id": "1", + "name": "Root Frame", + "parentId": "1", + "points": [ + { + "x": 0, + "y": 0, + }, + { + "x": 0.01, + "y": 0, + }, + { + "x": 0.01, + "y": 0.01, + }, + { + "x": 0, + "y": 0.01, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "selrect": { + "height": 0.01, + "width": 0.01, + "x": 0, + "x1": 0, + "x2": 0.01, + "y": 0, + "y1": 0, + "y2": 0.01, + }, + "shapes": [ + "2", + ], + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "frame", + "width": 0.01, + "x": 0, + "y": 0, + }, + { + "fills": [ + { + "fillColor": "#B1B2B5", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 100, + "id": "2", + "name": "Rectangle", + "parentId": "1", + "pluginData": { + "TEST": { + "testData": "test", + }, + }, + "points": [ + { + "x": 0, + "y": 0, + }, + { + "x": 100, + "y": 0, + }, + { + "x": 100, + "y": 100, + }, + { + "x": 0, + "y": 100, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "rx": 0, + "ry": 0, + "selrect": { + "height": 100, + "width": 100, + "x": 0, + "x1": 0, + "x2": 100, + "y": 0, + "y1": 0, + "y2": 100, + }, + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "rect", + "width": 100, + "x": 0, + "y": 0, + }, +] +`; + +exports[`Plugins > ruler guides 1`] = ` +[ + { + "fills": [ + { + "fillColor": "#FFFFFF", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 0.01, + "hideFillOnExport": false, + "id": "1", + "name": "Root Frame", + "parentId": "1", + "points": [ + { + "x": 0, + "y": 0, + }, + { + "x": 0.01, + "y": 0, + }, + { + "x": 0.01, + "y": 0.01, + }, + { + "x": 0, + "y": 0.01, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "selrect": { + "height": 0.01, + "width": 0.01, + "x": 0, + "x1": 0, + "x2": 0.01, + "y": 0, + "y1": 0, + "y2": 0.01, + }, + "shapes": [], + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "frame", + "width": 0.01, + "x": 0, + "y": 0, + }, +] +`; + +exports[`Plugins > text and textrange 1`] = ` +[ + { + "fills": [ + { + "fillColor": "#FFFFFF", + "fillOpacity": 1, + }, + ], + "flipX": null, + "flipY": null, + "frameId": "1", + "height": 0.01, + "hideFillOnExport": false, + "id": "1", + "name": "Root Frame", + "parentId": "1", + "points": [ + { + "x": 0, + "y": 0, + }, + { + "x": 0.01, + "y": 0, + }, + { + "x": 0.01, + "y": 0.01, + }, + { + "x": 0, + "y": 0.01, + }, + ], + "proportion": 1, + "proportionLock": false, + "rotation": 0, + "selrect": { + "height": 0.01, + "width": 0.01, + "x": 0, + "x1": 0, + "x2": 0.01, + "y": 0, + "y1": 0, + "y2": 0.01, + }, + "shapes": [ + "2", + ], + "strokes": [], + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "frame", + "width": 0.01, + "x": 0, + "y": 0, + }, + { + "content": { + "children": [ + { + "children": [ + { + "children": [ + { + "fills": [ + { + "fillColor": "#ff6fe0", + "fillOpacity": 1, + }, + ], + "fontFamily": "Work Sans", + "fontId": "gfont-work-sans", + "fontSize": "40", + "fontStyle": "italic", + "fontVariantId": "500italic", + "fontWeight": "500", + "letterSpacing": "0", + "lineHeight": "1.2", + "text": "Hello", + "textAlign": "left", + "textDecoration": "underline", + "textTransform": "uppercase", + "typographyRefFile": null, + "typographyRefId": null, + }, + { + "fills": [ + { + "fillColor": "#000000", + "fillOpacity": 1, + }, + ], + "fontFamily": "Work Sans", + "fontId": "gfont-work-sans", + "fontSize": "20", + "fontStyle": "italic", + "fontVariantId": "500italic", + "fontWeight": "500", + "letterSpacing": "0", + "lineHeight": "1.2", + "text": " World!", + "textAlign": "left", + "textDecoration": "underline", + "textTransform": "uppercase", + "typographyRefFile": null, + "typographyRefId": null, + }, + ], + "fills": [ + { + "fillColor": "#000000", + "fillOpacity": 1, + }, + ], + "fontFamily": "Work Sans", + "fontId": "gfont-work-sans", + "fontSize": "20", + "fontStyle": "italic", + "fontVariantId": "500italic", + "fontWeight": "500", + "letterSpacing": "0", + "lineHeight": "1.2", + "textAlign": "left", + "textDecoration": "underline", + "textTransform": "uppercase", + "type": "paragraph", + "typographyRefFile": null, + "typographyRefId": null, + }, + ], + "type": "paragraph-set", + }, + ], + "type": "root", + }, + "flipX": null, + "flipY": null, + "frameId": "1", + "growType": "auto-width", + "height": 48, + "id": "2", + "name": "Text", + "parentId": "1", + "points": [ + { + "x": 684, + "y": 540, + }, + { + "x": 898, + "y": 540, + }, + { + "x": 898, + "y": 588, + }, + { + "x": 684, + "y": 588, + }, + ], + "positionData": [ + { + "direction": "ltr", + "fills": [ + { + "fillColor": "#ff6fe0", + "fillOpacity": 1, + }, + ], + "fontFamily": ""Work Sans"", + "fontSize": "40px", + "fontStyle": "italic", + "fontWeight": "500", + "height": 47, + "letterSpacing": "normal", + "text": "Hello", + "textDecoration": "underline solid rgb(255, 111, 224)", + "textTransform": "uppercase", + "width": 129.03125, + "x": 684, + "x1": 0, + "x2": 129.03125, + "y": 587, + "y1": 0, + "y2": 47, + }, + { + "direction": "ltr", + "fills": [ + { + "fillColor": "#000000", + "fillOpacity": 1, + }, + ], + "fontFamily": ""Work Sans"", + "fontSize": "20px", + "fontStyle": "italic", + "fontWeight": "500", + "height": 24, + "letterSpacing": "normal", + "text": " World!", + "textDecoration": "underline solid rgb(0, 0, 0)", + "textTransform": "uppercase", + "width": 84.375, + "x": 813.03125, + "x1": 129.03125, + "x2": 213.40625, + "y": 582, + "y1": 18, + "y2": 42, + }, + ], + "rotation": 0, + "selrect": { + "height": 48, + "width": 214, + "x": 684, + "x1": 684, + "x2": 898, + "y": 540, + "y1": 540, + "y2": 588, + }, + "transform": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "transformInverse": { + "a": 1, + "b": 0, + "c": 0, + "d": 1, + "e": 0, + "f": 0, + }, + "type": "text", + "width": 214, + "x": 684, + "y": 540, + }, +] +`; diff --git a/plugins/apps/e2e/src/models/file-rpc.model.ts b/plugins/apps/e2e/src/models/file-rpc.model.ts new file mode 100644 index 0000000000..b75a387a0a --- /dev/null +++ b/plugins/apps/e2e/src/models/file-rpc.model.ts @@ -0,0 +1,17 @@ +export interface FileRpc { + '~:name': string; + '~:revn': number; + '~:id': string; + '~:is-shared': boolean; + '~:version': number; + '~:project-id': string; + '~:data': { + '~:pages': string[]; + '~:objects': string[]; + '~:styles': string[]; + '~:components': string[]; + '~:styles-v2': string[]; + '~:components-v2': string[]; + '~:features': string[]; + }; +} diff --git a/plugins/apps/e2e/src/models/shape.model.ts b/plugins/apps/e2e/src/models/shape.model.ts new file mode 100644 index 0000000000..96b087a31a --- /dev/null +++ b/plugins/apps/e2e/src/models/shape.model.ts @@ -0,0 +1,7 @@ +export interface Shape { + id: string; + frameId?: string; + parentId?: string; + shapes?: string[]; + layoutGridCells?: Shape[]; +} diff --git a/plugins/apps/e2e/src/plugins.spec.ts b/plugins/apps/e2e/src/plugins.spec.ts new file mode 100644 index 0000000000..79ff7748b9 --- /dev/null +++ b/plugins/apps/e2e/src/plugins.spec.ts @@ -0,0 +1,92 @@ +import componentLibrary from './plugins/component-library'; +import testingPlugin from './plugins/create-board-text-rect'; +import flex from './plugins/create-flexlayout'; +import grid from './plugins/create-gridlayout'; +import rulerGuides from './plugins/create-ruler-guides'; +import createText from './plugins/create-text'; +import group from './plugins/group'; +import insertSvg from './plugins/insert-svg'; +import pluginData from './plugins/plugin-data'; +import comments from './plugins/create-comments'; +import { Agent } from './utils/agent'; + +describe('Plugins', () => { + it('create board - text - rectable', async () => { + const agent = await Agent(); + const result = await agent.runCode(testingPlugin.toString(), { + screenshot: 'create-board-text-rect', + }); + expect(result).toMatchSnapshot(); + }); + + it('create flex layout', async () => { + const agent = await Agent(); + const result = await agent.runCode(flex.toString(), { + screenshot: 'create-flexlayout', + }); + expect(result).toMatchSnapshot(); + }); + + it('create grid layout', async () => { + const agent = await Agent(); + const result = await agent.runCode(grid.toString(), { + screenshot: 'create-gridlayout', + }); + expect(result).toMatchSnapshot(); + }); + + it('group and ungroup', async () => { + const agent = await Agent(); + const result = await agent.runCode(group.toString(), { + screenshot: 'group-ungroup', + }); + expect(result).toMatchSnapshot(); + }); + + it('insert svg', async () => { + const agent = await Agent(); + const result = await agent.runCode(insertSvg.toString(), { + screenshot: 'insert-svg', + }); + expect(result).toMatchSnapshot(); + }); + + it('plugin data', async () => { + const agent = await Agent(); + const result = await agent.runCode(pluginData.toString()); + expect(result).toMatchSnapshot(); + }); + + it('component library', async () => { + const agent = await Agent(); + const result = await agent.runCode(componentLibrary.toString(), { + screenshot: 'component-library', + }); + expect(result).toMatchSnapshot(); + }); + + it('text and textrange', async () => { + const agent = await Agent(); + const result = await agent.runCode(createText.toString(), { + screenshot: 'create-text', + }); + expect(result).toMatchSnapshot(); + }); + + it('ruler guides', async () => { + const agent = await Agent(); + const result = await agent.runCode(rulerGuides.toString(), { + screenshot: 'create-ruler-guides', + }); + expect(result).toMatchSnapshot(); + }); + + it('comments', async () => { + const agent = await Agent(); + const result = await agent.runCode(comments.toString(), { + screenshot: 'create-comments', + avoidSavedStatus: true, + }); + expect(result).toMatchSnapshot(); + }); +}); diff --git a/plugins/apps/e2e/src/plugins/component-library.ts b/plugins/apps/e2e/src/plugins/component-library.ts new file mode 100644 index 0000000000..4e4037b999 --- /dev/null +++ b/plugins/apps/e2e/src/plugins/component-library.ts @@ -0,0 +1,10 @@ +export default function () { + const rectangle = penpot.createRectangle(); + rectangle.x = penpot.viewport.center.x; + rectangle.y = penpot.viewport.center.y; + + const shape = penpot.currentPage?.getShapeById(rectangle.id); + if (shape) { + penpot.library.local.createComponent([shape]); + } +} diff --git a/plugins/apps/e2e/src/plugins/create-board-text-rect.ts b/plugins/apps/e2e/src/plugins/create-board-text-rect.ts new file mode 100644 index 0000000000..62d34a7a70 --- /dev/null +++ b/plugins/apps/e2e/src/plugins/create-board-text-rect.ts @@ -0,0 +1,58 @@ +import type { Board, Rectangle, Text } from '@penpot/plugin-types'; + +export default function () { + function createText(text: string): Text | undefined { + const textNode = penpot.createText(text); + + if (!textNode) { + return; + } + + textNode.x = penpot.viewport.center.x; + textNode.y = penpot.viewport.center.y; + + return textNode; + } + + function createRectangle(): Rectangle { + const rectangle = penpot.createRectangle(); + + rectangle.setPluginData('customKey', 'customValue'); + + rectangle.x = penpot.viewport.center.x; + rectangle.y = penpot.viewport.center.y; + + rectangle.resize(200, 200); + + return rectangle; + } + + function createBoard(): Board { + const board = penpot.createBoard(); + + board.name = 'Board name'; + + board.x = penpot.viewport.center.x; + board.y = penpot.viewport.center.y; + + board.borderRadius = 8; + + board.resize(300, 300); + + const text = penpot.createText('Hello from board'); + + if (!text) { + throw new Error('Could not create text'); + } + + text.x = 10; + text.y = 10; + board.appendChild(text); + + return board; + } + + createBoard(); + createRectangle(); + createText('Hello from plugin'); +} diff --git a/plugins/apps/e2e/src/plugins/create-comments.ts b/plugins/apps/e2e/src/plugins/create-comments.ts new file mode 100644 index 0000000000..609b699448 --- /dev/null +++ b/plugins/apps/e2e/src/plugins/create-comments.ts @@ -0,0 +1,40 @@ +export default function () { + async function createComment() { + const page = penpot.currentPage; + + if (page) { + await page.addCommentThread('Hello world!', { + x: penpot.viewport.center.x, + y: penpot.viewport.center.y, + }); + } + } + + async function replyComment() { + const page = penpot.currentPage; + + if (page) { + const comments = await page.findCommentThreads({ + onlyYours: true, + showResolved: false, + }); + await comments[0].reply('This is a reply.'); + } + } + + async function deleteComment() { + const page = penpot.currentPage; + + if (page) { + const commentThreads = await page.findCommentThreads({ + onlyYours: true, + showResolved: false, + }); + await page.removeCommentThread(commentThreads[0]); + } + } + + createComment(); + replyComment(); + deleteComment(); +} diff --git a/plugins/apps/e2e/src/plugins/create-flexlayout.ts b/plugins/apps/e2e/src/plugins/create-flexlayout.ts new file mode 100644 index 0000000000..c24b48e791 --- /dev/null +++ b/plugins/apps/e2e/src/plugins/create-flexlayout.ts @@ -0,0 +1,26 @@ +export default function () { + function createFlexLayout(): void { + const board = penpot.createBoard(); + board.horizontalSizing = 'auto'; + board.verticalSizing = 'auto'; + + board.x = penpot.viewport.center.x; + board.y = penpot.viewport.center.y; + + const flex = board.addFlexLayout(); + + flex.dir = 'column'; + flex.wrap = 'wrap'; + flex.alignItems = 'center'; + flex.justifyContent = 'center'; + flex.verticalPadding = 5; + flex.horizontalPadding = 5; + flex.horizontalSizing = 'fill'; + flex.verticalSizing = 'fill'; + + board.appendChild(penpot.createRectangle()); + board.appendChild(penpot.createEllipse()); + } + + createFlexLayout(); +} diff --git a/plugins/apps/e2e/src/plugins/create-gridlayout.ts b/plugins/apps/e2e/src/plugins/create-gridlayout.ts new file mode 100644 index 0000000000..41205ee9d7 --- /dev/null +++ b/plugins/apps/e2e/src/plugins/create-gridlayout.ts @@ -0,0 +1,27 @@ +export default function () { + function createGridLayout(): void { + const board = penpot.createBoard(); + board.x = penpot.viewport.center.x; + board.y = penpot.viewport.center.y; + + const grid = board.addGridLayout(); + + grid.addRow('flex', 1); + grid.addRow('flex', 1); + grid.addColumn('flex', 1); + grid.addColumn('flex', 1); + + grid.alignItems = 'center'; + grid.justifyItems = 'start'; + grid.justifyContent = 'space-between'; + grid.alignContent = 'stretch'; + grid.rowGap = 10; + grid.columnGap = 10; + grid.verticalPadding = 5; + grid.horizontalPadding = 5; + grid.horizontalSizing = 'auto'; + grid.verticalSizing = 'auto'; + } + + createGridLayout(); +} diff --git a/plugins/apps/e2e/src/plugins/create-ruler-guides.ts b/plugins/apps/e2e/src/plugins/create-ruler-guides.ts new file mode 100644 index 0000000000..390e7d0374 --- /dev/null +++ b/plugins/apps/e2e/src/plugins/create-ruler-guides.ts @@ -0,0 +1,21 @@ +export default function () { + function createRulerGuides(): void { + const page = penpot.currentPage; + + if (page) { + page.addRulerGuide('horizontal', penpot.viewport.center.x); + page.addRulerGuide('vertical', penpot.viewport.center.y); + } + } + + function removeRulerGuides(): void { + const page = penpot.currentPage; + + if (page) { + page.removeRulerGuide(page.rulerGuides[0]); + } + } + + createRulerGuides(); + removeRulerGuides(); +} diff --git a/plugins/apps/e2e/src/plugins/create-text.ts b/plugins/apps/e2e/src/plugins/create-text.ts new file mode 100644 index 0000000000..ccd2069e30 --- /dev/null +++ b/plugins/apps/e2e/src/plugins/create-text.ts @@ -0,0 +1,23 @@ +export default function () { + function createText(): void { + const text = penpot.createText('Hello World!'); + + if (text) { + text.x = penpot.viewport.center.x; + text.y = penpot.viewport.center.y; + text.growType = 'auto-width'; + text.textTransform = 'uppercase'; + text.textDecoration = 'underline'; + text.fontId = 'gfont-work-sans'; + text.fontStyle = 'italic'; + text.fontSize = '20'; + text.fontWeight = '500'; + + const textRange = text.getRange(0, 5); + textRange.fontSize = '40'; + textRange.fills = [{ fillColor: '#ff6fe0', fillOpacity: 1 }]; + } + } + + createText(); +} diff --git a/plugins/apps/e2e/src/plugins/group.ts b/plugins/apps/e2e/src/plugins/group.ts new file mode 100644 index 0000000000..a8e189df5a --- /dev/null +++ b/plugins/apps/e2e/src/plugins/group.ts @@ -0,0 +1,29 @@ +export default function () { + function group() { + const selected = penpot.selection; + + if (selected.length && !penpot.utils.types.isGroup(selected[0])) { + return penpot.group(selected); + } + } + + function ungroup() { + const selected = penpot.selection; + + if (selected.length && penpot.utils.types.isGroup(selected[0])) { + return penpot.ungroup(selected[0]); + } + } + + const rectangle = penpot.createRectangle(); + rectangle.x = penpot.viewport.center.x; + rectangle.y = penpot.viewport.center.y; + const rectangle2 = penpot.createRectangle(); + rectangle2.x = penpot.viewport.center.x + 100; + rectangle2.y = penpot.viewport.center.y + 100; + + penpot.selection = [rectangle, rectangle2]; + + group(); + ungroup(); +} diff --git a/plugins/apps/e2e/src/plugins/insert-svg.ts b/plugins/apps/e2e/src/plugins/insert-svg.ts new file mode 100644 index 0000000000..442baea3ac --- /dev/null +++ b/plugins/apps/e2e/src/plugins/insert-svg.ts @@ -0,0 +1,21 @@ +export default function () { + function insertSvg(svg: string) { + const icon = penpot.createShapeFromSvg(svg); + + if (icon) { + icon.name = 'Test icon'; + icon.x = penpot.viewport.center.x; + icon.y = penpot.viewport.center.y; + } + + return icon; + } + + const svg = ` + + + Sorry, your browser does not support inline SVG. + `; + + insertSvg(svg); +} diff --git a/plugins/apps/e2e/src/plugins/plugin-data.ts b/plugins/apps/e2e/src/plugins/plugin-data.ts new file mode 100644 index 0000000000..67ce43424a --- /dev/null +++ b/plugins/apps/e2e/src/plugins/plugin-data.ts @@ -0,0 +1,6 @@ +export default function () { + const rectangle = penpot.createRectangle(); + + rectangle?.setPluginData('testData', 'test'); + return rectangle?.getPluginData('testData'); +} diff --git a/plugins/apps/e2e/src/utils/agent.ts b/plugins/apps/e2e/src/utils/agent.ts new file mode 100644 index 0000000000..f5775d75d4 --- /dev/null +++ b/plugins/apps/e2e/src/utils/agent.ts @@ -0,0 +1,167 @@ +import puppeteer from 'puppeteer'; +import { PenpotApi } from './api'; +import { getFileUrl } from './get-file-url'; +import { idObjectToArray } from './clean-id'; +import { Shape } from '../models/shape.model'; + +const screenshotsEnable = process.env['E2E_SCREENSHOTS'] === 'true'; + +function replaceIds(shapes: Shape[]) { + let id = 1; + + const getId = () => { + return String(id++); + }; + + function replaceChildrenId(id: string, newId: string) { + for (const node of shapes) { + if (node.parentId === id) { + node.parentId = newId; + } + + if (node.frameId === id) { + node.frameId = newId; + } + + if (node.shapes) { + node.shapes = node.shapes?.map((shapeId) => { + return shapeId === id ? newId : shapeId; + }); + } + + if (node.layoutGridCells) { + node.layoutGridCells = idObjectToArray(node.layoutGridCells, newId); + } + } + } + + for (const node of shapes) { + const previousId = node.id; + + node.id = getId(); + + replaceChildrenId(previousId, node.id); + } +} + +export async function Agent() { + console.log('Initializing Penpot API...'); + const penpotApi = await PenpotApi(); + + console.log('Creating file...'); + const file = await penpotApi.createFile(); + console.log('File created with id:', file['~:id']); + + const fileUrl = getFileUrl(file); + console.log('File URL:', fileUrl); + + console.log('Launching browser...'); + const browser = await puppeteer.launch({}); + const page = await browser.newPage(); + + await page.setViewport({ width: 1920, height: 1080 }); + + console.log('Setting authentication cookie...'); + page.setCookie({ + name: 'auth-token', + value: penpotApi.getAuth().split('=')[1], + domain: 'localhost', + path: '/', + expires: (Date.now() + 3600 * 1000) / 1000, + }); + + console.log('Navigating to file URL...'); + await page.goto(fileUrl); + await page.waitForSelector('[data-testid="viewport"]'); + console.log('Page loaded and viewport selector found.'); + + page + .on('console', async (message) => { + console.log(`${message.type()} ${message.text()}`); + }) + .on('pageerror', (message) => { + console.error('Page error:', message); + }); + + const finish = async () => { + console.log('Deleting file and closing browser...'); + await penpotApi.deleteFile(file['~:id']); + await browser.close(); + console.log('Clean up done.'); + }; + + return { + async runCode( + code: string, + options: { + screenshot?: string; + autoFinish?: boolean; + avoidSavedStatus?: boolean; + } = { + screenshot: '', + autoFinish: true, + avoidSavedStatus: false, + }, + ) { + const autoFinish = options.autoFinish ?? true; + + console.log('Running plugin code...'); + await page.evaluate((testingPlugin) => { + (globalThis as any).ɵloadPlugin({ + pluginId: 'TEST', + name: 'Test', + code: ` + (${testingPlugin})(); + `, + icon: '', + description: '', + permissions: ['content:read', 'content:write'], + }); + }, code); + + if (!options.avoidSavedStatus) { + console.log('Waiting for save status...'); + await page.waitForSelector( + '.main_ui_workspace_right_header__saved-status', + { + timeout: 10000, + }, + ); + console.log('Save status found.'); + } + + if (options.screenshot && screenshotsEnable) { + console.log('Taking screenshot:', options.screenshot); + await page.screenshot({ + path: 'screenshots/' + options.screenshot + '.png', + }); + } + + return new Promise((resolve) => { + page.once('console', async (msg) => { + const args = (await Promise.all( + msg.args().map((arg) => arg.jsonValue()), + )) as Record[]; + + const result = Object.values(args[1]) as Shape[]; + + replaceIds(result); + console.log('IDs replaced in result.'); + + resolve(result); + + if (autoFinish) { + console.log('Auto finish enabled. Cleaning up...'); + finish(); + } + }); + + console.log('Evaluating debug.dump_objects...'); + page.evaluate(` + debug.dump_objects(); + `); + }); + }, + finish, + }; +} diff --git a/plugins/apps/e2e/src/utils/api.ts b/plugins/apps/e2e/src/utils/api.ts new file mode 100644 index 0000000000..78355626db --- /dev/null +++ b/plugins/apps/e2e/src/utils/api.ts @@ -0,0 +1,85 @@ +import { FileRpc } from '../models/file-rpc.model'; + +const apiUrl = 'http://localhost:3449'; + +export async function PenpotApi() { + if (!process.env['E2E_LOGIN_EMAIL']) { + throw new Error('E2E_LOGIN_EMAIL not set'); + } + + const resultLoginRequest = await fetch( + `${apiUrl}/api/rpc/command/login-with-password`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/transit+json', + }, + body: JSON.stringify({ + '~:email': process.env['E2E_LOGIN_EMAIL'], + '~:password': process.env['E2E_LOGIN_PASSWORD'], + }), + }, + ); + + const loginData = await resultLoginRequest.json(); + const authToken = resultLoginRequest.headers + .get('set-cookie') + ?.split(';') + .at(0); + + if (!authToken) { + throw new Error('Login failed'); + } + + return { + getAuth: () => authToken, + createFile: async () => { + const createFileRequest = await fetch( + `${apiUrl}/api/rpc/command/create-file`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/transit+json', + cookie: authToken, + credentials: 'include', + }, + body: JSON.stringify({ + '~:name': `test file ${new Date().toISOString()}`, + '~:project-id': loginData['~:default-project-id'], + '~:features': { + '~#set': [ + 'fdata/objects-map', + 'fdata/pointer-map', + 'fdata/shape-data-type', + 'components/v2', + 'styles/v2', + 'layout/grid', + 'plugins/runtime', + ], + }, + }), + }, + ); + + return (await createFileRequest.json()) as FileRpc; + }, + deleteFile: async (fileId: string) => { + const deleteFileRequest = await fetch( + `${apiUrl}/api/rpc/command/delete-file`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/transit+json', + cookie: authToken, + credentials: 'include', + }, + body: JSON.stringify({ + '~:id': fileId, + }), + }, + ); + + return deleteFileRequest; + }, + }; +} diff --git a/plugins/apps/e2e/src/utils/clean-id.ts b/plugins/apps/e2e/src/utils/clean-id.ts new file mode 100644 index 0000000000..55da2ac449 --- /dev/null +++ b/plugins/apps/e2e/src/utils/clean-id.ts @@ -0,0 +1,14 @@ +import { Shape } from '../models/shape.model'; + +export function cleanId(id: string) { + return id.replace('~u', ''); +} + +export function idObjectToArray(obj: Shape[], newId: string) { + return Object.values(obj).map((item) => { + return { + ...item, + id: newId, + }; + }); +} diff --git a/plugins/apps/e2e/src/utils/get-file-url.ts b/plugins/apps/e2e/src/utils/get-file-url.ts new file mode 100644 index 0000000000..20b7e0fc94 --- /dev/null +++ b/plugins/apps/e2e/src/utils/get-file-url.ts @@ -0,0 +1,10 @@ +import { FileRpc } from '../models/file-rpc.model'; +import { cleanId } from './clean-id'; + +export function getFileUrl(file: FileRpc) { + const projectId = cleanId(file['~:project-id']); + const fileId = cleanId(file['~:id']); + const pageId = cleanId(file['~:data']['~:pages'][0]); + + return `http://localhost:3449/#/workspace/${projectId}/${fileId}?page-id=${pageId}`; +} diff --git a/plugins/apps/e2e/tsconfig.json b/plugins/apps/e2e/tsconfig.json new file mode 100644 index 0000000000..feebc73d76 --- /dev/null +++ b/plugins/apps/e2e/tsconfig.json @@ -0,0 +1,27 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "types": [ + "vitest/globals", + "vitest/importMeta", + "vite/client", + "node", + "vitest" + ] + }, + "include": [ + "vite.config.ts", + "vitest.config.ts", + "src/**/*.ts", + "../../libs/plugin-types/index.d.ts" + ] +} diff --git a/plugins/apps/e2e/vite.config.ts b/plugins/apps/e2e/vite.config.ts new file mode 100644 index 0000000000..4f2d855a66 --- /dev/null +++ b/plugins/apps/e2e/vite.config.ts @@ -0,0 +1,23 @@ +/// +import { defineConfig } from 'vite'; + +export default defineConfig({ + root: __dirname, + cacheDir: '../../node_modules/.vite/e2e', + test: { + testTimeout: 20000, + watch: false, + globals: true, + cache: { + dir: '../node_modules/.vitest', + }, + environment: 'happy-dom', + include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + reporters: ['default'], + coverage: { + reportsDirectory: '../coverage/e2e', + provider: 'v8', + }, + setupFiles: ['dotenv/config'], + }, +}); diff --git a/plugins/apps/example-styles/.babelrc b/plugins/apps/example-styles/.babelrc new file mode 100644 index 0000000000..f2f3806745 --- /dev/null +++ b/plugins/apps/example-styles/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@nx/js/babel"] +} diff --git a/plugins/apps/example-styles/.swcrc b/plugins/apps/example-styles/.swcrc new file mode 100644 index 0000000000..a2d5b04f47 --- /dev/null +++ b/plugins/apps/example-styles/.swcrc @@ -0,0 +1,8 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript" + }, + "target": "es2016" + } +} diff --git a/plugins/apps/example-styles/eslint.config.js b/plugins/apps/example-styles/eslint.config.js new file mode 100644 index 0000000000..551b7a7f3f --- /dev/null +++ b/plugins/apps/example-styles/eslint.config.js @@ -0,0 +1,32 @@ +import baseConfig from '../../eslint.config.js'; +import globals from 'globals'; + +export default [ + ...baseConfig, + { + languageOptions: { + parserOptions: { + project: './tsconfig.*?.json', + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], + rules: {}, + languageOptions: { + globals: { + ...globals.browser, + }, + }, + }, + { + files: ['**/*.ts', '**/*.tsx'], + rules: {}, + }, + { + files: ['**/*.js', '**/*.jsx'], + rules: {}, + }, + { ignores: ['vite.config.ts'] }, +]; diff --git a/plugins/apps/example-styles/index.html b/plugins/apps/example-styles/index.html new file mode 100644 index 0000000000..a4f05472e1 --- /dev/null +++ b/plugins/apps/example-styles/index.html @@ -0,0 +1,22 @@ + + + + + Penpot plugin styles + + + + + + + + + + + + + + diff --git a/plugins/apps/example-styles/project.json b/plugins/apps/example-styles/project.json new file mode 100644 index 0000000000..8a32c41845 --- /dev/null +++ b/plugins/apps/example-styles/project.json @@ -0,0 +1,8 @@ +{ + "name": "example-styles", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "sourceRoot": "apps/example-styles/src", + "tags": ["type:app"], + "targets": {} +} diff --git a/plugins/apps/example-styles/public/favicon.ico b/plugins/apps/example-styles/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d2222316ea0d038b553774e7da047f3b83e4f732 GIT binary patch literal 7662 zcmeI1ds|dT62{ptu+iu+mory}I|!npfEo}ZqTE!Ji-aIZh=^Q75F7+V?gKM`A}BDR z5x>)Zoc(q8Omi5;z-IT^f08uksp+n+e*3NJt~$qrgn#h==`#sDZ3+K!B_t#!BqXHs zcbdO;{zU&l|2b?n-3+^sdAb~S1h31%Q^{&bYihwMHQk2LbQ^YO)Pk69ZiZd-U_|LB zx&Pd<(pS&F@n|x&kM{9n9M)foNsn{SUxx5Y)H}kabe!%vlD`zlzY;&O-F+25wgcnG zAw$m04@S(*=@5}g5An=X$z}z!?2?-BBQ%|M<{~)lV!FBM9{8kR#Pb1`H83rp|8+d; z(KsRQd@&aVne6jmAx>HJNXtq;8Go5AoAmcZ zos32ZM45j4#Zw?L9O)^3uiIr-Rx+aqNgmheaQBz(rB9oou|N;HahgQ9yqEUp3pp2} z%*s&xb;DD1CVL#X!{;_`loc-rU-ms|%}P&Zr)GUL(Mj`r7N&>4Y=?KZ!=E-6VJRy; zg?_W9lG!6diqDXizp=C#o00(x5y&3N4*+UwZhYJbvG*5)k26w}?N+OvMMxm0BzfM3 zCU&=%)|MwfN0vTrEcSP|YaN8>Eo~#Pg=Hea9?R5bHRL!)^Ap{emtCha)7WWhvai4A z;l~dP?0tCP5x*evmxp5ohnAN=?sSYKNaoF3kdgi-EjZE)DEDvWjbsnCLXW-(XW z(SjMCa;4-)?3(lP{_V`-Y~bfB7j21&1AQGV8lE35x^Py{Vmat4ICuJwt?=gROj+rr z!t;5Hvm^Zc@OGyBTCpPY@cBzIsqDw$xmr@VwlakmmV;wA%Su@KmxkMSs>{uR&AzOb z#5*E;lH&Ja{P1}6PUS4&T+NT)>#VD-*myflNQCBI7M?$2 zR#vjl<07|rv^BDNXf|-+Tn_#A#KhlP8|YbEp1Sf=p|mLo$Fhnyk-uW`qe$TA*Da18 z&VuEHg^*ZXdc71JE539=Pk{vBHQuZ4>uP=4{cvvbIhbc&Jv)_|iVke}eV&cg89MJ& zUspZy`B(8sBi7R5qHCp>1QT)>fcd52*3$ea=ZHIJcYFEE&Js({PYvbeWT@5gX>j_* zmz|aNmU=k(ulOr^AIcN0knjXd`-6t<_Y1gVYkhuZVqoO?la+-rZiCNTq2Ynf^i)4Q zgJ))95Ih}i_i^aq@q8zq&3Ke6ZHd;Zn^!khX8|+&dPsUOk$C15_jR@HdFI3Q5qDH* zyk4?3ACn-Vj6k+dh6|xMH7K^qc*~ zO$!@1=-u)p%Uv!yPavVA`9T)Q9roVGtwa|=j_=;TnJz6UV(9Sop}wevAoD(Eseb_A zF|0O=#bLErPoBuj&E%GDe^Ad7pSQxCFMFbeDJrvo92u6Fo0jb35+GlYHQp?aL#eim zeJt~ne4*#+RKi~91iWrALwG}AX>nn9XUoJ$@7(0jo5iuMwK*~cv7vmy##a``3-a@b z3am+HOz%7LaFI_@MlFR>v!Y4IAw=)PSiM1y#=wr^n&0DkIn+g(koCjTZY0FP z*;<=@|7L16Jh2oU1>WaKnA_%Z(K*2nm2-UkEQspw7AY8(u$GsTNzFhfl^)L&?}3%M zAT!p`6qGt04R^mM7}^p zZ4=uaHq%p*p7p>IH&uvgEjK$I`wD+Dc<`^Br54o~qD;p46qL$(n9LPfpM~(q`dnjO zwcBYZZwl`?4NftD3GDD(fW*NTu!CjJsk9)fK{UCA2KzdsIF^t3w^P= zdQ(sUqUETJ;(z-Zl%S}Z@FbXaZuJ?&Va=l;D4cvfC8lOyNGA}aO< zihtQ7%nLj+Bd95ti}LT?spxEP;vhfk{jKjw8;QQDzPh^N=ho)CWCw_%xW#c|uG={| z)~{~qsqtq&{&0-WQ(0-V6QWWYf6;aPhvRA$`pwM@kA8(vAy@n;Sq(AjG7M@7)kxeb zUr;4B)!&N9dx=W2=)xKLDPpM)dE>xkD&9yjPy|0~ORqS3ahA@6V1PZSR;x((w&lW?4XG!yv!;r&}x z*K@No2w=;Jli(Tb`(56mFY@zF9SzTa`u!P5_v>poaX5|_ZR%SR@$1okuyG;WuD%YQ z^_8issx*>O1TfXuk!}PSviZEr{fe`HP~$>lNaQc^q#lb|a2hq0*IteEalW?JM4<>> zG~T$yn|>sOe7mZQS!z*jUjx$uL)`rQG@o}p8Yjg36|H}mi-I~$9IIphJm&Mdt8QF< z+|fK9=;fX#70UOcurBrE404oo3jmMaY@gp)F`IO}ZKl@7p^Ar!?R~@1fqZ3Wduvte>XEaui z$?tXY+pLcu@GJWjb{u zjFI`oO}&J`S5TfxRzq4-3t&dZzS3ka0*=!PN&v9v=WC=KO7$IRSqG99V3>{Y6SF*( htViPnc1@3tXXf%#*N0m9@b7~M{k!4c{r?{Z{tcl_yc_@k literal 0 HcmV?d00001 diff --git a/plugins/apps/example-styles/src/app/app.element.css b/plugins/apps/example-styles/src/app/app.element.css new file mode 100644 index 0000000000..d2eca5907f --- /dev/null +++ b/plugins/apps/example-styles/src/app/app.element.css @@ -0,0 +1,123 @@ +html, +body { + background: var(--app-black); + color: var(--app-white); + margin: 0 var(--spacing-20); +} + +app-root { + display: block; + padding-block: var(--spacing-16); +} + +section { + border-bottom: 1px solid var(--app-white); + padding-block: var(--spacing-32); + + &:last-child { + padding-block-end: 0; + border-bottom: 0; + } +} + +.theme-group { + border-radius: var(--spacing-20); + margin-block-end: var(--spacing-20); + padding: var(--spacing-32); + + &[data-theme='dark'] { + border: 1px solid var(--db-quaternary); + } + + &[data-theme='light'] { + border: 1px solid var(--lb-quaternary); + } +} + +.component-section { + margin-block-end: var(--spacing-40); + + &:last-child { + margin-block-end: 0; + } +} + +.title-margin { + margin-block-end: var(--spacing-16); +} + +/* COLOR */ +.color-section { + display: flex; + flex-wrap: wrap; + gap: calc(var(--spacing-40) * 2); + list-style: none; + width: 100%; +} + +.color { + align-items: center; + display: flex; + justify-content: space-between; + margin-block-end: var(--spacing-16); +} + +.color-preview { + block-size: var(--spacing-36); + border: 1px solid #8f9da3; + border-radius: var(--spacing-4); + display: block; + inline-size: var(--spacing-36); + margin-inline-start: var(--spacing-16); +} + +/* SPACING */ +.spacing-group { + display: grid; + margin-block-end: var(--spacing-16); + grid-template-columns: calc(var(--spacing-4) * 30) 1fr; +} + +.spacing-label { + margin-inline-end: var(--spacing-24); +} + +.spacing-preview { + background-color: var(--error-500); +} + +/* INPUT / BUTTONS */ +.inputs-list, +.button-list { + display: flex; + gap: var(--spacing-20); + + &:not(:last-child) { + margin-block-end: var(--spacing-20); + } +} + +/* ICON */ +.icons-section { + display: flex; + gap: var(--spacing-8); +} + +.select-section { + .form-group { + min-inline-size: 200px; + } +} + +/* SWITCH */ +.switch-list { + display: flex; + flex-direction: column; + gap: var(--spacing-8); + + li { + display: flex; + align-items: center; + gap: var(--spacing-12); + } +} diff --git a/plugins/apps/example-styles/src/app/app.element.html b/plugins/apps/example-styles/src/app/app.element.html new file mode 100644 index 0000000000..deedf54ff0 --- /dev/null +++ b/plugins/apps/example-styles/src/app/app.element.html @@ -0,0 +1,1353 @@ +

Plugin styles

+
+
+

Colors

+
    +
  • +

    Background

    +
      +
    • + --db-primary + +
    • +
    • + --db-secondary + +
    • +
    • + --db-tertiary + +
    • +
    • + --db-quaternary + +
    • +
    +
      +
    • + --lb-primary + +
    • +
    • + --lb-secondary + +
    • +
    • + --lb-tertiary + +
    • +
    • + --lb-quaternary + +
    • +
    +
  • +
  • +

    Foreground

    +
      +
    • + --df-primary + +
    • +
    • + --df-secondary + +
    • +
    +
      +
    • + --lf-primary + +
    • +
    • + --lf-secondary + +
    • +
    +
  • +
  • +

    Accent

    +
      +
    • + --da-primary + +
    • +
    • + --da-primary-muted + +
    • +
    • + --da-secondary + +
    • +
    • + --da-tertiary + +
    • +
    • + --da-quaternary + +
    • +
    +
      +
    • + --la-primary + +
    • +
    • + --la-primary-muted + +
    • +
    • + --la-secondary + +
    • +
    • + --la-tertiary + +
    • +
    • + --la-quaternary + +
    • +
    +
  • +
  • +

    Status color

    +
      +
    • + --success-50 + +
    • +
    • + --success-500 + +
    • +
    • + --success-950 + +
    • +
    • + --warning-50 + +
    • +
    • + --warning-500 + +
    • +
    • + --warning-950 + +
    • +
    • + --error-50 + +
    • +
    • + --error-500 + +
    • +
    • + --error-950 + +
    • +
    • + --info-50 + +
    • +
    • + --info-500 + +
    • +
    • + --info-950 + +
    • +
    +
  • +
  • +

    App color

    +
      +
    • + --app-white + +
    • +
    • + --app-black + +
    • +
    • + --app-pink + +
    • +
    • + --app-blue + +
    • +
    • + --app-gold + +
    • +
    • + --app-indigo + +
    • +
    • + --app-red + +
    • +
    • + --app-yellow + +
    • +
    • + --app-purple + +
    • +
    • + --app-lemon + +
    • +
    • + --app-orange + +
    • +
    +
  • +
+
+ +
+

Fonts

+

Display

+

Title L

+

Title M

+

Title S

+

Headline L

+

Headline M

+

Headline S

+

Body large

+

Body medium

+

Body small

+

Caption

+

Code font

+ + +
+ +
+

Spacing

+
    +
  • + --spacing-4 + +
  • +
  • + --spacing-8 + +
  • +
  • + --spacing-12 + +
  • +
  • + --spacing-16 + +
  • +
  • + --spacing-20 + +
  • +
  • + --spacing-24 + +
  • +
  • + --spacing-28 + +
  • +
  • + --spacing-32 + +
  • +
  • + --spacing-36 + +
  • +
  • + --spacing-40 + +
  • +
+
+ +
+

Select

+
+
+
+
+ + +
+ +
+ + +
+
+
+ + +
+
+
+
+
+ + +
+ +
+ + +
+
+
+ +
+
+ +
+

Input

+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+
+ +
+

Buttons

+

Primary button

+
+
+
    +
  • + +
  • +
  • + +
  • +
+
    +
  • + +
  • +
  • + +
  • +
+
+ + +
+ +
+
+
    +
  • + +
  • +
  • + +
  • +
+
    +
  • + +
  • +
  • + +
  • +
+
+ + +
+ +

Secondary button

+
+
+
    +
  • + +
  • +
  • + +
  • +
+
+ + +
+ +
+
+
    +
  • + +
  • +
  • + +
  • +
+
+ + +
+
+ +
+

Checkbox

+
+
+
+ + +
+
+ + +
+
+ +
+ +
+
+
+ + +
+ +
+ + +
+
+ +
+

Radio button

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+

Switch

+
+
+
    +
  • + +
  • + +
  • + + +
  • + +
  • + + +
  • +
+
+ + +
+ +
+
+
    +
  • + +
  • + +
  • + + +
  • + +
  • + + +
  • +
+
+ + +
+
+
diff --git a/plugins/apps/example-styles/src/app/app.element.ts b/plugins/apps/example-styles/src/app/app.element.ts new file mode 100644 index 0000000000..58aa278845 --- /dev/null +++ b/plugins/apps/example-styles/src/app/app.element.ts @@ -0,0 +1,36 @@ +import html from './app.element.html?raw'; +import 'plugins-styles/lib/styles.css'; +import './app.element.css'; + +export class AppElement extends HTMLElement { + public static observedAttributes = []; + + connectedCallback() { + this.innerHTML = html; + + Array.from(this.querySelectorAll('template')).forEach((el: HTMLElement) => { + const pre = document.createElement('pre'); + const code = document.createElement('code'); + code.classList.add('language-html'); + const removeLineIndentation = el.innerHTML.replaceAll( + this.getIndentationSize(el.innerHTML), + '', + ); + + code.textContent = removeLineIndentation; + + pre.appendChild(code); + + el.parentNode?.appendChild(pre); + el.remove(); + }); + + (window as any).hljs.highlightAll(); + } + + getIndentationSize(str: string) { + const size = str.length - str.trimStart().length; + return ' '.repeat(size - 1); + } +} +customElements.define('app-root', AppElement); diff --git a/plugins/apps/example-styles/src/assets/.gitkeep b/plugins/apps/example-styles/src/assets/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugins/apps/example-styles/src/main.ts b/plugins/apps/example-styles/src/main.ts new file mode 100644 index 0000000000..fdb879ded5 --- /dev/null +++ b/plugins/apps/example-styles/src/main.ts @@ -0,0 +1 @@ +import './app/app.element'; diff --git a/plugins/apps/example-styles/src/styles.css b/plugins/apps/example-styles/src/styles.css new file mode 100644 index 0000000000..90d4ee0072 --- /dev/null +++ b/plugins/apps/example-styles/src/styles.css @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/plugins/apps/example-styles/tsconfig.app.json b/plugins/apps/example-styles/tsconfig.app.json new file mode 100644 index 0000000000..21a818da45 --- /dev/null +++ b/plugins/apps/example-styles/tsconfig.app.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../dist/out-tsc", + "module": "ESNext", + "moduleResolution": "Bundler", + "declaration": true, + "types": ["node", "vite/client"] + }, + "include": ["src/**/*.ts"], + "exclude": ["vite.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/plugins/apps/example-styles/tsconfig.json b/plugins/apps/example-styles/tsconfig.json new file mode 100644 index 0000000000..f956823746 --- /dev/null +++ b/plugins/apps/example-styles/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "ESNext", + "lib": ["ESNext", "DOM"], + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/plugins/apps/example-styles/tsconfig.spec.json b/plugins/apps/example-styles/tsconfig.spec.json new file mode 100644 index 0000000000..3c002c215a --- /dev/null +++ b/plugins/apps/example-styles/tsconfig.spec.json @@ -0,0 +1,26 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [ + "vitest/globals", + "vitest/importMeta", + "vite/client", + "node", + "vitest" + ] + }, + "include": [ + "vite.config.ts", + "vitest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx", + "src/**/*.d.ts" + ] +} diff --git a/plugins/apps/example-styles/vite.config.ts b/plugins/apps/example-styles/vite.config.ts new file mode 100644 index 0000000000..79b201e514 --- /dev/null +++ b/plugins/apps/example-styles/vite.config.ts @@ -0,0 +1,49 @@ +/// +import { defineConfig } from 'vite'; + +import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'; + +export default defineConfig({ + root: __dirname, + cacheDir: '../../node_modules/.vite/apps/example-styles', + + server: { + port: 4201, + host: '0.0.0.0', + }, + + preview: { + port: 4201, + host: '0.0.0.0', + }, + + plugins: [nxViteTsPaths()], + + // Uncomment this if you are using workers. + // worker: { + // plugins: [ nxViteTsPaths() ], + // }, + + build: { + outDir: '../../dist/apps/example-styles', + reportCompressedSize: true, + commonjsOptions: { + transformMixedEsModules: true, + }, + }, + + test: { + globals: true, + cache: { + dir: '../../node_modules/.vitest', + }, + environment: 'jsdom', + include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + + reporters: ['default'], + coverage: { + reportsDirectory: '../../coverage/apps/example-styles', + provider: 'v8', + }, + }, +}); diff --git a/plugins/apps/icons-plugin/eslint.config.js b/plugins/apps/icons-plugin/eslint.config.js new file mode 100644 index 0000000000..7aa90c2ab0 --- /dev/null +++ b/plugins/apps/icons-plugin/eslint.config.js @@ -0,0 +1,51 @@ +import baseConfig from '../../eslint.config.js'; +import { compat } from '../../eslint.base.config.js'; + +export default [ + ...baseConfig, + ...compat + .config({ + extends: [ + 'plugin:@nx/angular', + 'plugin:@angular-eslint/template/process-inline-templates', + ], + }) + .map((config) => ({ + ...config, + files: ['**/*.ts'], + rules: { + '@angular-eslint/directive-selector': [ + 'error', + { + type: 'attribute', + prefix: 'app', + style: 'camelCase', + }, + ], + '@angular-eslint/component-selector': [ + 'error', + { + type: 'element', + prefix: 'app', + style: 'kebab-case', + }, + ], + }, + })), + ...compat + .config({ extends: ['plugin:@nx/angular-template'] }) + .map((config) => ({ + ...config, + files: ['**/*.html'], + rules: {}, + })), + { ignores: ['**/assets/*.js'] }, + { + languageOptions: { + parserOptions: { + project: './tsconfig.*?.json', + tsconfigRootDir: import.meta.dirname, + }, + }, + }, +]; diff --git a/plugins/apps/icons-plugin/project.json b/plugins/apps/icons-plugin/project.json new file mode 100644 index 0000000000..6540a148e1 --- /dev/null +++ b/plugins/apps/icons-plugin/project.json @@ -0,0 +1,79 @@ +{ + "name": "icons-plugin", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "prefix": "app", + "sourceRoot": "apps/icons-plugin/src", + "tags": ["type:plugin"], + "targets": { + "build": { + "executor": "@angular-devkit/build-angular:application", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/apps/icons-plugin", + "index": "apps/icons-plugin/src/index.html", + "browser": "apps/icons-plugin/src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "apps/icons-plugin/tsconfig.app.json", + "assets": [ + "apps/icons-plugin/src/favicon.ico", + "apps/icons-plugin/src/assets" + ], + "styles": [ + "libs/plugins-styles/src/lib/styles.css", + "apps/icons-plugin/src/styles.css" + ], + "optimization": { + "scripts": true, + "styles": true, + "fonts": false + }, + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production", + "dependsOn": ["buildPlugin"] + }, + "serve": { + "executor": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "icons-plugin:build:production" + }, + "development": { + "buildTarget": "icons-plugin:build:development", + "host": "0.0.0.0", + "port": 4303 + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "executor": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "icons-plugin:build" + } + } + } +} diff --git a/plugins/apps/icons-plugin/src/app/app.component.css b/plugins/apps/icons-plugin/src/app/app.component.css new file mode 100644 index 0000000000..8fc6764e2d --- /dev/null +++ b/plugins/apps/icons-plugin/src/app/app.component.css @@ -0,0 +1,33 @@ +.icons-plugin { + display: flex; + flex-direction: column; + height: 100vh; + overflow: hidden; + + .icons-search, + .icons-list { + width: 100%; + } + + .icons-search { + padding-top: var(--spacing-20); + padding-bottom: var(--spacing-16); + } + + .icons-list { + flex-grow: 1; + overflow: auto; + display: grid; + padding: 3px 3px 0; + background-color: var(--app-white); + border-radius: var(--spacing-8); + justify-content: start; + grid-template-columns: repeat(6, 1fr); + grid-auto-rows: max-content; + justify-items: center; + } + + .no-icons-found { + font-size: var(--font-size-s); + } +} diff --git a/plugins/apps/icons-plugin/src/app/app.component.ts b/plugins/apps/icons-plugin/src/app/app.component.ts new file mode 100644 index 0000000000..dfb2ac323d --- /dev/null +++ b/plugins/apps/icons-plugin/src/app/app.component.ts @@ -0,0 +1,109 @@ +import { Component, inject, signal } from '@angular/core'; +import { ActivatedRoute, RouterModule } from '@angular/router'; +import { FeatherIconNames, icons } from 'feather-icons'; +import { SafeHtmlPipe } from './pipes/safe-html.pipe'; +import { IconButtonComponent } from './components/icon-button/icon-button.component'; +import { IconSearchComponent } from './components/icon-search/icon-search.component'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { filter, fromEvent, map, merge, take } from 'rxjs'; +import { PluginMessageEvent } from '../model'; + +@Component({ + selector: 'app-root', + imports: [ + RouterModule, + SafeHtmlPipe, + IconButtonComponent, + IconSearchComponent, + ], + styleUrl: './app.component.css', + template: `
+ + @if (iconKeys().length === 0) { +
No icons found
+ } @else { +
+ @for (key of iconKeys(); track key) { + + } +
+ } +
`, + host: { + '[attr.data-theme]': 'theme()', + }, +}) +export class AppComponent { + public route = inject(ActivatedRoute); + public icons = signal(icons); + public iconKeys = signal(Object.keys(icons) as FeatherIconNames[]); + public messages$ = fromEvent>( + window, + 'message', + ); + + public initialTheme$ = this.route.queryParamMap.pipe( + map((params) => params.get('theme')), + filter((theme) => !!theme), + take(1), + ); + + public theme = toSignal( + merge( + this.initialTheme$, + this.messages$.pipe( + filter((event) => event.data.type === 'theme'), + map((event) => { + return event.data.content; + }), + ), + ), + ); + + public insertIcon(key: FeatherIconNames): void { + if ( + key && + this.icons()[key] && + this.icons()[key].toSvg({ + 'stroke-width': '3', + }) + ) { + this.sendMessage({ + type: 'insert-icon', + content: { + svg: this.icons()[key].toSvg(), + name: this.icons()[key].name || key, + }, + }); + } + } + + public searchIcons(search: string): void { + const allKeys = Object.keys(icons) as FeatherIconNames[]; + + if (search === '') { + this.iconKeys.set(allKeys); + return; + } + + const filtered = allKeys.filter( + (key) => + this.icons()[key].tags.some((t) => t.match(search)) || + this.icons()[key].name.match(search), + ) as FeatherIconNames[]; + + this.iconKeys.set(filtered); + } + + private sendMessage(message: unknown): void { + parent.postMessage(message, '*'); + } +} diff --git a/plugins/apps/icons-plugin/src/app/app.config.ts b/plugins/apps/icons-plugin/src/app/app.config.ts new file mode 100644 index 0000000000..1b3e4af314 --- /dev/null +++ b/plugins/apps/icons-plugin/src/app/app.config.ts @@ -0,0 +1,6 @@ +import { ApplicationConfig } from '@angular/core'; +import { provideRouter } from '@angular/router'; + +export const appConfig: ApplicationConfig = { + providers: [provideRouter([])], +}; diff --git a/plugins/apps/icons-plugin/src/app/components/icon-button/icon-button.component.css b/plugins/apps/icons-plugin/src/app/components/icon-button/icon-button.component.css new file mode 100644 index 0000000000..82039e5274 --- /dev/null +++ b/plugins/apps/icons-plugin/src/app/components/icon-button/icon-button.component.css @@ -0,0 +1,28 @@ +.icon-button { + padding: var(--spacing-4); + background: transparent; + border-radius: var(--spacing-8); + color: var(--app-black); + + &:hover, + &:focus, + &:active { + background-color: var(--lb-tertiary); + } + + &:focus, + &:active { + box-shadow: inset 0 0 0 2px var(--da-primary); + } +} + +:host { + &.light { + .icon-button { + &:focus, + &:active { + box-shadow: inset 0 0 0 2px var(--accent-tertiary); + } + } + } +} diff --git a/plugins/apps/icons-plugin/src/app/components/icon-button/icon-button.component.ts b/plugins/apps/icons-plugin/src/app/components/icon-button/icon-button.component.ts new file mode 100644 index 0000000000..37d76e3d3a --- /dev/null +++ b/plugins/apps/icons-plugin/src/app/components/icon-button/icon-button.component.ts @@ -0,0 +1,37 @@ +import { Component, output, input } from '@angular/core'; +import { SafeHtmlPipe } from '../../pipes/safe-html.pipe'; +import { FeatherIcon } from 'feather-icons'; + +@Component({ + selector: 'app-icon-button', + imports: [SafeHtmlPipe], + styleUrl: './icon-button.component.css', + template: ``, +}) +export class IconButtonComponent { + public icon = input.required(); + public insertIcon = output(); + + public onInsertIcon(): void { + this.insertIcon.emit(); + } +} diff --git a/plugins/apps/icons-plugin/src/app/components/icon-search/icon-search.component.css b/plugins/apps/icons-plugin/src/app/components/icon-search/icon-search.component.css new file mode 100644 index 0000000000..e5d1ef9ff9 --- /dev/null +++ b/plugins/apps/icons-plugin/src/app/components/icon-search/icon-search.component.css @@ -0,0 +1,20 @@ +.search-icon { + width: 100%; + border-radius: var(--spacing-8); + padding: var(--spacing-8); + padding-left: var(--spacing-28); + background: var(--background-tertiary) + url('data:image/svg+xml,') + var(--spacing-8) no-repeat; + color: var(--foreground-secondary); + font-size: var(--font-size-s); + font-weight: var(--font-weight-regular); + + &:focus { + outline: none; + } + + &::placeholder { + opacity: 1; + } +} diff --git a/plugins/apps/icons-plugin/src/app/components/icon-search/icon-search.component.ts b/plugins/apps/icons-plugin/src/app/components/icon-search/icon-search.component.ts new file mode 100644 index 0000000000..268e69da50 --- /dev/null +++ b/plugins/apps/icons-plugin/src/app/components/icon-search/icon-search.component.ts @@ -0,0 +1,25 @@ +import { Component, output, signal } from '@angular/core'; +import { icons } from 'feather-icons'; + +@Component({ + selector: 'app-icon-search', + imports: [], + styleUrl: './icon-search.component.css', + template: ` + + `, +}) +export class IconSearchComponent { + public searchIcons = output(); + public iconsCount = signal(Object.keys(icons).length); + + public onSearchIcons(event: Event): void { + const target = event.target as HTMLInputElement; + this.searchIcons.emit(target?.value.toLowerCase() || ''); + } +} diff --git a/plugins/apps/icons-plugin/src/app/pipes/safe-html.pipe.ts b/plugins/apps/icons-plugin/src/app/pipes/safe-html.pipe.ts new file mode 100644 index 0000000000..4c9ee91d85 --- /dev/null +++ b/plugins/apps/icons-plugin/src/app/pipes/safe-html.pipe.ts @@ -0,0 +1,11 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; + +@Pipe({ name: 'safeHtml', standalone: true }) +export class SafeHtmlPipe implements PipeTransform { + constructor(private sanitized: DomSanitizer) {} + + transform(value: string) { + return this.sanitized.bypassSecurityTrustHtml(value); + } +} diff --git a/plugins/apps/icons-plugin/src/assets/.gitkeep b/plugins/apps/icons-plugin/src/assets/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugins/apps/icons-plugin/src/assets/icon.png b/plugins/apps/icons-plugin/src/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0976b7e89cc4377dbee2ace36d71746ec1251e02 GIT binary patch literal 1621 zcmV-b2CDgqP)Px*4@pEpRCt{2noUR)eH_PsGdp9hvu>LqbciqrA$woTO34Tz^3aZ}ZLEcXpwUJU zL3Sxm5uUn5fu~$|H+)%fZDz%V>L9*=D@D+uqP!?n2Bo$wPcu979D4lY*zTA+FaI9e z?`hVV`S17h{lEQYTw-x?@gMk$MdCJqTe$#m8^Enx0Jsg{RxSYC25>7E0B!@gl?wp3 z0o=+3fZG6WQMe7P)R!+`ARdnsGcz;9{QNvoTwE-dl$6L-RaG*>Fot~R9}xh@apavl zcPy`7y&}?`XBY+=8XBYb9an>G8u z5iQ^e_X%F$?4C@3h<Kz*6u^TA4@9@yEvdXJ@CV#gC~0^!E0Wt*xz;EdT7}!oos` zMx(;Mefxgt^-N+}mVWl^85#*ABO}7mqep-H{?#(A4hRGSWJ^m6g16ah!1MgN-~j-- zySs(r;$rmq?%lf+qY>8sNa!cm0&O!RKPnN4&XRW*t>VHDm=@w zbUYp>000&j7cDHyrrjO3Z{IGDkB<`o03SYl$l9kNBf#(XE4I4jVZRo<%jH7w007n1 z)fuG|*F1QwXT8u1@Oe>dIK)%+1Zg%aQH^yC!@n6e9h8Kk|L;+BHp2hKB6| z8#ZjncrKAhKz)6^0^a3vN!{Jus_=b%eTtf*q@)Cznwqj6{-E~=ST1wbluRb!?Afyl z_}bc9>EXkNs_;C|lNT>uMDRsLMbO{hFKG2_>KmbCG6^1!haMdrRlxW3^r*sf97moz zcMf@F7zPFg2848v&g+$F0VI=2ICJKV0=}lEMh*sps_?N`jJR;&0`i%kpAV5pL~uHt zn&Cn300<&;McUZdsDOu`l^&cveVSHlb8Ku(anGYikA#Yf3SHnq?*P)R0iq~^$K#=& zK7IO2IxF}7wM0=AghC;)rlv+Wcrf~5NEAglfBro6NT{x^*0txCrRyuPg9i`NZ{EBi z006db-3qg_v*_I6!-wU;!9hXo9~@ItQ-sUqq7#V(z<&!~I2;y^9XnGH; zm&*eK1FG=PpFdZ?Tdh`zL?XhGBS#E_2Qzj7hr@|QG6^ip(pupehJm4> zA=BVNuPM;j*r<4uvvcQ8xu~dUU2SaHvPHgr{d#KGu3e_VgVq2hjJf4^Y0TJ`c}nzG&o7Zw(vv$NA;u~?v`r6pyz+x2&6 zg0TKV7E0B!@gl?wp30o=+3fZG6Wc|rZ literal 0 HcmV?d00001 diff --git a/plugins/apps/icons-plugin/src/assets/manifest.json b/plugins/apps/icons-plugin/src/assets/manifest.json new file mode 100644 index 0000000000..67484af32a --- /dev/null +++ b/plugins/apps/icons-plugin/src/assets/manifest.json @@ -0,0 +1,7 @@ +{ + "name": "Icons plugin", + "code": "/assets/plugin.js", + "icon": "/assets/icon.png", + "description": "Create icons from the Feather Icons set", + "permissions": ["content:read", "content:write"] +} diff --git a/plugins/apps/icons-plugin/src/favicon.ico b/plugins/apps/icons-plugin/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 + + + + icons-plugin + + + + + + + + diff --git a/plugins/apps/icons-plugin/src/main.ts b/plugins/apps/icons-plugin/src/main.ts new file mode 100644 index 0000000000..8882c4517f --- /dev/null +++ b/plugins/apps/icons-plugin/src/main.ts @@ -0,0 +1,7 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { AppComponent } from './app/app.component'; + +bootstrapApplication(AppComponent, appConfig).catch((err) => + console.error(err), +); diff --git a/plugins/apps/icons-plugin/src/model.ts b/plugins/apps/icons-plugin/src/model.ts new file mode 100644 index 0000000000..e3e834de40 --- /dev/null +++ b/plugins/apps/icons-plugin/src/model.ts @@ -0,0 +1,27 @@ +export interface InitPluginEvent { + type: 'init'; + content: { + theme: string; + }; +} + +export interface InsertIconEvent { + type: 'insert-icon'; + content: { + svg: string; + name: string; + }; +} + +export interface InitPluginUIEvent { + type: 'ready'; +} + +export type PluginUIEvent = InitPluginUIEvent | InsertIconEvent; + +export interface ThemePluginEvent { + type: 'theme'; + content: string; +} + +export type PluginMessageEvent = InitPluginEvent | ThemePluginEvent; diff --git a/plugins/apps/icons-plugin/src/plugin.ts b/plugins/apps/icons-plugin/src/plugin.ts new file mode 100644 index 0000000000..c5f6bd4431 --- /dev/null +++ b/plugins/apps/icons-plugin/src/plugin.ts @@ -0,0 +1,31 @@ +import type { PluginMessageEvent, PluginUIEvent } from './model.js'; + +penpot.ui.open('FEATHER ICONS PLUGIN', `?theme=${penpot.theme}`, { + width: 292, + height: 540, +}); + +penpot.ui.onMessage((message) => { + if (message.type === 'insert-icon') { + const { name, svg } = message.content; + + if (!svg || !name) { + return; + } + + const icon = penpot.createShapeFromSvg(svg); + if (icon) { + icon.name = name; + icon.x = penpot.viewport.center.x; + icon.y = penpot.viewport.center.y; + } + } +}); + +penpot.on('themechange', (theme) => { + sendMessage({ type: 'theme', content: theme }); +}); + +function sendMessage(message: PluginMessageEvent) { + penpot.ui.sendMessage(message); +} diff --git a/plugins/apps/icons-plugin/src/styles.css b/plugins/apps/icons-plugin/src/styles.css new file mode 100644 index 0000000000..90d4ee0072 --- /dev/null +++ b/plugins/apps/icons-plugin/src/styles.css @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/plugins/apps/icons-plugin/tsconfig.app.json b/plugins/apps/icons-plugin/tsconfig.app.json new file mode 100644 index 0000000000..fff4a41d44 --- /dev/null +++ b/plugins/apps/icons-plugin/tsconfig.app.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.d.ts"], + "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] +} diff --git a/plugins/apps/icons-plugin/tsconfig.editor.json b/plugins/apps/icons-plugin/tsconfig.editor.json new file mode 100644 index 0000000000..4ee6393404 --- /dev/null +++ b/plugins/apps/icons-plugin/tsconfig.editor.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*.ts"], + "compilerOptions": { + "types": [] + } +} diff --git a/plugins/apps/icons-plugin/tsconfig.json b/plugins/apps/icons-plugin/tsconfig.json new file mode 100644 index 0000000000..4c48587cfe --- /dev/null +++ b/plugins/apps/icons-plugin/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "es2022", + "useDefineForClassFields": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.editor.json" + }, + { + "path": "./tsconfig.plugin.json" + } + ], + "extends": "../../tsconfig.base.json", + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/plugins/apps/icons-plugin/tsconfig.plugin.json b/plugins/apps/icons-plugin/tsconfig.plugin.json new file mode 100644 index 0000000000..961987f7a1 --- /dev/null +++ b/plugins/apps/icons-plugin/tsconfig.plugin.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": [] + }, + "files": ["src/plugin.ts"], + "include": ["../../libs/plugin-types/index.d.ts"] +} diff --git a/plugins/apps/lorem-ipsum-plugin/eslint.config.js b/plugins/apps/lorem-ipsum-plugin/eslint.config.js new file mode 100644 index 0000000000..7aa90c2ab0 --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/eslint.config.js @@ -0,0 +1,51 @@ +import baseConfig from '../../eslint.config.js'; +import { compat } from '../../eslint.base.config.js'; + +export default [ + ...baseConfig, + ...compat + .config({ + extends: [ + 'plugin:@nx/angular', + 'plugin:@angular-eslint/template/process-inline-templates', + ], + }) + .map((config) => ({ + ...config, + files: ['**/*.ts'], + rules: { + '@angular-eslint/directive-selector': [ + 'error', + { + type: 'attribute', + prefix: 'app', + style: 'camelCase', + }, + ], + '@angular-eslint/component-selector': [ + 'error', + { + type: 'element', + prefix: 'app', + style: 'kebab-case', + }, + ], + }, + })), + ...compat + .config({ extends: ['plugin:@nx/angular-template'] }) + .map((config) => ({ + ...config, + files: ['**/*.html'], + rules: {}, + })), + { ignores: ['**/assets/*.js'] }, + { + languageOptions: { + parserOptions: { + project: './tsconfig.*?.json', + tsconfigRootDir: import.meta.dirname, + }, + }, + }, +]; diff --git a/plugins/apps/lorem-ipsum-plugin/project.json b/plugins/apps/lorem-ipsum-plugin/project.json new file mode 100644 index 0000000000..db66c3677b --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/project.json @@ -0,0 +1,79 @@ +{ + "name": "lorem-ipsum-plugin", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "prefix": "app", + "sourceRoot": "apps/lorem-ipsum-plugin/src", + "tags": ["type:plugin"], + "targets": { + "build": { + "executor": "@angular-devkit/build-angular:application", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/apps/lorem-ipsum-plugin", + "index": "apps/lorem-ipsum-plugin/src/index.html", + "browser": "apps/lorem-ipsum-plugin/src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "apps/lorem-ipsum-plugin/tsconfig.app.json", + "assets": [ + "apps/lorem-ipsum-plugin/src/favicon.ico", + "apps/lorem-ipsum-plugin/src/assets" + ], + "styles": [ + "libs/plugins-styles/src/lib/styles.css", + "apps/lorem-ipsum-plugin/src/styles.css" + ], + "scripts": [], + "optimization": { + "scripts": true, + "styles": true, + "fonts": false + } + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production", + "dependsOn": ["buildPlugin"] + }, + "serve": { + "executor": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "lorem-ipsum-plugin:build:production" + }, + "development": { + "buildTarget": "lorem-ipsum-plugin:build:development", + "host": "0.0.0.0", + "port": 4304 + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "executor": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "lorem-ipsum-plugin:build" + } + } + } +} diff --git a/plugins/apps/lorem-ipsum-plugin/src/app/app.component.css b/plugins/apps/lorem-ipsum-plugin/src/app/app.component.css new file mode 100644 index 0000000000..a99f3be55f --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/src/app/app.component.css @@ -0,0 +1,46 @@ +p { + color: var(--foreground-secondary); + margin-block-end: var(--spacing-16); +} + +.generation-options { + display: flex; + gap: var(--spacing-8); +} + +.generation-size { + inline-size: 60px; +} + +.generation-type { + inline-size: 100%; +} + +.sections-wrapper { + display: flex; + flex-direction: column; + height: 100vh; +} + +section { + padding-block-start: var(--spacing-24); + + button { + inline-size: 100%; + } +} + +.regular-generate { + padding-block-end: var(--spacing-24); + + button { + margin-block-start: var(--spacing-12); + } +} + +.extra-options { + margin-block-start: auto; + display: flex; + flex-direction: column; + gap: var(--spacing-20); +} diff --git a/plugins/apps/lorem-ipsum-plugin/src/app/app.component.ts b/plugins/apps/lorem-ipsum-plugin/src/app/app.component.ts new file mode 100644 index 0000000000..4c91dc0ba9 --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/src/app/app.component.ts @@ -0,0 +1,117 @@ +import { Component, inject } from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import type { + GenerationTypes, + PluginMessageEvent, + PluginUIEvent, +} from '../model'; +import { filter, fromEvent, map, merge, take } from 'rxjs'; + +@Component({ + imports: [ReactiveFormsModule], + selector: 'app-root', + template: ` +
+
+

+ Select a text field to replace it with a placeholder text. +

+ +
+ + + +
+ +
+
+
+ + +
+ +
+ + +
+
+
+ `, + styleUrl: './app.component.css', + host: { + '[attr.data-theme]': 'theme()', + }, +}) +export class AppComponent { + route = inject(ActivatedRoute); + messages$ = fromEvent>(window, 'message'); + + initialTheme$ = this.route.queryParamMap.pipe( + map((params) => params.get('theme')), + filter((theme) => !!theme), + take(1), + ); + + theme = toSignal( + merge( + this.initialTheme$, + this.messages$.pipe( + filter((event) => event.data.type === 'theme'), + map((event) => { + return event.data.content; + }), + ), + ), + ); + + form = new FormGroup({ + num: new FormControl(1, { nonNullable: true }), + type: new FormControl('paragraphs', { nonNullable: true }), + startWith: new FormControl(true, { nonNullable: true }), + autoClose: new FormControl(false, { nonNullable: true }), + }); + + constructor() { + this.#sendMessage({ type: 'ready' }); + } + + generate() { + const formValue = this.form.getRawValue(); + + this.#sendMessage({ + type: 'text', + generationType: formValue.type, + startWithLorem: formValue.startWith, + size: formValue.num, + autoClose: formValue.autoClose, + }); + } + + #sendMessage(message: PluginUIEvent) { + parent.postMessage(message, '*'); + } +} diff --git a/plugins/apps/lorem-ipsum-plugin/src/app/app.config.ts b/plugins/apps/lorem-ipsum-plugin/src/app/app.config.ts new file mode 100644 index 0000000000..1b3e4af314 --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/src/app/app.config.ts @@ -0,0 +1,6 @@ +import { ApplicationConfig } from '@angular/core'; +import { provideRouter } from '@angular/router'; + +export const appConfig: ApplicationConfig = { + providers: [provideRouter([])], +}; diff --git a/plugins/apps/lorem-ipsum-plugin/src/assets/icon.png b/plugins/apps/lorem-ipsum-plugin/src/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..644e6831f4fea43751156bed711f4e07dfec0006 GIT binary patch literal 1514 zcmVPx)q)9|URCt{2noUS!R}{z3efcnc#LvVSbxcQ?s)N&jqxM4#rLjedn??{RIxgI} zQ2bbk3m0Y~Zp4iUE@faA;!cW)I1Hn01+6WL3!Tx0#f%*jO(yC@llR{3!Y1=Hi7!`g z@@8s&AiTu;PR{+mbIv>Wy^Gv#w+HSh7-Lor0F2a*NCiSjc4sH=CoX{04oFR00I402 znz#T`J0LZ20id5n&a-FF zSmBthtu1dyM+fKs|0gAY$Kyc&02Ygdw_2@Sc6PStIT+(hpY?h@3=R%*7K?=k06054 zqnc8FqM8DYjg7Z1TFuSP99#%M!Lwk91z22MMEm>u*N*WEU^1B^7675p7uakzW0gvE zDXl_bv)N#AagjJmh;D{$W4GG@0APB0ni(A(jo3C(3h?{~KUg+mkt5=25hOwA7srulf9G4_ zxByZ+AT?ALLn|+46;8)n(OZx%&%hhM`S#l4vG)55`CHrHq8BDpr^n@{A8x%ipd!Hi zl1FUDVUDQNSvtLFUvTfiLoPWjL$o4hYIRgrhExR5vP4iD}1Z! zCrg)$ADh0vws5U2y;K|>?2Fn;%hKX6zx(kcDT2kN+==_0sMG108qvb_+2;@0bWOHs zYN{hBl#xJ1fSh~xsXeRH=<~5gpC2!Rv4SW9gll%;@%xiwID3B@lmbd+0;Hq|hia&$ zt<&iY`I|=v|Ab7f#N=e0n0&DuXPBE`M=B}s*Kf}iry*(p!!S@&-yC?7vAVj7mX?;7 z;o)J~)v;EqRqpfo*ouk@Y&04%0Kn0~KKkS3oFde3re{$ zB?Ths1PcobaaC1SM3viMFkk=xnM@A%i%UfdV$4z?Tm(cyTU#67*49S-%?`ve0>Tk# zCrA@v5xfmC?F4BeNf8W3VaXTV@jLPUohIt^%#WuN)a4s^UA}>ashAV*1Zf&Ob-U1c zlwM)^Q7V;?LMi-#RDgtp1n_t+wif$*J_G;(M=<7LY5o@lPxxG(6hjN#<#>NI3 z7#IlK+sBIb_I9~28XFoKh;ooffV#RmzNDlipzz4Zh)gOGPEJmsqoYIq^y$;U94ad- zadmYyQ3McglG@tZLbbKEio?Uhz;|l38cIt`@og3*B(N+C>+9>tUy$Kq0R^+Ov);VC zJQ7pfjdqFc?(TxcVo|(){W_-IUpUIk%kkvoq))5WlAe0AU1A1<0Tvb(d{3S{iOT9O zQW%DTuC6X_Zf@=-lLw%&PtfUf!sg~CdiClR+S}WUdPE?EprD`t7ZnxZ;^JZ)ZkI}g z+$;tDM?`0%~#Uq { + it('should generate the correct number of characters starting with "Lorem ipsum"', () => { + const result = generateCharacters(20); + expect(result.length).toBe(20); + expect(result.startsWith('Lorem ipsum')).toBe(true); + }); + + it('should generate the correct number of characters without starting with "Lorem ipsum"', () => { + const result = generateCharacters(40, false); + expect(result.length).toBe(40); + expect(result.startsWith('Lorem ipsum')).toBe(false); + }); +}); + +describe('generateWords', () => { + it('should generate the correct number of words starting with "Lorem ipsum"', () => { + const result = generateWords(5); + const words = result.split(' '); + expect(words.length).toBe(5); + expect(result.startsWith('Lorem ipsum')).toBe(true); + }); + + it('should generate the correct number of words without starting with "Lorem ipsum"', () => { + const result = generateWords(10, false); + const words = result.split(' '); + expect(words.length).toBe(10); + expect(result.startsWith('Lorem ipsum')).toBe(false); + }); +}); + +describe('generateSentences', () => { + it('should generate the correct number of sentences starting with "Lorem ipsum"', () => { + const result = generateSentences(3); + const sentences = result.split('. '); + expect(sentences.length).toBe(3); + expect(result.startsWith('Lorem ipsum')).toBe(true); + }); + + it('should generate the correct number of sentences without starting with "Lorem ipsum"', () => { + const result = generateSentences(6, false); + const sentences = result.split('. '); + expect(sentences.length).toBe(6); + expect(result.startsWith('Lorem ipsum')).toBe(false); + }); +}); + +describe('generateParagraphs', () => { + it('should generate the correct number of paragraphs starting with "Lorem ipsum"', () => { + const result = generateParagraphs(2); + const paragraphs = result.split('\n\n'); + expect(paragraphs.length).toBe(2); + expect(result.startsWith('Lorem ipsum')).toBe(true); + }); + + it('should generate the correct number of paragraphs without starting with "Lorem ipsum"', () => { + const result = generateParagraphs(4, false); + const paragraphs = result.split('\n\n'); + expect(paragraphs.length).toBe(4); + expect(result.startsWith('Lorem ipsum')).toBe(false); + }); +}); diff --git a/plugins/apps/lorem-ipsum-plugin/src/generator.ts b/plugins/apps/lorem-ipsum-plugin/src/generator.ts new file mode 100644 index 0000000000..8afc3de254 --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/src/generator.ts @@ -0,0 +1,142 @@ +const wordList = [ + 'dolor', + 'sit', + 'amet', + 'consectetur', + 'adipiscing', + 'elit', + 'sed', + 'do', + 'eiusmod', + 'tempor', + 'incididunt', + 'labore', + 'et', + 'dolore', + 'magna', + 'aliqua', + 'enim', + 'ad', + 'minim', + 'veniam', + 'quis', + 'nostrud', + 'exercitation', + 'ullamco', + 'laboris', + 'nisi', + 'ut', + 'aliquip', + 'ex', + 'ea', + 'commodo', + 'consequat', + 'duis', + 'aute', + 'irure', + 'in', + 'reprehenderit', + 'voluptate', + 'velit', + 'esse', + 'cillum', + 'eu', + 'fugiat', + 'nulla', + 'pariatur', + 'excepteur', + 'sint', + 'occaecat', + 'cupidatat', + 'non', + 'proident', + 'sunt', + 'culpa', + 'qui', + 'officia', + 'deserunt', + 'mollit', + 'anim', + 'id', + 'est', + 'laborum', +]; + +const lorem = 'Lorem ipsum' as const; + +function* randomWordGenerator() { + let copyWordList: string[] = []; + + while (true) { + if (!copyWordList.length) { + copyWordList = [...wordList]; + } + + const newWordIndex = Math.floor(Math.random() * copyWordList.length); + + yield copyWordList[newWordIndex]; + + copyWordList.splice(newWordIndex, 1); + } +} + +const getRandomWordGenerator = randomWordGenerator(); + +function getRandomWord() { + return getRandomWordGenerator.next().value; +} + +export function generateCharacters(count: number, startWithLorem = true) { + let text = ''; + + if (startWithLorem) { + text = lorem + ' '; + } + + while (text.length < count) { + text += getRandomWord() + ' '; + } + + return text.slice(0, count); +} + +export function generateWords(count: number, startWithLorem = true) { + let words = []; + + if (startWithLorem) { + words.push(...lorem.split(' ').slice(0, count)); + } + + for (let i = words.length; i < count; i++) { + words.push(getRandomWord()); + } + + return words.join(' '); +} + +export function generateSentences(count: number, startWithLorem = true) { + let sentences = []; + for (let i = 0; i < count; i++) { + let sentenceLength = Math.floor(Math.random() * 10) + 3; // between 3 and 12 words per sentence + let sentence = generateWords(sentenceLength, false); + + if (startWithLorem && i === 0) { + sentence = + lorem + ' ' + sentence.charAt(0).toLowerCase() + sentence.slice(1); + } + + sentences.push(sentence.charAt(0).toUpperCase() + sentence.slice(1) + '.'); + } + return sentences.join(' '); +} + +export function generateParagraphs(count: number, startWithLorem = true) { + let paragraphs = []; + for (let i = 0; i < count; i++) { + let paragraphLength = Math.floor(Math.random() * 5) + 3; // between 3 and 7 sentences per paragraph + paragraphs.push( + generateSentences(paragraphLength, startWithLorem && i === 0), + ); + } + return paragraphs.join('\n\n'); +} diff --git a/plugins/apps/lorem-ipsum-plugin/src/index.html b/plugins/apps/lorem-ipsum-plugin/src/index.html new file mode 100644 index 0000000000..8348d25e0e --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/src/index.html @@ -0,0 +1,12 @@ + + + + + lorem-ipsum-plugin + + + + + + + diff --git a/plugins/apps/lorem-ipsum-plugin/src/main.ts b/plugins/apps/lorem-ipsum-plugin/src/main.ts new file mode 100644 index 0000000000..8882c4517f --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/src/main.ts @@ -0,0 +1,7 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { AppComponent } from './app/app.component'; + +bootstrapApplication(AppComponent, appConfig).catch((err) => + console.error(err), +); diff --git a/plugins/apps/lorem-ipsum-plugin/src/model.ts b/plugins/apps/lorem-ipsum-plugin/src/model.ts new file mode 100644 index 0000000000..dce13e4f73 --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/src/model.ts @@ -0,0 +1,40 @@ +export type GenerationTypes = + | 'paragraphs' + | 'sentences' + | 'words' + | 'characters'; + +export interface InitPluginUIEvent { + type: 'ready'; +} + +export interface TextPluginUIEvent { + type: 'text'; + generationType: GenerationTypes; + startWithLorem: boolean; + size: number; + autoClose: boolean; +} +export type PluginUIEvent = InitPluginUIEvent | TextPluginUIEvent; + +export interface InitPluginEvent { + type: 'init'; + content: { + theme: string; + selection: number; + }; +} +export interface SelectionPluginEvent { + type: 'selection'; + content: number; +} + +export interface ThemePluginEvent { + type: 'theme'; + content: string; +} + +export type PluginMessageEvent = + | InitPluginEvent + | SelectionPluginEvent + | ThemePluginEvent; diff --git a/plugins/apps/lorem-ipsum-plugin/src/plugin.ts b/plugins/apps/lorem-ipsum-plugin/src/plugin.ts new file mode 100644 index 0000000000..3f97da9961 --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/src/plugin.ts @@ -0,0 +1,72 @@ +import { Text } from '@penpot/plugin-types'; +import type { + PluginMessageEvent, + PluginUIEvent, + TextPluginUIEvent, +} from './model.js'; +import { + generateParagraphs, + generateSentences, + generateWords, + generateCharacters, +} from './generator.js'; + +penpot.ui.open('LOREM IPSUM PLUGIN', `?theme=${penpot.theme}`); + +penpot.on('themechange', (theme) => { + sendMessage({ type: 'theme', content: theme }); +}); + +function getSelectedShapes(): Text[] { + return penpot.selection.filter((it): it is Text => { + return penpot.utils.types.isText(it); + }); +} + +penpot.on('selectionchange', () => { + sendMessage({ type: 'selection', content: getSelectedShapes().length }); +}); + +penpot.ui.onMessage((message) => { + if (message.type === 'text') { + generateText(message); + + if (message.autoClose) { + penpot.closePlugin(); + } + } +}); + +function sendMessage(message: PluginMessageEvent) { + penpot.ui.sendMessage(message); +} + +function generateText(event: TextPluginUIEvent) { + const selection = getSelectedShapes(); + + if (!selection.length) { + const text = penpot.createText('lorem ipsum'); + if (text) { + text.x = penpot.viewport.center.x; + text.y = penpot.viewport.center.y; + selection.push(text); + } + } + + selection.forEach((it) => { + switch (event.generationType) { + case 'paragraphs': + it.characters = generateParagraphs(event.size, event.startWithLorem); + break; + case 'sentences': + it.characters = generateSentences(event.size, event.startWithLorem); + break; + case 'words': + it.characters = generateWords(event.size, event.startWithLorem); + break; + case 'characters': + it.characters = generateCharacters(event.size, event.startWithLorem); + break; + } + }); +} diff --git a/plugins/apps/lorem-ipsum-plugin/src/styles.css b/plugins/apps/lorem-ipsum-plugin/src/styles.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugins/apps/lorem-ipsum-plugin/tsconfig.app.json b/plugins/apps/lorem-ipsum-plugin/tsconfig.app.json new file mode 100644 index 0000000000..fff4a41d44 --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/tsconfig.app.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.d.ts"], + "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] +} diff --git a/plugins/apps/lorem-ipsum-plugin/tsconfig.editor.json b/plugins/apps/lorem-ipsum-plugin/tsconfig.editor.json new file mode 100644 index 0000000000..4ee6393404 --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/tsconfig.editor.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*.ts"], + "compilerOptions": { + "types": [] + } +} diff --git a/plugins/apps/lorem-ipsum-plugin/tsconfig.json b/plugins/apps/lorem-ipsum-plugin/tsconfig.json new file mode 100644 index 0000000000..4c48587cfe --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "es2022", + "useDefineForClassFields": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.editor.json" + }, + { + "path": "./tsconfig.plugin.json" + } + ], + "extends": "../../tsconfig.base.json", + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/plugins/apps/lorem-ipsum-plugin/tsconfig.plugin.json b/plugins/apps/lorem-ipsum-plugin/tsconfig.plugin.json new file mode 100644 index 0000000000..961987f7a1 --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/tsconfig.plugin.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": [] + }, + "files": ["src/plugin.ts"], + "include": ["../../libs/plugin-types/index.d.ts"] +} diff --git a/plugins/apps/lorem-ipsum-plugin/vite.config.ts b/plugins/apps/lorem-ipsum-plugin/vite.config.ts new file mode 100644 index 0000000000..cbc2e74521 --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/vite.config.ts @@ -0,0 +1,21 @@ +/// +import { defineConfig } from 'vite'; + +export default defineConfig({ + root: __dirname, + cacheDir: '../node_modules/.vite/lorem-ipsum-plugin', + test: { + watch: false, + globals: true, + cache: { + dir: '../node_modules/.vitest', + }, + environment: 'jsdom', + include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + reporters: ['default'], + coverage: { + reportsDirectory: '../coverage/lorem-ipsum-plugin', + provider: 'v8', + }, + }, +}); diff --git a/plugins/apps/poc-state-plugin/eslint.config.js b/plugins/apps/poc-state-plugin/eslint.config.js new file mode 100644 index 0000000000..7aa90c2ab0 --- /dev/null +++ b/plugins/apps/poc-state-plugin/eslint.config.js @@ -0,0 +1,51 @@ +import baseConfig from '../../eslint.config.js'; +import { compat } from '../../eslint.base.config.js'; + +export default [ + ...baseConfig, + ...compat + .config({ + extends: [ + 'plugin:@nx/angular', + 'plugin:@angular-eslint/template/process-inline-templates', + ], + }) + .map((config) => ({ + ...config, + files: ['**/*.ts'], + rules: { + '@angular-eslint/directive-selector': [ + 'error', + { + type: 'attribute', + prefix: 'app', + style: 'camelCase', + }, + ], + '@angular-eslint/component-selector': [ + 'error', + { + type: 'element', + prefix: 'app', + style: 'kebab-case', + }, + ], + }, + })), + ...compat + .config({ extends: ['plugin:@nx/angular-template'] }) + .map((config) => ({ + ...config, + files: ['**/*.html'], + rules: {}, + })), + { ignores: ['**/assets/*.js'] }, + { + languageOptions: { + parserOptions: { + project: './tsconfig.*?.json', + tsconfigRootDir: import.meta.dirname, + }, + }, + }, +]; diff --git a/plugins/apps/poc-state-plugin/project.json b/plugins/apps/poc-state-plugin/project.json new file mode 100644 index 0000000000..1e14aadf27 --- /dev/null +++ b/plugins/apps/poc-state-plugin/project.json @@ -0,0 +1,79 @@ +{ + "name": "poc-state-plugin", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "prefix": "app", + "sourceRoot": "apps/poc-state-plugin/src", + "tags": ["type:plugin"], + "targets": { + "build": { + "executor": "@angular-devkit/build-angular:application", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/apps/poc-state-plugin", + "index": "apps/poc-state-plugin/src/index.html", + "browser": "apps/poc-state-plugin/src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "apps/poc-state-plugin/tsconfig.app.json", + "assets": [ + "apps/poc-state-plugin/src/favicon.ico", + "apps/poc-state-plugin/src/assets" + ], + "styles": [ + "libs/plugins-styles/src/lib/styles.css", + "apps/poc-state-plugin/src/styles.css" + ], + "scripts": [], + "optimization": { + "scripts": true, + "styles": true, + "fonts": false + } + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production", + "dependsOn": ["buildPlugin"] + }, + "serve": { + "executor": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "poc-state-plugin:build:production" + }, + "development": { + "buildTarget": "poc-state-plugin:build:development", + "port": 4301, + "host": "0.0.0.0" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "executor": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "poc-state-plugin:build" + } + } + } +} diff --git a/plugins/apps/poc-state-plugin/src/app/app.component.css b/plugins/apps/poc-state-plugin/src/app/app.component.css new file mode 100644 index 0000000000..000d3c33c0 --- /dev/null +++ b/plugins/apps/poc-state-plugin/src/app/app.component.css @@ -0,0 +1,111 @@ +html { + font-family: + ui-sans-serif, + system-ui, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + 'Helvetica Neue', + Arial, + 'Noto Sans', + sans-serif, + 'Apple Color Emoji', + 'Segoe UI Emoji', + 'Segoe UI Symbol', + 'Noto Color Emoji'; + line-height: 1.5; + tab-size: 4; + scroll-behavior: smooth; +} + +body { + font-family: inherit; + line-height: inherit; + margin: 0; +} + +h1, +h2, +p, +pre { + margin: 0; +} + +*, +::before, +::after { + box-sizing: border-box; + border-width: 0; + border-style: solid; + border-color: currentColor; +} + +h1, +h2 { + font-size: inherit; + font-weight: inherit; +} + +a { + color: inherit; + text-decoration: inherit; +} + +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, + 'Liberation Mono', 'Courier New', monospace; +} + +svg { + display: block; + vertical-align: middle; +} + +svg { + shape-rendering: auto; + text-rendering: optimizeLegibility; +} + +.wrapper { + width: 100%; +} + +p { + margin-block-end: var(--spacing-12); +} + +h1 { + font-size: 20px; + margin-block-end: var(--spacing-12); +} + +.help { + color: #6b7280; + display: block; + font-size: 11px; + padding-inline-start: var(--spacing-12); +} + +.name-wrap { + display: flex; + gap: 1rem; + margin-bottom: 1rem; +} + +.name-wrap input { + flex: 1; +} + +.actions-wrap { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 1rem; + margin-bottom: 1rem; +} + +.variant-info { + width: 100%; + height: 5rem; +} diff --git a/plugins/apps/poc-state-plugin/src/app/app.component.ts b/plugins/apps/poc-state-plugin/src/app/app.component.ts new file mode 100644 index 0000000000..9d5d6b7df4 --- /dev/null +++ b/plugins/apps/poc-state-plugin/src/app/app.component.ts @@ -0,0 +1,485 @@ +import { Component, effect, signal } from '@angular/core'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import type { Shape } from '@penpot/plugin-types'; + +@Component({ + selector: 'app-root', + imports: [ReactiveFormsModule], + template: ` +
+

Test area!

+ +

+ Current project name: {{ projectName() }} +

+

+ Counter: {{ counter() }} +

+ +
+
+ + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+

Variants

+
+ + + + + + + + + + + + + +
+ + +
+ +

+ +

+
+ `, + styleUrl: './app.component.css', +}) +export class AppComponent { + #pageId: null | string = null; + #fileId = null; + #revn = 0; + #selection = signal([]); + + form = new FormGroup({ + name: new FormControl(''), + }); + theme = signal(''); + projectName = signal('Unknown'); + counter = signal(0); + + constructor() { + window.addEventListener('message', (event) => { + if (event.data.type === 'file') { + this.#fileId = event.data.content.id; + this.#revn = event.data.content.revn; + } else if (event.data.type === 'page') { + this.#refreshPage( + event.data.content.page.id, + event.data.content.page.name, + ); + } else if (event.data.type === 'selection') { + this.#refreshSelection(event.data.content.selection); + this.counter.set(event.data.content.counter); + } else if (event.data.type === 'init') { + this.#fileId = event.data.content.fileId; + this.#revn = event.data.content.revn; + this.#refreshPage(event.data.content.pageId, event.data.content.name); + this.#refreshSelection(event.data.content.selection); + this.theme.set(event.data.content.theme); + this.counter.set(event.data.content.counter); + } else if (event.data.type === 'theme') { + this.theme.set(event.data.content); + } else if (event.data.type === 'update-counter') { + this.counter.set(event.data.content.counter); + } else if (event.data.type === 'start-download') { + this.#startDownload(event.data.name, event.data.content); + } + }); + + this.#sendMessage({ content: 'ready' }); + + effect(() => { + document.body.setAttribute('data-theme', this.theme()); + }); + } + + close() { + this.#sendMessage({ content: 'close' }); + } + + updateName() { + const id = this.#selection()[0].id; + const name = this.form.get('name')?.value; + this.#sendMessage({ content: 'change-name', data: { id, name } }); + } + + createRect() { + this.#sendMessage({ content: 'create-rect' }); + } + + moveX() { + const id = this.#selection()[0].id; + this.#sendMessage({ content: 'move-x', data: { id } }); + } + + moveY() { + const id = this.#selection()[0].id; + this.#sendMessage({ content: 'move-y', data: { id } }); + } + + resizeW() { + const id = this.#selection()[0].id; + this.#sendMessage({ content: 'resize-w', data: { id } }); + } + + resizeH() { + const id = this.#selection()[0].id; + this.#sendMessage({ content: 'resize-h', data: { id } }); + } + + loremIpsum() { + this.#sendMessage({ content: 'lorem-ipsum' }); + } + + addIcon() { + this.#sendMessage({ content: 'add-icon' }); + } + + createGrid() { + this.#sendMessage({ content: 'create-grid' }); + } + + createPalette() { + this.#sendMessage({ content: 'create-colors' }); + } + + increaseCounter() { + this.#sendMessage({ content: 'increase-counter' }); + } + + stylizeWords() { + this.#sendMessage({ content: 'word-styles' }); + } + + rotateShapes() { + this.#sendMessage({ content: 'rotate-selection' }); + } + + createMargins() { + this.#sendMessage({ content: 'create-margins' }); + } + + addComment() { + this.#sendMessage({ content: 'add-comment' }); + } + + exportFile() { + this.#sendMessage({ content: 'export-file' }); + } + + exportSelected() { + this.#sendMessage({ content: 'export-selected' }); + } + + async uploadImage(event: Event) { + const input = event.target as HTMLInputElement; + if (input?.files?.length) { + const file = input?.files[0]; + + if (file) { + const buff = await file.arrayBuffer(); + const data = new Uint8Array(buff); + const mimeType = file.type; + this.#sendMessage({ + content: 'create-image-data', + data: { data, mimeType }, + }); + input.value = ''; + } + } + } + + resizeModal() { + this.#sendMessage({ content: 'resize-modal' }); + } + + testLocalStorage() { + this.#sendMessage({ content: 'save-localstorage' }); + } + + #sendMessage(message: unknown) { + parent.postMessage(message, '*'); + } + + #refreshPage(pageId: string, name: string) { + this.#pageId = pageId; + this.projectName.set(name || 'Unknown'); + } + + #refreshSelection(selection: Shape[]) { + this.#selection.set(selection); + if (selection && selection.length > 0) { + this.form.get('name')?.setValue(this.#selection()[0].name); + } else { + this.form.get('name')?.setValue(''); + } + } + + #startDownload(name: string, data: Uint8Array) { + const blob = new Blob([data], { type: 'application/octet-stream' }); + + // We need to start a download with this URL + const downloadURL = URL.createObjectURL(blob); + + // Download + var a = document.createElement('a'); + document.body.appendChild(a); + a.href = downloadURL; + a.download = name; + a.click(); + + // Remove temporary + URL.revokeObjectURL(a.href); + a.remove(); + } + + transformInVariant() { + this.#sendMessage({ content: 'transform-in-variant' }); + } + + combineSelectedAsVariants() { + this.#sendMessage({ content: 'combine-selected-as-variants' }); + } + + addVariant() { + this.#sendMessage({ content: 'add-variant' }); + } + + addProperty() { + this.#sendMessage({ content: 'add-property' }); + } + + removeProperty() { + let input = prompt('Property position?'); + if (input !== null) { + const pos = parseInt(input, 10); + if (!isNaN(pos)) { + this.#sendMessage({ content: 'remove-property', data: pos }); + } + } + } + + renameProperty() { + let input = prompt('Property position?'); + if (input !== null) { + const pos = parseInt(input, 10); + if (!isNaN(pos)) { + let name = prompt('New name?'); + if (name !== null) { + this.#sendMessage({ + content: 'rename-property', + data: { pos, name }, + }); + } + } + } + } + + setVariantProperty() { + let input = prompt('Property position?'); + if (input !== null) { + const pos = parseInt(input, 10); + if (!isNaN(pos)) { + let value = prompt('New value?'); + if (value !== null) { + this.#sendMessage({ + content: 'set-variant-property', + data: { pos, value }, + }); + } + } + } + } + + switchVariant() { + let input = prompt('Property position?'); + if (input !== null) { + const pos = parseInt(input, 10); + if (!isNaN(pos)) { + let value = prompt('New value?'); + if (value !== null) { + this.#sendMessage({ + content: 'switch-variant', + data: { pos, value }, + }); + } + } + } + } +} diff --git a/plugins/apps/poc-state-plugin/src/assets/manifest.json b/plugins/apps/poc-state-plugin/src/assets/manifest.json new file mode 100644 index 0000000000..761734d974 --- /dev/null +++ b/plugins/apps/poc-state-plugin/src/assets/manifest.json @@ -0,0 +1,13 @@ +{ + "name": "POC State Read", + "description": "Sandbox plugin for plugins development", + "code": "/assets/plugin.js", + "permissions": [ + "content:write", + "library:write", + "comment:write", + "user:read", + "allow:downloads", + "allow:localstorage" + ] +} diff --git a/plugins/apps/poc-state-plugin/src/favicon.ico b/plugins/apps/poc-state-plugin/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 + + + + poc-state-plugin + + + + + + + + diff --git a/plugins/apps/poc-state-plugin/src/main.ts b/plugins/apps/poc-state-plugin/src/main.ts new file mode 100644 index 0000000000..31c5da4829 --- /dev/null +++ b/plugins/apps/poc-state-plugin/src/main.ts @@ -0,0 +1,4 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { AppComponent } from './app/app.component'; + +bootstrapApplication(AppComponent).catch((err) => console.error(err)); diff --git a/plugins/apps/poc-state-plugin/src/plugin.ts b/plugins/apps/poc-state-plugin/src/plugin.ts new file mode 100644 index 0000000000..a31e760899 --- /dev/null +++ b/plugins/apps/poc-state-plugin/src/plugin.ts @@ -0,0 +1,619 @@ +import { Variants } from '@penpot/plugin-types'; + +const GRID = [5, 5]; + +penpot.ui.open('Plugin name', '', { + width: 500, + height: 600, +}); + +penpot.ui.onMessage<{ content: string; data: unknown }>(async (message) => { + if (message.content === 'close') { + penpot.closePlugin(); + } else if (message.content === 'ready') { + init(); + } else if (message.content === 'change-name') { + changeName(message.data as { id: string; name: string }); + } else if (message.content === 'create-rect') { + createRect(); + } else if (message.content === 'move-x') { + moveX(message.data as { id: string }); + } else if (message.content === 'move-y') { + moveY(message.data as { id: string }); + } else if (message.content === 'resize-w') { + resizeW(message.data as { id: string }); + } else if (message.content === 'resize-h') { + resizeH(message.data as { id: string }); + } else if (message.content === 'lorem-ipsum') { + loremIpsum(); + } else if (message.content === 'add-icon') { + addIcon(); + } else if (message.content === 'create-grid') { + createGrid(); + } else if (message.content === 'create-colors') { + createColors(); + } else if (message.content === 'increase-counter') { + increaseCounter(); + } else if (message.content === 'word-styles') { + wordStyles(); + } else if (message.content === 'rotate-selection') { + rotateSelection(); + } else if (message.content === 'create-image-data') { + const { data, mimeType } = message.data as { + data: Uint8Array; + mimeType: string; + }; + createImage(data, mimeType); + } else if (message.content === 'create-margins') { + createMargins(); + } else if (message.content === 'add-comment') { + addComment(); + } else if (message.content === 'export-file') { + exportFile(); + } else if (message.content === 'export-selected') { + exportSelected(); + } else if (message.content === 'resize-modal') { + resizeModal(); + } else if (message.content === 'save-localstorage') { + saveLocalStorage(); + } else if (message.content === 'transform-in-variant') { + transformInVariant(); + } else if (message.content === 'combine-selected-as-variants') { + combineSelectedAsVariants(); + } else if (message.content === 'add-variant') { + addVariant(); + } else if (message.content === 'add-property') { + addProperty(); + } else if (message.content === 'remove-property') { + removeProperty(message.data as number); + } else if (message.content === 'rename-property') { + const { pos, name } = message.data as { + pos: number; + name: string; + }; + renameProperty(pos, name); + } else if (message.content === 'set-variant-property') { + const { pos, value } = message.data as { + pos: number; + value: string; + }; + setVariantProperty(pos, value); + } else if (message.content === 'switch-variant') { + const { pos, value } = message.data as { + pos: number; + value: string; + }; + switchVariant(pos, value); + } +}); + +penpot.on('pagechange', () => { + const page = penpot.currentPage; + const shapes = page?.findShapes(); + + penpot.ui.sendMessage({ + type: 'page', + content: { page, shapes }, + }); +}); + +penpot.on('filechange', () => { + const file = penpot.currentFile; + + if (!file) { + return; + } + + penpot.ui.sendMessage({ + type: 'file', + content: { + id: file.id, + }, + }); +}); + +penpot.on('selectionchange', () => { + const selection = penpot.selection; + const data: string | null = + selection.length === 1 ? selection[0].getPluginData('counter') : null; + const counter = data ? parseInt(data, 10) : 0; + penpot.ui.sendMessage({ type: 'selection', content: { selection, counter } }); +}); + +penpot.on('themechange', (theme) => { + penpot.ui.sendMessage({ type: 'theme', content: theme }); +}); + +function init() { + const page = penpot.currentPage; + const file = penpot.currentFile; + + if (!page || !file) { + return; + } + + const selection = penpot.selection; + const data: string | null = + selection.length === 1 ? selection[0].getPluginData('counter') : null; + const counter = data ? parseInt(data, 10) : 0; + + penpot.ui.sendMessage({ + type: 'init', + content: { + name: page.name, + pageId: page.id, + fileId: file.id, + revn: file.revn, + theme: penpot.theme, + selection, + counter, + }, + }); +} + +function changeName(data: { id: string; name: string }) { + const shape = penpot.currentPage?.getShapeById('' + data.id); + if (shape) { + shape.name = data.name; + } +} + +function createRect() { + const shape = penpot.createRectangle(); + const center = penpot.viewport.center; + shape.x = center.x; + shape.y = center.y; + + penpot.on( + 'shapechange', + (s) => { + console.log('change', s.name, s.x, s.y); + }, + { + shapeId: shape.id, + }, + ); +} + +function moveX(data: { id: string }) { + const shape = penpot.currentPage?.getShapeById('' + data.id); + if (shape) { + shape.x += 100; + } +} + +function moveY(data: { id: string }) { + const shape = penpot.currentPage?.getShapeById('' + data.id); + if (shape) { + shape.y += 100; + } +} + +function resizeW(data: { id: string }) { + const shape = penpot.currentPage?.getShapeById('' + data.id); + if (shape) { + shape.resize(shape.width * 2, shape.height); + } +} + +function resizeH(data: { id: string }) { + const shape = penpot.currentPage?.getShapeById('' + data.id); + if (shape) { + shape.resize(shape.width, shape.height * 2); + } +} + +function loremIpsum() { + const selection = penpot.selection; + + for (const shape of selection) { + if (penpot.utils.types.isText(shape)) { + shape.characters = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam id mauris ut felis finibus congue. Ut odio ipsum, condimentum id tellus sit amet, dapibus sagittis ligula. Pellentesque hendrerit, nulla sit amet aliquet scelerisque, orci nunc commodo tellus, quis hendrerit nisl massa non tellus. + +Phasellus fringilla tortor elit, ac dictum tellus posuere sodales. Ut eget imperdiet ante. Nunc eros magna, tincidunt non finibus in, tempor elementum nunc. Sed commodo magna in arcu aliquam efficitur.`; + } else if (penpot.utils.types.isRectangle(shape)) { + const width = Math.ceil(shape.width); + const height = Math.ceil(shape.height); + penpot + .uploadMediaUrl( + 'placeholder', + `https://picsum.photos/${width}/${height}`, + ) + .then((data) => { + shape.fills = [{ fillOpacity: 1, fillImage: data }]; + }) + .catch((err) => console.error(err)); + } + } +} + +function addIcon() { + const iconStr = ` + + + + + + + +`; + const shape = penpot.createShapeFromSvg(iconStr); + if (shape) { + const center = penpot.viewport.center; + shape.x = center.x; + shape.y = center.y; + } +} + +function createGrid() { + const board = penpot.createBoard(); + board.name = 'Board Grid'; + + const viewport = penpot.viewport; + board.x = viewport.center.x - 150; + board.y = viewport.center.y - 200; + board.resize(300, 400); + + // create grid + const grid = board.addGridLayout(); + const [numRows, numCols] = GRID; + + for (let i = 0; i < numRows; i++) { + grid.addRow('auto'); + } + + for (let i = 0; i < numCols; i++) { + grid.addColumn('auto'); + } + + grid.alignItems = 'center'; + grid.justifyItems = 'start'; + grid.justifyContent = 'space-between'; + grid.alignContent = 'stretch'; + grid.rowGap = 1; + grid.columnGap = 2; + grid.verticalPadding = 3; + grid.horizontalPadding = 4; + + // create text + for (let row = 0; row < numRows; row++) { + for (let col = 0; col < numCols; col++) { + const text = penpot.createText(`${row + 1} - ${col + 1}`); + if (text) { + text.growType = 'auto-width'; + grid.appendChild(text, row + 1, col + 1); + } + } + } +} + +function createColors() { + const board = penpot.createBoard(); + board.name = 'Palette'; + + const viewport = penpot.viewport; + board.x = viewport.center.x - 150; + board.y = viewport.center.y - 200; + + const colors = penpot.library.local.colors.sort((a, b) => + a.name.toLowerCase() > b.name.toLowerCase() + ? 1 + : a.name.toLowerCase() < b.name.toLowerCase() + ? -1 + : 0, + ); + + if (colors.length === 0) { + // NO colors return + return; + } + + const cols = 3; + const rows = Math.ceil(colors.length / 3); + + const width = cols * 150 + Math.max(0, cols - 1) * 10 + 20; + const height = rows * 100 + Math.max(0, rows - 1) * 10 + 20; + + board.resize(width, height); + board.borderRadius = 8; + + // create grid + const grid = board.addGridLayout(); + + for (let i = 0; i < rows; i++) { + grid.addRow('auto'); + } + + for (let i = 0; i < cols; i++) { + grid.addColumn('auto'); + } + + grid.alignItems = 'center'; + grid.justifyItems = 'start'; + grid.justifyContent = 'stretch'; + grid.alignContent = 'stretch'; + grid.rowGap = 10; + grid.columnGap = 10; + grid.verticalPadding = 10; + grid.horizontalPadding = 10; + + // These properties are not mandatory, if not defined will apply the default values + board.shadows = [ + { + style: 'drop-shadow', + offsetX: 5, + offsetY: 5, + blur: 4, + spread: 5, + color: { + color: '#000000', + opacity: 0.3, + }, + }, + ]; + + // create text + for (let row = 0; row < rows; row++) { + for (let col = 0; col < cols; col++) { + const i = row * cols + col; + const color = colors[i]; + + if (i >= colors.length) { + return; + } + + const board = penpot.createBoard(); + grid.appendChild(board, row + 1, col + 1); + board.fills = [color.asFill()]; + board.strokes = [ + { strokeColor: '#000000', strokeOpacity: 0.3, strokeStyle: 'solid' }, + ]; + + if (board.layoutChild) { + board.layoutChild.horizontalSizing = 'fill'; + board.layoutChild.verticalSizing = 'fill'; + } + + const flex = board.addFlexLayout(); + flex.alignItems = 'center'; + flex.justifyContent = 'center'; + + const text = penpot.createText(color.name); + if (text) { + text.growType = 'auto-width'; + board.appendChild(text); + } + } + } +} + +function increaseCounter() { + const selection = penpot.selection; + const data: string | null = + selection.length === 1 ? selection[0].getPluginData('counter') : null; + let counter = data ? parseInt(data, 10) : 0; + counter++; + + selection[0].setPluginData('counter', '' + counter); + penpot.ui.sendMessage({ type: 'update-counter', content: { counter } }); +} + +function wordStyles() { + const selection = penpot.selection; + + if (selection.length >= 1 && penpot.utils.types.isText(selection[0])) { + const shape = selection[0]; + const text = shape.characters; + + const isSplit = (c: string) => !!c.match(/\W/); + + if (text.trim() === '') { + return; + } + + let lastWordStart = 0; + let gettingWord = !isSplit(text[0]); + let wordProcessed = 0; + + for (let i = 1; i < text.length; i++) { + if (gettingWord && isSplit(text[i])) { + if (wordProcessed % 2 === 0) { + const range = shape.getRange(lastWordStart, i); + range.fills = [{ fillColor: '#FF0000', fillOpacity: 1 }]; + range.textTransform = 'uppercase'; + range.fontSize = '20'; + } + + wordProcessed++; + gettingWord = false; + } else if (!gettingWord && !isSplit(text[i])) { + lastWordStart = i; + gettingWord = true; + } + } + } +} + +function rotateSelection() { + const selection = penpot.selection; + const center = penpot.utils.geometry.center(selection); + + selection.forEach((shape) => { + shape.rotate(10, center); + }); +} + +function createImage(data: Uint8Array, mimeType: string) { + penpot + .uploadMediaData('image', data, mimeType) + .then((data) => { + const shape = penpot.createRectangle(); + const x = penpot.viewport.center.x - data.width / 2; + const y = penpot.viewport.center.y - data.height / 2; + shape.resize(data.width, data.height); + shape.x = x; + shape.y = y; + shape.fills = [{ fillOpacity: 1, fillImage: data }]; + }) + .catch((err) => console.error(err)); +} + +function createMargins() { + const page = penpot.currentPage; + const selected = penpot.selection && penpot.selection[0]; + + if (selected && penpot.utils.types.isBoard(selected)) { + const { width, height } = selected; + selected.addRulerGuide('vertical', 10); + selected.addRulerGuide('vertical', width - 10); + selected.addRulerGuide('horizontal', 10); + selected.addRulerGuide('horizontal', height - 10); + } else if (page) { + console.log('bound', penpot.viewport.bounds); + const { x, y, width, height } = penpot.viewport.bounds; + page.addRulerGuide('vertical', x + 100); + page.addRulerGuide('vertical', x + width - 50); + page.addRulerGuide('horizontal', y + 100); + page.addRulerGuide('horizontal', y + height - 50); + } +} + +async function addComment() { + const shape = penpot.selection[0]; + + if (shape) { + const content = shape.name + ' - ' + Date.now(); + const cthr = await penpot.currentPage?.findCommentThreads(); + const th = cthr && cthr[0]; + + if (th) { + const comms = await th.findComments(); + const first = comms && comms[0]; + if (first) { + console.log('Reply to thread', content); + th.reply(content); + } + } else { + console.log('Create new thread', content); + await penpot.currentPage?.addCommentThread(content, shape.center); + } + } +} + +async function exportFile() { + const data = await penpot.currentFile?.export('penpot'); + + if (data) { + penpot.ui.sendMessage({ + type: 'start-download', + name: 'Export.penpot', + content: data, + }); + } +} + +async function exportSelected() { + const selection = await penpot.selection[0]; + + if (selection) { + let data = await selection.export({ type: 'png', skipChildren: true }); + penpot.ui.sendMessage({ + type: 'start-download', + name: 'export.png', + content: data, + }); + } +} + +async function resizeModal() { + penpot.ui.resize(1920, 1080); +} + +async function saveLocalStorage() { + let oldvalue = penpot.localStorage.getItem('test'); + let newvalue = oldvalue ? parseInt(oldvalue, 10) + 1 : 1; + console.log(newvalue); + penpot.localStorage.setItem('test', newvalue); +} + +function getVariantsFromSelection(): Variants | null { + const shape = penpot.selection?.[0]; + if (!shape) return null; + + if (penpot.utils.types.isVariantContainer(shape)) { + return shape.variants; + } else { + const component = shape.component(); + if (component && penpot.utils.types.isVariantComponent(component)) { + return component.variants; + } + } + return null; +} + +function transformInVariant() { + const component = penpot.selection?.[0].component(); + + if (component && !component.isVariant()) { + component.transformInVariant(); + } +} + +function combineSelectedAsVariants() { + if (penpot.selection) { + const ids: string[] = penpot.selection.map((item) => item.id); + penpot.selection[0]?.combineAsVariants(ids); + } +} + +function addVariant() { + const shape = penpot.selection?.[0]; + if (penpot.utils.types.isVariantContainer(shape)) { + shape.variants?.addVariant(); + } +} + +function addProperty() { + getVariantsFromSelection()?.addProperty(); +} + +function removeProperty(pos: number) { + getVariantsFromSelection()?.removeProperty(pos); +} + +function renameProperty(pos: number, name: string) { + getVariantsFromSelection()?.renameProperty(pos, name); +} + +function setVariantProperty(pos: number, value: string) { + const component = penpot.selection && penpot.selection[0].component(); + + if (component && penpot.utils.types.isVariantComponent(component)) { + component.setVariantProperty(pos, value); + } +} + +function switchVariant(pos: number, value: string) { + const shape = penpot.selection && penpot.selection[0]; + + if (shape?.isVariantHead()) { + shape.switchVariant(pos, value); + } +} diff --git a/plugins/apps/poc-state-plugin/src/styles.css b/plugins/apps/poc-state-plugin/src/styles.css new file mode 100644 index 0000000000..90d4ee0072 --- /dev/null +++ b/plugins/apps/poc-state-plugin/src/styles.css @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/plugins/apps/poc-state-plugin/tsconfig.app.json b/plugins/apps/poc-state-plugin/tsconfig.app.json new file mode 100644 index 0000000000..936913d9af --- /dev/null +++ b/plugins/apps/poc-state-plugin/tsconfig.app.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.d.ts"], + "exclude": ["src/**/*.test.ts", "src/**/*.spec.ts"] +} diff --git a/plugins/apps/poc-state-plugin/tsconfig.editor.json b/plugins/apps/poc-state-plugin/tsconfig.editor.json new file mode 100644 index 0000000000..b927bb69fc --- /dev/null +++ b/plugins/apps/poc-state-plugin/tsconfig.editor.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*.ts"], + "compilerOptions": { + "types": ["node"] + } +} diff --git a/plugins/apps/poc-state-plugin/tsconfig.json b/plugins/apps/poc-state-plugin/tsconfig.json new file mode 100644 index 0000000000..4c48587cfe --- /dev/null +++ b/plugins/apps/poc-state-plugin/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "es2022", + "useDefineForClassFields": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.editor.json" + }, + { + "path": "./tsconfig.plugin.json" + } + ], + "extends": "../../tsconfig.base.json", + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/plugins/apps/poc-state-plugin/tsconfig.plugin.json b/plugins/apps/poc-state-plugin/tsconfig.plugin.json new file mode 100644 index 0000000000..961987f7a1 --- /dev/null +++ b/plugins/apps/poc-state-plugin/tsconfig.plugin.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": [] + }, + "files": ["src/plugin.ts"], + "include": ["../../libs/plugin-types/index.d.ts"] +} diff --git a/plugins/apps/rename-layers-plugin/eslint.config.js b/plugins/apps/rename-layers-plugin/eslint.config.js new file mode 100644 index 0000000000..7aa90c2ab0 --- /dev/null +++ b/plugins/apps/rename-layers-plugin/eslint.config.js @@ -0,0 +1,51 @@ +import baseConfig from '../../eslint.config.js'; +import { compat } from '../../eslint.base.config.js'; + +export default [ + ...baseConfig, + ...compat + .config({ + extends: [ + 'plugin:@nx/angular', + 'plugin:@angular-eslint/template/process-inline-templates', + ], + }) + .map((config) => ({ + ...config, + files: ['**/*.ts'], + rules: { + '@angular-eslint/directive-selector': [ + 'error', + { + type: 'attribute', + prefix: 'app', + style: 'camelCase', + }, + ], + '@angular-eslint/component-selector': [ + 'error', + { + type: 'element', + prefix: 'app', + style: 'kebab-case', + }, + ], + }, + })), + ...compat + .config({ extends: ['plugin:@nx/angular-template'] }) + .map((config) => ({ + ...config, + files: ['**/*.html'], + rules: {}, + })), + { ignores: ['**/assets/*.js'] }, + { + languageOptions: { + parserOptions: { + project: './tsconfig.*?.json', + tsconfigRootDir: import.meta.dirname, + }, + }, + }, +]; diff --git a/plugins/apps/rename-layers-plugin/project.json b/plugins/apps/rename-layers-plugin/project.json new file mode 100644 index 0000000000..9a4e67c5be --- /dev/null +++ b/plugins/apps/rename-layers-plugin/project.json @@ -0,0 +1,79 @@ +{ + "name": "rename-layers-plugin", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "prefix": "app", + "sourceRoot": "apps/rename-layers-plugin/src", + "tags": ["type:plugin"], + "targets": { + "build": { + "executor": "@angular-devkit/build-angular:application", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/apps/rename-layers-plugin", + "index": "apps/rename-layers-plugin/src/index.html", + "browser": "apps/rename-layers-plugin/src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "apps/rename-layers-plugin/tsconfig.app.json", + "assets": [ + "apps/rename-layers-plugin/src/favicon.ico", + "apps/rename-layers-plugin/src/assets" + ], + "styles": [ + "libs/plugins-styles/src/lib/styles.css", + "apps/rename-layers-plugin/src/styles.css" + ], + "optimization": { + "scripts": true, + "styles": true, + "fonts": false + }, + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production", + "dependsOn": ["buildPlugin"] + }, + "serve": { + "executor": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "rename-layers-plugin:build:production" + }, + "development": { + "buildTarget": "rename-layers-plugin:build:development", + "host": "0.0.0.0", + "port": 4307 + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "executor": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "rename-layers-plugin:build" + } + } + } +} diff --git a/plugins/apps/rename-layers-plugin/src/app/app.component.css b/plugins/apps/rename-layers-plugin/src/app/app.component.css new file mode 100644 index 0000000000..869adca5e7 --- /dev/null +++ b/plugins/apps/rename-layers-plugin/src/app/app.component.css @@ -0,0 +1,124 @@ +.wrapper { + height: 100vh; + display: flex; + flex-direction: column; +} + +.nav-tabs { + background-color: var(--background-secondary); + border-radius: var(--spacing-8); + display: flex; + margin-block-start: var(--spacing-24); + + & .tab { + background-color: var(--background-secondary); + border: 2px solid transparent; + color: var(--foreground-secondary); + font-size: var(--font-size-s); + padding-inline: var(--spacing-8); + + &.active { + background-color: var(--db-quaternary); + border: 2px solid var(--background-secondary); + color: var(--accent-primary); + } + } +} + +.explanation { + margin-block-end: var(--spacing-8); +} +.form { + display: flex; + flex-direction: column; + flex-grow: 1; + padding-block-start: var(--spacing-8); +} + +.form-group { + margin-block-end: var(--spacing-8); +} + +.input, +button { + inline-size: 100%; +} + +[data-appearance='primary'].btn-feedback { + background-color: var(--accent-tertiary); + border: 2px solid var(--accent-tertiary); +} + +.icon-btn { + margin: auto; + .stroke { + stroke: var(--db-secondary); + } +} + +::placeholder { + color: var(--foreground-secondary); +} + +.no-match { + border-bottom: 1px solid var(--background-quaternary); + padding-block-end: var(--spacing-8); +} + +.preview-list { + background-color: var(--background-tertiary); + border-radius: var(--spacing-8); + block-size: 1px; + font-size: var(--font-size-s); + margin-block-start: var(--spacing-8); + overflow: auto; + padding: var(--spacing-8); + flex-grow: 1; + + & .preview-item { + align-items: center; + display: grid; + grid-template-columns: 33% 7% 60%; + } + + ::ng-deep .highlight { + background-color: var(--accent-tertiary); + color: var(--foreground-primary); + opacity: 70%; + } + + & .original, + & .result { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .result { + margin-inline-start: var(--spacing-4); + } +} + +.preview { + margin-block-start: var(--spacing-24); +} + +:host[data-theme='light'] { + .nav-tabs { + background-color: var(--lb-tertiary); + + & .tab { + background-color: var(--lb-tertiary); + + &.active { + background-color: var(--lb-primary); + } + } + } + + .icon-btn { + .stroke { + stroke: var(--lb-primary); + } + } +} diff --git a/plugins/apps/rename-layers-plugin/src/app/app.component.html b/plugins/apps/rename-layers-plugin/src/app/app.component.html new file mode 100644 index 0000000000..3eb9d31629 --- /dev/null +++ b/plugins/apps/rename-layers-plugin/src/app/app.component.html @@ -0,0 +1,144 @@ + + + + + + + +
+ + +
+

+ Select layers to rename (otherwise it will apply to all layers) and enter + the text you want to add. +

+
+ + +
+ +

Previsualization:

+
    +
  • + {{ preview.name }} + + {{ + resultAddText(preview) + }} +
  • +
+
+ +
+

+ Select layers to rename (otherwise it will apply to all layers) and enter + the replacement text. +

+
+ + +
+
+ + +
+ +

Previsualization:

+
    +
  • + No matches found +
  • +
  • + + + {{ + resultReplaceText(preview.name) + }} +
  • +
+
+
diff --git a/plugins/apps/rename-layers-plugin/src/app/app.component.ts b/plugins/apps/rename-layers-plugin/src/app/app.component.ts new file mode 100644 index 0000000000..bc6fc72c59 --- /dev/null +++ b/plugins/apps/rename-layers-plugin/src/app/app.component.ts @@ -0,0 +1,148 @@ +import { Component, ElementRef, ViewChild, inject } from '@angular/core'; +import { ActivatedRoute, RouterModule } from '@angular/router'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { CommonModule } from '@angular/common'; +import type { + PluginMessageEvent, + ReplaceText, + ThemePluginEvent, +} from '../app/model'; +import { filter, fromEvent, map, merge, take } from 'rxjs'; +import { FormsModule } from '@angular/forms'; +import { Shape } from '@penpot/plugin-types'; + +@Component({ + imports: [RouterModule, CommonModule, FormsModule], + selector: 'app-root', + templateUrl: './app.component.html', + styleUrl: './app.component.css', + host: { + '[attr.data-theme]': 'theme()', + }, +}) +export class AppComponent { + @ViewChild('searchElement') public searchElement!: ElementRef; + @ViewChild('addElement') public addElement!: ElementRef; + + route = inject(ActivatedRoute); + messages$ = fromEvent>(window, 'message'); + public textToReplace: ReplaceText = { + search: '', + replace: '', + }; + public addText = '[Original layer name]'; + public tab: 'add' | 'replace' = 'add'; + public btnFeedback = false; + + constructor() { + this.sendMessage({ type: 'ready' }); + } + + initialTheme$ = this.route.queryParamMap.pipe( + map((params) => params.get('theme')), + filter((theme) => !!theme), + take(1), + ); + + theme = toSignal( + merge( + this.initialTheme$, + this.messages$.pipe( + filter((event) => event.data.type === 'theme'), + map((event) => { + return (event.data as ThemePluginEvent).content; + }), + ), + ), + ); + + previewList = toSignal( + this.messages$.pipe( + filter( + (event) => + event.data.type === 'init' || event.data.type === 'selection', + ), + map((event) => { + if (event.data.type === 'init') { + return event.data.content.selection; + } else if (event.data.type === 'selection') { + return event.data.content.selection; + } + + return []; + }), + ), + { + initialValue: [], + }, + ); + + public updateText() { + if (this.tab === 'replace') { + this.sendMessage({ type: 'replace-text', content: this.textToReplace }); + this.handleBtnFeedback(); + this.searchElement.nativeElement.focus(); + this.resetForm(); + } else { + const elementsToUpdate = this.previewList().map((item) => { + return { + current: item.name, + new: this.resultAddText(item), + }; + }); + this.sendMessage({ type: 'add-text', content: elementsToUpdate }); + this.handleBtnFeedback(); + this.addElement.nativeElement.focus(); + this.resetForm(); + } + } + + public previewReplace() { + this.sendMessage({ + type: 'preview-replace-text', + content: this.textToReplace, + }); + } + + public resultReplaceText(text: string) { + return text.replace(this.textToReplace.search, this.textToReplace.replace); + } + + public highlightMatch(text: string) { + if (this.textToReplace.search) { + return text.replace( + this.textToReplace.search, + `${this.textToReplace.search}`, + ); + } else { + return text; + } + } + + public selectTab(tab: 'add' | 'replace') { + this.tab = tab; + this.resetForm(); + } + + public resetForm() { + this.textToReplace.search = ''; + this.textToReplace.replace = ''; + this.addText = '[Original layer name]'; + this.sendMessage({ type: 'ready' }); + } + + public handleBtnFeedback() { + this.btnFeedback = true; + setTimeout(() => { + this.btnFeedback = false; + }, 750); + } + + public resultAddText(shape: Shape) { + return this.addText.replace('[Original layer name]', shape.name); + } + + private sendMessage(message: PluginMessageEvent): void { + parent.postMessage(message, '*'); + } +} diff --git a/plugins/apps/rename-layers-plugin/src/app/app.config.ts b/plugins/apps/rename-layers-plugin/src/app/app.config.ts new file mode 100644 index 0000000000..ed404941f7 --- /dev/null +++ b/plugins/apps/rename-layers-plugin/src/app/app.config.ts @@ -0,0 +1,7 @@ +import { ApplicationConfig } from '@angular/core'; +import { provideRouter } from '@angular/router'; +import { appRoutes } from './app.routes'; + +export const appConfig: ApplicationConfig = { + providers: [provideRouter(appRoutes)], +}; diff --git a/plugins/apps/rename-layers-plugin/src/app/app.routes.ts b/plugins/apps/rename-layers-plugin/src/app/app.routes.ts new file mode 100644 index 0000000000..8762dfe2c6 --- /dev/null +++ b/plugins/apps/rename-layers-plugin/src/app/app.routes.ts @@ -0,0 +1,3 @@ +import { Route } from '@angular/router'; + +export const appRoutes: Route[] = []; diff --git a/plugins/apps/rename-layers-plugin/src/app/model.ts b/plugins/apps/rename-layers-plugin/src/app/model.ts new file mode 100644 index 0000000000..ea22b0fef0 --- /dev/null +++ b/plugins/apps/rename-layers-plugin/src/app/model.ts @@ -0,0 +1,57 @@ +import { Shape } from '@penpot/plugin-types'; + +export interface ReadyPluginEvent { + type: 'ready'; +} +export interface InitPluginEvent { + type: 'init'; + content: { + theme: string; + selection: Shape[]; + }; +} + +export interface SelectionPluginEvent { + type: 'selection'; + content: { + selection: Shape[]; + }; +} +export interface ThemePluginEvent { + type: 'theme'; + content: string; +} + +export interface ReplaceTextPluginEvent { + type: 'replace-text'; + content: ReplaceText; +} + +export interface AddTextPluginEvent { + type: 'add-text'; + content: AddText[]; +} + +export interface PreviewReplaceTextPluginEvent { + type: 'preview-replace-text'; + content: ReplaceText; +} + +export type PluginMessageEvent = + | ReadyPluginEvent + | InitPluginEvent + | SelectionPluginEvent + | ThemePluginEvent + | ReplaceTextPluginEvent + | AddTextPluginEvent + | PreviewReplaceTextPluginEvent; + +export interface ReplaceText { + search: string; + replace: string; +} + +export interface AddText { + current: string; + new: string; +} diff --git a/plugins/apps/rename-layers-plugin/src/assets/icon.png b/plugins/apps/rename-layers-plugin/src/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f7269cb1adb9e455b077a72e84c5d8f2a372a51e GIT binary patch literal 4567 zcma)gRajJA*!G@b1__an&LJeEQ#u9&L8KLdAw)vTL8WtOK^iHMl5V8C1xW?z?uG$| z&TroT=s)-lzJtBjzV=$z+E3m0{p=O0rJ+JZKuZ7s0Fml5B^~UD`tQQS#ojw*-}GY# z&?g-gI8Zu7zXbrKF{(-mdT!tMQthOoTP;~vK7eD0x+V7C?b zk2BpNi4vW@LkaF&tG^@ zfC{BNij@%776T<&{0+u)v;aZGD*!OP0RW2p|E9G+%K(|>wT;@oadD2PI-QYm1YnUk z^6>F&i?7TO)@k7Baxw*~WGv!x8#lDYgJT={k?iXnW)}AajOJzlHce7ye*D4KFxoHd zzQ=f9d%{eB(kE59Ew@eO`R^(@tjU{SNhCkE1cS?l*c{SmK+=USBo2wi*?XF3b|1EO zUGi}ExON8mEI0PKfCWNSCiT1DXx2vLv}#MKLiA_BoUQ!dN`t~1l-Gv9*Em1Vd!FRp zCmITAR_y!}I)X*;0>SHog~eJ0*a|rRrbgwB1LMr99eYf;B%++~~cPJC_EX=^ydXA8U?br!je!KaWPwaXk`wKOE)>hZlDBA}bP zE|ZOQ`FI!MUYQn#$T;*QJx>J;hmPa+ zA{NdLPgj}AeOLi~{s`JgBXMM%m|=TY^TU01k(TE;oK<+s3&gJ60f$`6^S;DnGGhTg zpNK!44=&Ojd8ksUWS2(5l4;OS>+s^yWkuNMtz=vc(}ipPyBe?$Gb(L?K?yB$t;VVc z9HK)SDGYCqsxyB+_Bbj!&-eWc&x{mGSqN+6hy4ARn~uRv(ItA%C%5<9d^}iZ+wt0Y zTCD`Kvg`@DhPi{B^d|9Cp2(6#B~dAba6s@A(o$o?|9~6pMLb^HBwjanF<&Uu8kd{v z%VmNE97Y?1=$~7dlQ4*YkWfjVB_GKcp;$_JmE;JglNFrSByxtQxP+#85r(Ax)#9fb zPqxb*=CUt6XOl9U{?(RFRXllE(5c#8_xd{zLJ3atYfNI)eT;qTsyE2u-mI}D$DGUc zc6x)M3N!pWACVGEQkBw|YOqW#1B5kS_lU8Vz$^pm%OR=^eJG|s>r#TxzjOtD$02`) zygqq!;Ac_fN6YH-ZkYR5Sr0cHkKIdy1^uRwN0NBCKw z`pe<&L{atCg{}`avDLuCM2PM*^_qZbQF>|aFOwTZ_1Dzl3?VsIj-%fJ2kVUW9TkG- zgQlUpc9n5h3_S8ge~!~hD24(+(v5atQRS?%RQ9$q{E50X#Nf|R|3!H97ON{{C_p|-(W!4 zV1G0UDckJUZ6=rieByUj^qeLMm%GF&fF}6@j--rd*FJu?xEsFgjT_@Ik7K%-mjJ*i z0(m=cOTz03BLo80#$m%ArRlrH)W7xS<;dr)NZh>17ue-@$ z(w6;!0igMJqAfN2gCXarV@2Y%H(GHm?iRtIDpZ%I&<*|T*wJD0X3z##yD*tG26_NN zfac=F8#wh`M}M5ZHBB5ja&xw0k3g=xTfH_@lhb_^8lKDc7Il5?^`o@(L8G)7a$a5T z?i$lnh1yzq=`?9CI%rvw-Zj6Z>`Hvb34ig}Lwcs?rDUw214(O|VBo4)@Z_G0K+0gD zpC4!!U0G4Fd2@A!*_M*(!~I=z#{fgTTCm>u57;})**`B8!uT>WGEj@(yxi;=c3oUX z_nx!!4eMZTZJb_sE2?l+w|F`X1P0L>s>KoOkjram4CS93V|Nz!z7#>PD6_R?=d_PD z`BEDT7AbN;d)A|W{t${DsB)GZ&bp0xrUtm8=buiL8e`tMeEReWYS$pIhU)FF((90m zC{6mR6=s+CH-7`@N?I6g#Lqd`zI(>@2-O)v9AzWDwzjr;dvkS7yon!8W_CotD|*JH ztgrr&^J(N;!fzjJ1WG&~m_8w)Q^kkz^G8)z2n!4Ul*RnbRQyq8Li!lhTV_`fcqb;A zb;qbis*pvfz@Q<7WqY=VCs9g5;Qy>2o|_w#Y_Xf*J6rzs#h{3TgCiu{=5Uz{9st`$ z`{Fa(1|_hJ+B3rfleTDZpJYa-Z85=xz`uuvtV%W$O*}#clhvcs(uNEb=H})cPj?N5 zdo*!bKWpIUkjV;4a`6AtS$#;kRA1tuCiRj_^`BfI+Yzw0w@1RnRA!#EbY^>Zd$V6$ z%rk9U?LTGzN`gM}O{=D=Y9JkM285J^tbrxvDNCXcT53^y1Dq>OH4rEKRT*M z3&7aeAme4Ge=5#4{-kp>G&DfywfrWocVk8R|1vW(?=B=*Sp(K^ z-+k-8EgP65H3o8Wa`LmX0-U{e#!EWcy?SFG4P>jvz4qlGY?D%=0{AdgG&K0!uZpRy z;H20?UTbXf|4 zNCqk82E=ZzROxC|uZ4dQAytKc(T^W29k$g+B7N3$+R*6K)WL?^+4@h(G{RPn%70nk z;s8KMCx}DiJIP$?1?!KwDpTJZim{1_O0To=5+jut=$zc#5d{T>;+3?*&q8iWJ9x{5 zn^-p@zC9tv$M>tYn;3yYp`Beu#>Nrv=Nf|62a;F*ZJ-AR)Sp^g=jkit8kPi?mkTK8 z{qt)#GqV~ zeDk8YEI=Xi`H-ch<-4296SYi6J7^Rrl3v1}VlD;QBEh%dAe3x&dwnr*vNI79T2Nek zUsP1ouh-(pB_9CfNp_cPMQER?tJAxd+tki1tq-O!;`GhbBD1iC`KvdM!@bOj;4#oR z_u%5k$8d0A?<((5YG^lk-|1#l}d^bBUn4t-SQ3TL}mSpg+VoaVSiA9~Z}dwl3z8 z|2<;Hw)#&SY)tnxzKfHpsi`4So*=sk>T7B!Z>}+ankX9}jjCtpg`QV?CZ2nuyR37s zmns+~BqU@n?CW5T7MQSFubY#JeVc!|Z+v@PXHv|-;$G+Fn)-Jny}i9v!|yB@__?^4 zC8eaAB}Cg+gpOZFx(8s3idgm>pgV|x`@Or@XV&zcB)HJFTQNJAD=I9Q{7W?ZI1THR`?V``s zkr-J)EWtS5Ub_#od_;QU22}t!I5?;oiU<;Ls>TLphp7FkYju4+tRY|nTkk%@yn0x~ zh;skS)3iPhS9FU4)x`?c?U~Gv%+7`z8X5*Od=jVE($bP|x;dTE%z?0vG{MPmfKyuA6%%?z}3blS$o3=M9F zEZRm!{WfYJKYpC8v>IIY_GLzb7lrQ7O_&E|Q4m2v!E*a4q4gdnUwW5Mo*o_<<>k?f zg|Lr)UqIVCJ24u0E02WViqI}$C8%_`Ft8<%s?u$xo5<*T+tA600~Vlkwf}T)1}fNIP*C9X`Ze{=xu)DrVE4=tw-T=zme16+ zwPSW>kgd)u-GdymRH#9#PF!Ew2;92ud9SwWRPTf+*~AZzp1x8es z7+mjiZDD0aKtn=S(mCU-hQgZyODDYR+_XD!sOG|68qpDQ+zA4kdV-3k$zc2%f&j~lTvbowzl8t z?o{Va+!sw=`RC6GJ4%iZPp_{CnoWosUD3IZA3uKG(d4p6E0}QO28a03(9k$}c{SN# zOS4$A8{2>Mx-NJpcI4D~`>~lk09*6Jwv85rv667YIADO{iWypJ4H)yr8=7C)Tv$zicZPm%pvsiUg7@<7; z`0Na4|Ca#(=;o>~J$3$nOGw-{-x&K7(%XB%CK?R2n~c^&?uYI4Et2fGnWPfu&9sSy-83R7~1`EPIAiX;%F*Votc zwJ_cVM?)7u2*$SewTkZU638i75FFGK#pK$0d%4qeruAD8)rD0b3qI49T{R62%Ipw$ z4ZujUO~j1V$$_C%DXz>EYpl5_O^`a)BeI7Nx3I#rJ*IC;v1ZhboiM{vF8Tgk@QOm# zFv_IN`q)DzFepfHcz9S~I?)_2be5ES@wbB6|K$+le>vkAx&tj!{eAN}o5us&;{d8p LHIz!>X8!*JT|d1! literal 0 HcmV?d00001 diff --git a/plugins/apps/rename-layers-plugin/src/assets/manifest.json b/plugins/apps/rename-layers-plugin/src/assets/manifest.json new file mode 100644 index 0000000000..65195c2358 --- /dev/null +++ b/plugins/apps/rename-layers-plugin/src/assets/manifest.json @@ -0,0 +1,7 @@ +{ + "name": "Rename layers plugin", + "description": "Change the name of one or several layers", + "code": "/assets/plugin.js", + "icon": "/assets/icon.png", + "permissions": ["content:read", "content:write"] +} diff --git a/plugins/apps/rename-layers-plugin/src/favicon.ico b/plugins/apps/rename-layers-plugin/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 + + + + rename-layers-plugin + + + + + + + + diff --git a/plugins/apps/rename-layers-plugin/src/main.ts b/plugins/apps/rename-layers-plugin/src/main.ts new file mode 100644 index 0000000000..8882c4517f --- /dev/null +++ b/plugins/apps/rename-layers-plugin/src/main.ts @@ -0,0 +1,7 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { AppComponent } from './app/app.component'; + +bootstrapApplication(AppComponent, appConfig).catch((err) => + console.error(err), +); diff --git a/plugins/apps/rename-layers-plugin/src/plugin.ts b/plugins/apps/rename-layers-plugin/src/plugin.ts new file mode 100644 index 0000000000..cac2382500 --- /dev/null +++ b/plugins/apps/rename-layers-plugin/src/plugin.ts @@ -0,0 +1,87 @@ +import { PluginMessageEvent } from './app/model'; + +penpot.ui.open('RENAME LAYER PLUGIN', `?theme=${penpot.theme}`, { + width: 290, + height: 550, +}); + +penpot.on('themechange', (theme) => { + penpot.ui.sendMessage({ type: 'theme', content: theme }); +}); + +penpot.on('shapechange', () => { + resetSelection(); +}); + +penpot.ui.onMessage((message) => { + if (message.type === 'ready') { + resetSelection(); + } else if (message.type === 'replace-text') { + const blockId = penpot.history.undoBlockBegin(); + + const shapes = getShapes(); + const shapesToUpdate = shapes?.filter((shape) => { + return shape.name.includes(message.content.search); + }); + shapesToUpdate?.forEach((shape) => { + shape.name = shape.name.replace( + // eslint-disable-next-line + message.content.search, + message.content.replace, + ); + }); + updateReplaceTextPreview(message.content.search); + + penpot.history.undoBlockFinish(blockId); + } else if (message.type === 'preview-replace-text') { + updateReplaceTextPreview(message.content.search); + } else if (message.type === 'add-text') { + const blockId = penpot.history.undoBlockBegin(); + + const currentNames = message.content.map((shape) => shape.current); + const shapes = getShapes(); + const shapesToUpdate = shapes?.filter((shape) => + currentNames.includes(shape.name), + ); + shapesToUpdate?.forEach((shape) => { + const newText = message.content.find((it) => it.current === shape.name); + return (shape.name = newText?.new ?? shape.name); + }); + + penpot.history.undoBlockFinish(blockId); + + resetSelection(); + } +}); + +function getShapes() { + return penpot.selection.length + ? penpot.selection + : penpot.currentPage?.findShapes(); +} + +function resetSelection() { + penpot.ui.sendMessage({ + type: 'selection', + content: { + selection: getShapes(), + }, + }); +} + +function updateReplaceTextPreview(search: string) { + if (search) { + const shapes = getShapes(); + const shapesToUpdate = shapes?.filter((shape) => { + return shape.name.includes(search); + }); + penpot.ui.sendMessage({ + type: 'selection', + content: { + selection: shapesToUpdate, + }, + }); + } else { + resetSelection(); + } +} diff --git a/plugins/apps/rename-layers-plugin/src/styles.css b/plugins/apps/rename-layers-plugin/src/styles.css new file mode 100644 index 0000000000..90d4ee0072 --- /dev/null +++ b/plugins/apps/rename-layers-plugin/src/styles.css @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/plugins/apps/rename-layers-plugin/tsconfig.app.json b/plugins/apps/rename-layers-plugin/tsconfig.app.json new file mode 100644 index 0000000000..fff4a41d44 --- /dev/null +++ b/plugins/apps/rename-layers-plugin/tsconfig.app.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.d.ts"], + "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] +} diff --git a/plugins/apps/rename-layers-plugin/tsconfig.editor.json b/plugins/apps/rename-layers-plugin/tsconfig.editor.json new file mode 100644 index 0000000000..4ee6393404 --- /dev/null +++ b/plugins/apps/rename-layers-plugin/tsconfig.editor.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*.ts"], + "compilerOptions": { + "types": [] + } +} diff --git a/plugins/apps/rename-layers-plugin/tsconfig.json b/plugins/apps/rename-layers-plugin/tsconfig.json new file mode 100644 index 0000000000..4c48587cfe --- /dev/null +++ b/plugins/apps/rename-layers-plugin/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "es2022", + "useDefineForClassFields": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.editor.json" + }, + { + "path": "./tsconfig.plugin.json" + } + ], + "extends": "../../tsconfig.base.json", + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/plugins/apps/rename-layers-plugin/tsconfig.plugin.json b/plugins/apps/rename-layers-plugin/tsconfig.plugin.json new file mode 100644 index 0000000000..961987f7a1 --- /dev/null +++ b/plugins/apps/rename-layers-plugin/tsconfig.plugin.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": [] + }, + "files": ["src/plugin.ts"], + "include": ["../../libs/plugin-types/index.d.ts"] +} diff --git a/plugins/apps/table-plugin/eslint.config.js b/plugins/apps/table-plugin/eslint.config.js new file mode 100644 index 0000000000..7aa90c2ab0 --- /dev/null +++ b/plugins/apps/table-plugin/eslint.config.js @@ -0,0 +1,51 @@ +import baseConfig from '../../eslint.config.js'; +import { compat } from '../../eslint.base.config.js'; + +export default [ + ...baseConfig, + ...compat + .config({ + extends: [ + 'plugin:@nx/angular', + 'plugin:@angular-eslint/template/process-inline-templates', + ], + }) + .map((config) => ({ + ...config, + files: ['**/*.ts'], + rules: { + '@angular-eslint/directive-selector': [ + 'error', + { + type: 'attribute', + prefix: 'app', + style: 'camelCase', + }, + ], + '@angular-eslint/component-selector': [ + 'error', + { + type: 'element', + prefix: 'app', + style: 'kebab-case', + }, + ], + }, + })), + ...compat + .config({ extends: ['plugin:@nx/angular-template'] }) + .map((config) => ({ + ...config, + files: ['**/*.html'], + rules: {}, + })), + { ignores: ['**/assets/*.js'] }, + { + languageOptions: { + parserOptions: { + project: './tsconfig.*?.json', + tsconfigRootDir: import.meta.dirname, + }, + }, + }, +]; diff --git a/plugins/apps/table-plugin/project.json b/plugins/apps/table-plugin/project.json new file mode 100644 index 0000000000..9ac5758270 --- /dev/null +++ b/plugins/apps/table-plugin/project.json @@ -0,0 +1,78 @@ +{ + "name": "table-plugin", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "prefix": "app", + "sourceRoot": "apps/table-plugin/src", + "tags": ["type:plugin"], + "targets": { + "build": { + "executor": "@angular-devkit/build-angular:application", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/apps/table-plugin", + "index": "apps/table-plugin/src/index.html", + "browser": "apps/table-plugin/src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "apps/table-plugin/tsconfig.app.json", + "assets": [ + "apps/table-plugin/src/favicon.ico", + "apps/table-plugin/src/assets" + ], + "styles": [ + "libs/plugins-styles/src/lib/styles.css", + "apps/table-plugin/src/styles.css" + ], + "optimization": { + "scripts": true, + "styles": true, + "fonts": false + }, + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production", + "dependsOn": ["buildPlugin"] + }, + "serve": { + "executor": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "table-plugin:build:production" + }, + "development": { + "buildTarget": "table-plugin:build:development", + "port": 4306 + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "executor": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "table-plugin:build" + } + } + } +} diff --git a/plugins/apps/table-plugin/src/app/app.component.css b/plugins/apps/table-plugin/src/app/app.component.css new file mode 100644 index 0000000000..367cab6866 --- /dev/null +++ b/plugins/apps/table-plugin/src/app/app.component.css @@ -0,0 +1,156 @@ +.text { + margin-block-start: var(--spacing-24); +} + +.input-container { + background-color: var(--db-tertiary); + border-radius: var(--spacing-8); + color: #8a9ca2; + font-size: var(--font-size-s); + font-weight: var(--font-weight-bold); + line-height: var(--font-line-height-s); + margin-block-start: var(--spacing-8); + padding: var(--spacing-8) var(--spacing-24) var(--spacing-8) var(--spacing-24); + text-transform: uppercase; + &:hover { + cursor: pointer; + } +} +.inputfile { + block-size: 1px; + border: 0; + clip: rect(1px 1px 1px 1px); + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(50%); + inline-size: 1px; + margin: 0; + overflow: hidden; + padding: 0; + position: absolute; + white-space: nowrap; +} + +.inputfile + label { + display: block; + text-align: center; + + &:hover { + cursor: pointer; + } +} + +hr { + border-block-end: 2px solid var(--background-quaternary); + margin-block: var(--spacing-24); +} + +.table-grid { + background-color: var(--db-tertiary); + display: grid; + grid-template-columns: repeat(8, auto); + grid-template-rows: repeat(6, auto); + border-radius: var(--spacing-8); + padding: 10px; + margin-block: var(--spacing-16) var(--spacing-20); +} + +.cell { + align-items: center; + block-size: 26px; + display: flex; + justify-content: center; +} + +.square { + block-size: 22px; + border: 1px solid var(--df-secondary); + border-radius: var(--spacing-4); + display: block; + inline-size: 22px; + + &.active { + background-color: var(--da-primary); + } + + &:hover { + background-color: var(--da-tertiary); + cursor: pointer; + } +} + +.checkbox-container { + margin-block-end: var(--spacing-12); +} + +.new-table { + align-items: center; + block-size: 22px; + display: flex; + justify-content: space-between; + margin-block-end: var(--spacing-12); + + & .text { + margin-block-start: 0; + } +} + +.tag { + border: 1px solid var(--accent-primary); + border-radius: var(--spacing-4); + color: var(--accent-primary); + font-size: var(--font-size-s); + font-weight: var(--font-weight-bold); + line-height: var(--font-line-height-s); + padding: var(--spacing-4); +} + +.error { + align-items: center; + background-color: var(--error-950); + border: 1px solid var(--error-700); + border-radius: var(--spacing-8); + display: flex; + margin-block-start: var(--spacing-8); + padding: var(--spacing-8); + + & .close-icon:hover { + cursor: pointer; + } + + & .message { + color: var(--lb-primary); + margin-inline-start: var(--spacing-8); + } +} + +:host[data-theme='light'] { + & .input-container { + background-color: var(--la-primary); + color: var(--lb-primary); + } + + & .table-grid { + background-color: var(--lb-quaternary); + } + + & .square { + border: 1px solid var(--df-secondary); + + &.active { + background-color: var(--la-tertiary); + } + + &:hover { + background-color: var(--la-primary); + } + } + + & .error { + background-color: var(--error-200); + border: 1px solid var(--error-500); + + & .message { + color: var(--db-primary); + } + } +} diff --git a/plugins/apps/table-plugin/src/app/app.component.html b/plugins/apps/table-plugin/src/app/app.component.html new file mode 100644 index 0000000000..1d78bd3256 --- /dev/null +++ b/plugins/apps/table-plugin/src/app/app.component.html @@ -0,0 +1,93 @@ +
+

Import a data file (CSV)

+
+ close error + Something was wrong.
+ Make sure the formst is .csv
+
+
+ + +
+
+
+

Or create a new table

+ {{ selectedRow }} rows x {{ selectedColumn }} cols +
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+ + + +
+
diff --git a/plugins/apps/table-plugin/src/app/app.component.ts b/plugins/apps/table-plugin/src/app/app.component.ts new file mode 100644 index 0000000000..ca68a43612 --- /dev/null +++ b/plugins/apps/table-plugin/src/app/app.component.ts @@ -0,0 +1,182 @@ +import { Component, inject } from '@angular/core'; +import { ActivatedRoute, RouterModule } from '@angular/router'; +import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop'; +import { CommonModule } from '@angular/common'; +import type { + Cell, + PluginMessageEvent, + TableConfigEvent, + TableOptions, +} from '../app/model'; +import { filter, fromEvent, map, merge, take } from 'rxjs'; +import { FormBuilder, ReactiveFormsModule, FormGroup } from '@angular/forms'; + +@Component({ + imports: [RouterModule, CommonModule, ReactiveFormsModule], + selector: 'app-root', + templateUrl: './app.component.html', + styleUrl: './app.component.css', + host: { + '[attr.data-theme]': 'theme()', + }, +}) +export class AppComponent { + private readonly fb = inject(FormBuilder); + + public table: string[][] = []; + public cells = [...Array(48).keys()]; + public selectedRow = 0; + public selectedColumn = 0; + public selectedCell: Cell | undefined; + public fileError = false; + + public form: FormGroup = this.fb.group({ + filledHeaderRow: [false], + filledHeaderColumn: [false], + borders: [false], + alternateRows: [false], + }); + + route = inject(ActivatedRoute); + messages$ = fromEvent>(window, 'message'); + + initialTheme$ = this.route.queryParamMap.pipe( + map((params) => params.get('theme')), + filter((theme) => !!theme), + take(1), + ); + + theme = toSignal( + merge( + this.initialTheme$, + this.messages$.pipe( + filter((event) => event.data.type === 'theme'), + map((event) => { + return event.data.content; + }), + ), + ), + ); + + constructor() { + this.initConfig(); + } + + onSelectFile(event: Event) { + const target = event.target as HTMLInputElement; + if ( + target.files && + target.files[0] && + target.files[0].type === 'text/csv' + ) { + var reader = new FileReader(); + reader.readAsText(target.files[0]); + reader.onload = (e) => { + this.table = (e?.target?.result as string) + ?.split(/\r?\n|\r|\n/g) + .map((it) => it.trim()) + .filter((it) => it !== '') + .map((it) => it.split(',').map((it) => (!it ? ' ' : it.trim()))); + + this.sendMessage({ + content: { + import: this.table, + type: 'import', + options: this.form.value, + }, + type: 'table', + }); + }; + } else { + this.fileError = true; + } + } + + createTable(cell: number) { + const data = this.getCellColRow(cell); + this.sendMessage({ + content: { + new: { column: data.column, row: data.row }, + type: 'new', + options: this.form.value, + }, + type: 'table', + }); + } + + setColRow(cell: number) { + this.clearError(); + this.selectedCell = this.getCellColRow(cell); + this.selectedColumn = this.selectedCell.column; + this.selectedRow = this.selectedCell.row; + } + + clearColRow() { + this.selectedCell = undefined; + this.selectedColumn = 0; + this.selectedRow = 0; + } + + clearError() { + this.fileError = false; + } + + getCellColRow(cell: number) { + return { + column: (cell % 8) + 1, + row: Math.floor(cell / 8) + 1, + }; + } + + private initConfig(): void { + this.messages$ + .pipe( + filter( + (event) => + event.data.type === 'tableconfig' && + event.data.content.type === 'retrieve', + ), + take(1), + map((event) => { + const data = (event.data as TableConfigEvent).content.options; + + return data; + }), + ) + .subscribe((data) => { + if (data) { + this.form.patchValue(data, { emitEvent: false }); + } else { + this.form.patchValue({ + filledHeaderRow: true, + filledHeaderColumn: false, + borders: true, + alternateRows: true, + }); + } + }); + + this.form.valueChanges + .pipe(takeUntilDestroyed()) + .subscribe((options: TableOptions) => { + this.sendMessage({ + type: 'tableconfig', + content: { + type: 'save', + options, + }, + }); + }); + + this.sendMessage({ + type: 'tableconfig', + content: { + type: 'retrieve', + }, + }); + } + + private sendMessage(message: PluginMessageEvent): void { + parent.postMessage(message, '*'); + } +} diff --git a/plugins/apps/table-plugin/src/app/app.config.ts b/plugins/apps/table-plugin/src/app/app.config.ts new file mode 100644 index 0000000000..ed404941f7 --- /dev/null +++ b/plugins/apps/table-plugin/src/app/app.config.ts @@ -0,0 +1,7 @@ +import { ApplicationConfig } from '@angular/core'; +import { provideRouter } from '@angular/router'; +import { appRoutes } from './app.routes'; + +export const appConfig: ApplicationConfig = { + providers: [provideRouter(appRoutes)], +}; diff --git a/plugins/apps/table-plugin/src/app/app.routes.ts b/plugins/apps/table-plugin/src/app/app.routes.ts new file mode 100644 index 0000000000..8762dfe2c6 --- /dev/null +++ b/plugins/apps/table-plugin/src/app/app.routes.ts @@ -0,0 +1,3 @@ +import { Route } from '@angular/router'; + +export const appRoutes: Route[] = []; diff --git a/plugins/apps/table-plugin/src/app/model.ts b/plugins/apps/table-plugin/src/app/model.ts new file mode 100644 index 0000000000..13e76538ca --- /dev/null +++ b/plugins/apps/table-plugin/src/app/model.ts @@ -0,0 +1,44 @@ +export interface InitPluginEvent { + type: 'init'; + content: { + theme: string; + }; +} + +export interface TableConfigEvent { + type: 'tableconfig'; + content: { + type: 'save' | 'retrieve'; + options?: TableOptions; + }; +} + +export interface TablePluginEvent { + type: 'table'; + content: { + import?: string[][]; + new?: Cell; + type: 'new' | 'import'; + options: TableOptions; + }; +} + +export interface ThemePluginEvent { + type: 'theme'; + content: string; +} + +export type PluginMessageEvent = + | InitPluginEvent + | TablePluginEvent + | ThemePluginEvent + | TableConfigEvent; + +export type Cell = { column: number; row: number }; + +export type TableOptions = { + filledHeaderRow: boolean; + filledHeaderColumn: boolean; + borders: boolean; + alternateRows: boolean; +}; diff --git a/plugins/apps/table-plugin/src/app/nx-welcome.component.ts b/plugins/apps/table-plugin/src/app/nx-welcome.component.ts new file mode 100644 index 0000000000..6422d80fd8 --- /dev/null +++ b/plugins/apps/table-plugin/src/app/nx-welcome.component.ts @@ -0,0 +1,984 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-nx-welcome', + standalone: true, + imports: [CommonModule], + template: ` + + +
+
+ +
+

+ Hello there, + Welcome table-plugin 👋 +

+
+ +
+
+

+ + + + You're up and running +

+ What's next? +
+
+ + + +
+
+ + + +
+

Next steps

+

Here are some things you can do with Nx:

+
+ + + + + Add UI library + +
# Generate UI lib
+nx g @nx/angular:lib ui
+# Add a component
+nx g @nx/angular:component ui/src/lib/button
+
+
+ + + + + View project details + +
nx show project table-plugin --web
+
+
+ + + + + View interactive project graph + +
nx graph
+
+
+ + + + + Run affected commands + +
# see what's been affected by changes
+nx affected:graph
+# run tests for current changes
+nx affected:test
+# run e2e tests for current changes
+nx affected:e2e
+
+
+

+ Carefully crafted with + + + +

+
+
+ `, + styles: [], + encapsulation: ViewEncapsulation.None, +}) +export class NxWelcomeComponent {} diff --git a/plugins/apps/table-plugin/src/assets/.gitkeep b/plugins/apps/table-plugin/src/assets/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugins/apps/table-plugin/src/assets/close.svg b/plugins/apps/table-plugin/src/assets/close.svg new file mode 100644 index 0000000000..b9f8c896a6 --- /dev/null +++ b/plugins/apps/table-plugin/src/assets/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/apps/table-plugin/src/assets/icon.png b/plugins/apps/table-plugin/src/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..422d2fd17e492ffe84328416fc31294f83787d40 GIT binary patch literal 1138 zcmV-&1daQNP)Px(EJ;K`RCt{2n%z$$RT##9ZKtIl6lGZ!5ZLZoSlsAlm2X^kH6~u0Xktt>@o&;Z zuZ%G!CSGYYG4Uh2F>xV_%Yv(dKnt}H*`;h-QrgaR+L?OM(r}?WXFxav=6BPiInSJD zo=(pDp3ZUQa=9v}7`JQ#vT*{CZ9q0o0J06p#tA^S0ogbK$TlFGQy+k`AJJxN2g5jC z9kj>ersG_*ZJn(EV(~}(GLs~`t=gXGC^*v^WNait^yxNXjZ1VhbnB-W3yYfv@pohl z5B4%X8W9>R^aLy}r5ZQi7d^|+3q7=-wg0#s7L|%gCR^m*+&U|(X=Y~E>FR7Da=z74 zD-^)wodf`v2RgWMJ<8Ob1o4%5RJD9?_x}TdfS3Nhc3yjR0Jl3vEWX9F8PRU_bULQ%w)9KBqoRMKe<1#r2n3zcCQ z{Pz0>ipR~wXoOgNi|n>aI$fZx?eQKh9Tf^X)Kd-xeXJxhD2l?fm-~forl@Mn{~4#d ztAp0o79maQQHJE&27S>8Ucu1j?k^Bu+2Y0V3pDvWlyrkkR<#VkGG4)8q>#r4ocfUOXPL08~xGv{5y7u?)bh)~@Pux$2*_O~-rhP6$n~ zxtZgW&n9{0#wDH^=oHe-{<_BZKhE>ko5M6WHwkGz{`5BKbe@Ju_LS4daO&3pCji+7 zWa9)N+kkBL)dys^i+ujYw9o{*8I0l7z-qw1 z^#QF<26^Z0F`)@|`+)1$`fc|CZ@fO}^Z|#B6M$?3vT*{CZ9q0oA0Tw~6O7Xb2wnXI z;{+hvfNY!qtOh6^59}#t!Jv8hO)AZdW*CsA9JlNa#?l=$#co`qPz}QHnahM|%^3m04{W@OgF0NkbX8LZD zg~d(E6_cUodxX#690iq%Njg*H+wT@g{8fAVGW7<4EXTGE=JbfT@>~}$ zzZ4Z3D;xm8(sGLFnKg1b?I8XRjkYr(Mn}#Qy?6-6?I4&rPn{(~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 + + + + table-plugin + + + + + + + + diff --git a/plugins/apps/table-plugin/src/main.ts b/plugins/apps/table-plugin/src/main.ts new file mode 100644 index 0000000000..8882c4517f --- /dev/null +++ b/plugins/apps/table-plugin/src/main.ts @@ -0,0 +1,7 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { AppComponent } from './app/app.component'; + +bootstrapApplication(AppComponent, appConfig).catch((err) => + console.error(err), +); diff --git a/plugins/apps/table-plugin/src/plugin.ts b/plugins/apps/table-plugin/src/plugin.ts new file mode 100644 index 0000000000..a426f1be95 --- /dev/null +++ b/plugins/apps/table-plugin/src/plugin.ts @@ -0,0 +1,243 @@ +import { GridLayout } from '@penpot/plugin-types'; +import { PluginMessageEvent, TablePluginEvent } from './app/model'; + +penpot.ui.open('TABLE PLUGIN', `?theme=${penpot.theme}`, { + width: 280, + height: 610, +}); + +penpot.ui.onMessage((message) => { + pluginData(message); + + if (message.type === 'table') { + let numRows = 0; + let numCols = 0; + if (message.content.type === 'import' && message.content.import) { + numRows = message.content.import.length; + numCols = message.content.import[0].length; + } else if (message.content.new) { + numRows = message.content.new.row; + numCols = message.content.new.column; + } + + const board = penpot.createBoard(); + board.name = 'Table'; + + const viewport = penpot.viewport; + board.x = viewport.center.x - 150; + board.y = viewport.center.y - 200; + board.resize(numCols * 160, numRows * 50); + board.borderRadius = 8; + + // create grid + const grid = board.addGridLayout(); + + for (let i = 0; i < numRows; i++) { + grid.addRow('flex', 1); + } + + for (let i = 0; i < numCols; i++) { + grid.addColumn('flex', 1); + } + + grid.alignItems = 'center'; + grid.justifyItems = 'start'; + grid.justifyContent = 'stretch'; + grid.alignContent = 'stretch'; + + // create text + for (let row = 0; row < numRows; row++) { + for (let col = 0; col < numCols; col++) { + if (numRows * numCols >= 25) { + createGroupCell(grid, numRows, numCols, row, col, message); + } else { + createFlexCell(grid, numRows, numCols, row, col, message); + } + } + } + penpot.closePlugin(); + } +}); + +function createGroupCell( + grid: GridLayout, + numRows: number, + numCols: number, + row: number, + col: number, + message: TablePluginEvent, +) { + const bg = penpot.createRectangle(); + bg.x = 0; + bg.y = 0; + bg.resize(100, 100); + + if (col === 0 && row === 0) { + bg.borderRadiusTopLeft = 8; + } else if (col === 0 && row === numRows - 1) { + bg.borderRadiusBottomRight = 8; + } else if (col === numCols - 1 && row === 0) { + bg.borderRadiusTopRight = 8; + } else if (col === numCols - 1 && row === numRows - 1) { + bg.borderRadiusBottomRight = 8; + } + + if (message.content.options.alternateRows && !(row % 2)) { + bg.fills = [{ fillColor: '#f8f9fc' }]; + } else { + bg.fills = [{ fillColor: '#ffffff' }]; + } + + if ( + (message.content.options.filledHeaderRow && row === 0) || + (message.content.options.filledHeaderColumn && col === 0) + ) { + bg.fills = [{ fillColor: '#d9dfea' }]; + } + + if (message.content.options.borders) { + bg.strokes = [ + { + strokeColor: '#d4dadc', + strokeStyle: 'solid', + strokeWidth: 0.5, + strokeAlignment: 'center', + }, + ]; + } + + let text; + if (message.content.type === 'import' && message.content.import) { + text = penpot.createText(message.content.import[row][col]); + } else if (message.content.new) { + text = row === 0 ? penpot.createText('Header') : penpot.createText('Cell'); + } + + if (text) { + text.x = 20; + text.y = 10; + text.resize(60, 80); + text.verticalAlign = 'center'; + text.growType = 'auto-height'; + text.fontFamily = 'Work Sans'; + text.fontId = 'gfont-work-sans'; + text.fontVariantId = row === 0 ? '500' : 'regular'; + text.fontSize = '12'; + text.fontWeight = row === 0 ? '500' : '400'; + + const group = penpot.group([bg, text]); + if (group) { + text.constraintsHorizontal = 'leftright'; + text.constraintsVertical = 'topbottom'; + + grid.appendChild(group, row + 1, col + 1); + if (group.layoutChild) { + group.layoutChild.horizontalSizing = 'fill'; + group.layoutChild.verticalSizing = 'fill'; + } + } + } +} + +function createFlexCell( + grid: GridLayout, + numRows: number, + numCols: number, + row: number, + col: number, + message: TablePluginEvent, +) { + const board = penpot.createBoard(); + + if (col === 0 && row === 0) { + board.borderRadiusTopLeft = 8; + } else if (col === 0 && row === numRows - 1) { + board.borderRadiusBottomRight = 8; + } else if (col === numCols - 1 && row === 0) { + board.borderRadiusTopRight = 8; + } else if (col === numCols - 1 && row === numRows - 1) { + board.borderRadiusBottomRight = 8; + } + + grid.appendChild(board, row + 1, col + 1); + + if (board.layoutChild) { + board.layoutChild.horizontalSizing = 'fill'; + board.layoutChild.verticalSizing = 'fill'; + } + + if (message.content.options.alternateRows && !(row % 2)) { + board.fills = [{ fillColor: '#f8f9fc' }]; + } + + if ( + (message.content.options.filledHeaderRow && row === 0) || + (message.content.options.filledHeaderColumn && col === 0) + ) { + board.fills = [{ fillColor: '#d9dfea' }]; + } + + if (message.content.options.borders) { + board.strokes = [ + { + strokeColor: '#d4dadc', + strokeStyle: 'solid', + strokeWidth: 0.5, + strokeAlignment: 'center', + }, + ]; + } + + const flex = board.addFlexLayout(); + flex.alignItems = 'center'; + flex.justifyContent = 'start'; + flex.verticalPadding = 10; + flex.horizontalPadding = 20; + + let text; + if (message.content.type === 'import' && message.content.import) { + text = penpot.createText(message.content.import[row][col]); + } else if (message.content.new) { + text = row === 0 ? penpot.createText('Header') : penpot.createText('Cell'); + } + + if (text) { + text.growType = 'auto-height'; + text.fontFamily = 'Work Sans'; + text.fontId = 'gfont-work-sans'; + text.fontVariantId = row === 0 ? '500' : 'regular'; + text.fontSize = '12'; + text.fontWeight = row === 0 ? '500' : '400'; + board.appendChild(text); + if (text.layoutChild) { + text.layoutChild.horizontalSizing = 'fill'; + text.layoutChild.verticalSizing = 'fix'; + } + } +} + +function pluginData(message: PluginMessageEvent) { + if (message.type === 'tableconfig') { + const { type, options } = message.content; + const page = penpot.currentPage; + + if (type === 'save') { + page?.setPluginData('table-plugin', JSON.stringify(options)); + } else if (message.content.type === 'retrieve') { + const data = page?.getPluginData('table-plugin'); + const options = data ? JSON.parse(data) : null; + + sendMessage({ + type: 'tableconfig', + content: { + type: 'retrieve', + options, + }, + }); + } + } +} + +function sendMessage(message: PluginMessageEvent) { + penpot.ui.sendMessage(message); +} diff --git a/plugins/apps/table-plugin/src/styles.css b/plugins/apps/table-plugin/src/styles.css new file mode 100644 index 0000000000..90d4ee0072 --- /dev/null +++ b/plugins/apps/table-plugin/src/styles.css @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/plugins/apps/table-plugin/tsconfig.app.json b/plugins/apps/table-plugin/tsconfig.app.json new file mode 100644 index 0000000000..fff4a41d44 --- /dev/null +++ b/plugins/apps/table-plugin/tsconfig.app.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.d.ts"], + "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] +} diff --git a/plugins/apps/table-plugin/tsconfig.editor.json b/plugins/apps/table-plugin/tsconfig.editor.json new file mode 100644 index 0000000000..4ee6393404 --- /dev/null +++ b/plugins/apps/table-plugin/tsconfig.editor.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*.ts"], + "compilerOptions": { + "types": [] + } +} diff --git a/plugins/apps/table-plugin/tsconfig.json b/plugins/apps/table-plugin/tsconfig.json new file mode 100644 index 0000000000..4c48587cfe --- /dev/null +++ b/plugins/apps/table-plugin/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "es2022", + "useDefineForClassFields": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.editor.json" + }, + { + "path": "./tsconfig.plugin.json" + } + ], + "extends": "../../tsconfig.base.json", + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/plugins/apps/table-plugin/tsconfig.plugin.json b/plugins/apps/table-plugin/tsconfig.plugin.json new file mode 100644 index 0000000000..961987f7a1 --- /dev/null +++ b/plugins/apps/table-plugin/tsconfig.plugin.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": [] + }, + "files": ["src/plugin.ts"], + "include": ["../../libs/plugin-types/index.d.ts"] +} diff --git a/plugins/commitlint.config.js b/plugins/commitlint.config.js new file mode 100644 index 0000000000..3f5e287f9e --- /dev/null +++ b/plugins/commitlint.config.js @@ -0,0 +1 @@ +export default { extends: ['@commitlint/config-conventional'] }; diff --git a/plugins/docs/api-docs.md b/plugins/docs/api-docs.md new file mode 100644 index 0000000000..b4b72c52a4 --- /dev/null +++ b/plugins/docs/api-docs.md @@ -0,0 +1,23 @@ +### Plugins API Documentation + +This document shows you how to create API documentation. + +#### On your local + +If you want to see what the document will look like (the HTML that's generated), you can run the following command: + +```shell +npm run create:api-docs +``` + +Once you've done that, you'll find the result in `./dist/apps/api-doc` + +#### Deploy the API Documentation + +Just move to the `stable` branch in this repository and rebase it with the latest changes from the `main` branch. This will trigger the deployment at Cloudfare if the `/libs/plugin-types/index.d.ts` or the `/tools/typedoc.css` files have been updated. + +Take a look at the [Penpot plugins API](https://penpot-plugins-api-doc.pages.dev/) to see what's new. + +#### Styles + +If you want to make some style changes you can do it in `/tools/typedoc.css`. diff --git a/plugins/docs/create-angular-plugin.md b/plugins/docs/create-angular-plugin.md new file mode 100644 index 0000000000..96aff805c5 --- /dev/null +++ b/plugins/docs/create-angular-plugin.md @@ -0,0 +1,153 @@ +# Creating a Plugin + +This guide walks you through the steps to create an Angular plugin for our platform. You'll start by setting up the basic structure, configuring necessary files, and then running a local server to preview your plugin. + +If you prefer to create the plugin without a specific framework there's also [Creating a Plugin](./create-plugin.md). + +Keep in mind that this guide is for creating a plugin **inside `penpot-plugins` monorepo**. If you want to create a plugin outside our environment you can check the [Penpot Plugin Starter Template](https://github.com/penpot/penpot-plugin-starter-template) or the documentation at [Create a Plugin](https://help.penpot.app/plugins/create-a-plugin/). + +Let's dive in. + +### Step 1: Initialize the Plugin + +First, you need to create the scaffolding for your plugin. Use the following command, replacing `example-plugin` with the name of your plugin: + +```sh +npx nx g @nx/angular:app example-plugin --directory=apps/example-plugin --bundler=esbuild +``` + +### Step 2: Configure the Manifest + +Next, create a `manifest.json` file inside the `/src/assets` directory. This file is crucial as it defines key properties of your plugin, including permissions and the entry point script. + +```json +{ + "name": "Example plugin", + "host": "http://localhost:4200", + "code": "/assets/plugin.js", + "icon": "/assets/icon.png", + "permissions": [ + "content:write", + "library:write", + "user:read", + "comment:read", + "allow:downloads" + ] +} +``` + +### Step 3: Update Project Configuration + +Now, add the plugin tag. + +```typescript +"tags": ["type:plugin"], +``` + +Also, update `targets.build` with the following code to allow the use of Penpot styles and build the plugin code. + +```json +"options": { + "styles": [ + "libs/plugins-styles/src/lib/styles.css", + "apps/example-plugin/src/styles.css" + ], + "optimization": { + "scripts": true, + "styles": true, + "fonts": false + } +}, +"dependsOn": ["buildPlugin"] +``` + +Add the default port to the `serve.configurations.development` task: + +```json +"development": { + // ... + "port": 4302, +} +``` + +For choosing the port go check the Sample Plugins table at the [README](../README.md) so your plugin doesn't use a duplicate port. We're using the range 4300-4399. + +### Step 4: Modify TypeScript Configuration + +Create ``tsconfig.plugin.json` next to the `tsconfig.json`: + +```json +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": [] + }, + "files": ["src/plugin.ts"], + "include": ["../../libs/plugin-types/index.d.ts"] +} +``` + +Add the reference to the main tsconfig.json: + +```json +"references": [ + { + "path": "./tsconfig.plugin.json" + } +], +``` + +### Step 5: Add TS parser to eslint + +Add these options to the end of the `eslint.config.js` file to allow linting with type information: + +```js + { + languageOptions: { + parserOptions: { + project: './tsconfig.*?.json', + tsconfigRootDir: import.meta.dirname, + }, + }, + }, +``` + +### Strep 6: Hello world plugin code + +Create the file `apps/example-plugin/src/plugin.ts` with the following code: + +```ts +console.log('Hello Plugin'); +``` + +### Step 7: Run the plugin + +Run this command: + +```sh +npx nx run example-plugin:init +``` + +This will run two tasks: `serve`, the usual Angular server, and `buildPlugin`, which will compile the `plugin.ts` file. + +### Step 8: Load the Plugin in Penpot + +To load your plugin into Penpot you can use the shortcut `Ctrl + Alt + P` to directly open the Plugin manager modal. There you need to provide the plugin's manifest URL (example: `http://plugin.example/manifest.json`) for the installation. If there's no issues the plugin will be installed and then you would be able to open it whenever you like. + +You can also open the Plugin manager modal via: + +- Menu + + ![Penpot's menu image](./images/plugin-menu.png) + +### Step 9: Build plugin + +``` +npx nx run example-plugin:build +``` + +### Learn More About Plugin Development + +For more detailed information on plugin development, check out our guides: + +- [Plugin Usage Documentation](,/plugin-usage.md) diff --git a/plugins/docs/create-api.md b/plugins/docs/create-api.md new file mode 100644 index 0000000000..6d35327fec --- /dev/null +++ b/plugins/docs/create-api.md @@ -0,0 +1,18 @@ +# Create API + +Add your API in `libs/plugins-runtime/src/lib/api/index.ts`. + +Try to use `zod` to validate the input an output, for example: + +```ts +{ + sum: z.function() + .args(z.number(), z.number()) + .returns(z.number()) + .implement((callback, time) => { + setTimeout(callback, time); + }); +} +``` + +Update `/libs/plugins-runtime/src/lib/api/index.d.ts`. diff --git a/plugins/docs/create-plugin.md b/plugins/docs/create-plugin.md new file mode 100644 index 0000000000..ceda5603ab --- /dev/null +++ b/plugins/docs/create-plugin.md @@ -0,0 +1,108 @@ +# Creating a Plugin + +This guide walks you through the steps to create a plugin for our platform. You'll start by setting up the basic structure, configuring necessary files, and then running a local server to preview your plugin. + +If you prefer to create the plugin with angular, there's also a [Creating a Plugin (angular)](./create-angular-plugin.md). + +Keep in mind that this guide is for creating a plugin **inside `penpot-plugins` monorepo**. If you want to create a plugin outside our environment you can check the [Penpot Plugin Starter Template](https://github.com/penpot/penpot-plugin-starter-template) or the documentation at [Create a Plugin](https://help.penpot.app/plugins/create-a-plugin/). + +Let's dive in. + +### Step 1: Initialize the Plugin + +First, you need to create the scaffolding for your plugin. Use the following command, replacing `example-plugin` with the name of your plugin: + +```sh +npx nx g @nx/web:application example-plugin --directory=apps/example-plugin +``` + +### Step 2: Migrate eslint to ESM + +Replace `module.exports = [` with `export default [` and const `baseConfig = require('../../eslint.base.config.js');` with `import baseConfig from '../../eslint.config.js';`. + +### Step 3: Configure the Manifest + +Next, create a `manifest.json` file inside the `/public` directory. This file is crucial as it defines key properties of your plugin, including permissions and the entry point script. + +```json +{ + "name": "Example Plugin", + "host": "http://localhost:4201", + "code": "/plugin.js", + "icon": "/icon.png", + "permissions": [ + "content:write", + "library:write", + "user:read", + "comment:read", + "allow:downloads" + ] +} +``` + +### Step 4: Update Vite Configuration + +Now, add the following configuration to your `vite.config.ts` to specify the entry points for the build process: + +```typescript +build: { + rollupOptions: { + input: { + plugin: 'src/plugin.ts', + index: './index.html', + }, + output: { + entryFileNames: '[name].js', + }, + }, +} +``` + +### Step 5: Modify TypeScript Configuration + +Update your `tsconfig.app.json` to include the necessary TypeScript files for your plugin: + +```json +{ + "include": ["src/**/*.ts", "../../libs/plugin-types/index.d.ts"] +} +``` + +### Step 6: Run a Static Server + +To preview your plugin, start a static server by running: + +```sh +npx nx run example-plugin:build --watch & npx nx run example-plugin:preview +``` + +### Step 7: Add TS parser to eslint + +Add these options to the end of the `eslint.config.js` file to allow linting with type information: + +```js + { + languageOptions: { + parserOptions: { + project: './tsconfig.*?.json', + tsconfigRootDir: import.meta.dirname, + }, + }, + }, +``` + +### Step 8: Load the Plugin in Penpot + +To load your plugin into Penpot you can use the shortcut `Ctrl + Alt + P` to directly open the Plugin manager modal. There you need to provide the plugin's manifest URL (example: `http://plugin.example/manifest.json`) for the installation. If there's no issues the plugin will be installed and then you would be able to open it whenever you like. + +You can also open the Plugin manager modal via: + +- Menu + + ![Penpot's menu image](./images/plugin-menu.png) + +### Learn More About Plugin Development + +For more detailed information on plugin development, check out our guides: + +- [Create API Documentation](./create-api.md) diff --git a/plugins/docs/images/plugin-menu.png b/plugins/docs/images/plugin-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..61f3b25b6bdf4cb27358a16df8e6d6a3db54ef86 GIT binary patch literal 35340 zcmbTd1yEfACXOx!_QrszjjgpYlY^1Hv9XPVnXMxPrc)3A$N;I& z!m6(6$Ez+nn0ut~XOLB67z4^_KMMLE9~FPM+u2svtC#1MYr9yMtA8nfsGU_WCsr?S zsMm(Kd2EhFv6me+Z0=~?v0sHgyef$z<2B1(P`Ey(d7jry61zIu<>oF1vL zgxI)akFnOz6qAZ-{e>o(@kMw9DT6yTkK7gQ2uN>yD+E@8BZ+Ae5^3jo9v&-$a-kdCMJ^`D_K#3XuZi^;GyN&_@0S&py<(ZztZ%?}9)>k+{ z-2LUH=k;g#ysB^FErxnS`MQ49;9k1RXGJmqk06avvqPGZS>5~gCP7BYASb&|L(xgd zHxxc+*N^PSddK=pKSo^o-P*5_H5wHRjHNmVtKIIefL0fa9E``P3~~A7pLm2S)!!Bt z-kJ|dnMS=Be>LN<+@LY1lgfSKPtvn7DQA4SJNNJ>EAsj{KUDAGs+hf7%ErN!$?IWb z?@0t@+^nci%kTX6HvJdl>})BMn&|t31Hy=O*85H&wC%m!kG!q2$@ec=9zLZdaG30u zP(9*AtFK?|lnh=CD1%+2u6aDPMT6wd++R0Njy}Z3f-_0#`D89FB4VeM(=qY)lryVq zAX;^PW+_}U=38_JiAI}(N&7G>C->{w^!U$EiM??(?nc2_^4|u29TQE|<uyWH`Ezd{Lo zbAMlYG^1J?T*Y%N;bObDw+nQQoGGd}Ao){SmgZQF>-`?j#KFae?#lCUA--TK0qfhAehg}2Ax=5)NuQQ+aHO)XW=`*OaAEuFJ;RY298kqWq$CVA^W<)R z(hTj}s^QfQodpAg_d$Q{?W35uc6b9&iMh$A+CNXZ)wHcQ7DCsxCE@YATm3ciF&{cY zCG>)!R7%*BPOHp5^adVX(JkPvf<$n_IWP0xh*O*JXr&~zD}WOcAuDTNtMBr4d*>TI zK^pbIfMpAwon7pqt|(<5xL-ubHP%K)hisPDpaA4Zxr^bEk&!Vj4z5WvwK@@{lEz>b z^oUf}#RltT45^_=8C>Of3=4WS(F+HM0DDpf+b>HCJ3HH~9M)zQ+C9_8MA!tmI8s z3jx-^530dhKZM>Z$4`r4geN@d{QAl;kHSW$V{oF5OJ8{Q8K5Q!Ooh@iHy4q;+VXJe z>l0gjY*KKC1Q@}4!;{gMivxMjO9;94_<$_RNd2LhtL9lP4LEt)i%as4-`8Grg+L`J zv}0U`s&u_vz z>HN`oykKEs@WJV3C7{*Eig$eW{x!)gPUMjwTv34hU59vx<;pl&?heSQN<`?!gq-!lX z$2xD(5Uq@jQGokq9%_?a?4#u5l)b$ji_V6pHh!2KaX@91k zL7yy{$7f@uV1$^L4~0l@*x^DI_z~^>?ru144NcK# zT4%Xe2Keq|Z|`1qh%Ta5XTHACqad_(;R^iSK1_{GMFc{tKlB$;59eK2FS|@k&ufsB z&$Bhl;^02l-1rzOseXe_$ z0MOR@a)cDr%(KXuP|5@D5BUs%y;IKhzeNf^Wh_d`8UJcE>e)PqkONo5AGgI^Y2~H~ zN{2t0eKb0isGL%+bnPTz<~167I`w*h2K33y_9i}1a-!7TQKV`mN8h@y|H;J$G?y0a zTvwh}_%nnwthhY31L-n!TcCVDDO6g+htzFTfmXt4@o_sxpf&1v+2PxIX1D)Sdv(mBt`1&sC^Bk`N&%*xsJhM4({v*tR9A;l5qaLgnX6}Y z)7|b)xRhNrIMw8y0__F*HZfSZNr}=4GGoNA-0TA7g#_uXx5q+OAH}Mt;^Mu=GMQt4 zaH=k}jjQ7k;A=z-C`Wz%z{Po)&M~|2=chVtrl9B9$}73qt(c>u^8vRbUKR^2J!6~u zinl4e=;Lzg{g%`SGu%(cqtz0&SnwJcJhyO4|Ht5n2^7rkzW zi<$hpk2{M8|5>9UYrc=HUA-MYTI|mK?Y}0@>47%rlNaXr?&x|H$w^9j`tkPm@$TFg zDhxVybO4!D5CaGl*_bYh?&;|{IX?FE^yIc#QN0x}xuKkAJZ7fC6DMc*Ba7VPwr65i z@pNtf6)%WGi0SMCJ8Q!84FG)Sjn)+?ayZ=)^;sD=0szUfcMiB{+?D%f%DpS?V#s)t zdi9sm?;Lg;DHWtbHYmlfZH)R=u&BgVI~{MeQdQxNNd84}`7qZ6&Bx$E@9c1T-u>9# z-tGx`U8&tGa=YBE)T-599H@1>Y$W8iS*kT{%*uLgb0b|`TwHCkTb-Y8%w;H647-h33x%pjZVE)z=8WA6m_egTy{ApENfm(=`^)1Q8 ze~8l4o0nLZD_x&FUib_Xk@nF*hK6?Rq&;2|MwbG+MefobTmRwcdwR0%vgO|;?r zmJ~AEUX@@_>>QJ#(_Ts}L^RSDb{-z{{)hu0COy6G`$l(92%4Mg)zNAz3$W5;r%Q|F z?jFVa{cqRdY}wBvBEhGkv@coiM9aC@%GLRr&V>KR@{MP9tgcw}TlvqX$P9)|fEqvltwUu?H05HJ=3p zT@59Cbu}MNwPyph>kzfs+>Xoh2o(V`Uxtt%8i;mEs{J3i zC2IM+Q#b%%*7zxy$q34K%+vF1KI9;*blF(i(DvnKYh+CR=49E0XwAjfw0jgr0=kyd zi5?bI#lX~`Ett_EAriAe8yf~Hg|aHtnHhX8bRn!7o2REFI5>K*@eK=H){M!&_H~Tc zW$d<_*G~%;ud?{0&~Mqkz` zd|9VU+{?~!SdneI=&oCUe_e}UH19z23rh=motK5Ny_R3+*`aQRjPC zw^;yrZ7Adalzy}S=Ul?{@R2=x*J}6|nwHhg5M`v)p|+?pR>**H?II&rcs^|$)!Rs2 z0X*_RMdDD?zOV!m5|Yf!Ooc4Lo6F0xaU5J`oxd9!5+zsYns*{cAiqK_p**Lep<&VQ5TV6l*8XQAf<$tJ<=*zs z%{kwmX05EQisg30z@t8$4?x9AZf|T<_@%xpl~c;u?;bLO73Lak>cKoiiHQ8E!P8J% z@8E22v0NzE+F-p@U(0QEoXiu5F5*-=zj#0qYX)v2pC`L)id(Ql4V@1&;O?HAQ%`XM z^+qYhi9?HB#7R-lq4e$M+dC0VBY>5SBVEX4tvHs_N%!49Yhlq^q3-Tpdgvs|Kx?{L zU0<(8O_-yY92ZyPuvdXeBd@Nl;%2SHz(80(AF0R$M)>%_bb}+aPUN=PnvC)4yRgC$ z=S0s31EdZ-M7kQFV33&ph@bp+oB5#8!)8#2MhAMsuo+fY9#kXw5Dtc~nlDZN+)K`@ zsTR`A&>(bAP1zq5Wf`srBakzdLDEOmGCtZ(jaUX>1V0=KOQP7MZC{It-O;d;aQjb%9LB6TfOfx$Q< z#3yRMC2;to4l{6NcXV<%CCA5fy4VP*8OJ`U3j*V|g2Dpu(!FVBbG}O6kx4piA(G`s zFn^Oa0_B?{3TIi=?4)n&N`ejmo87q>)t{N;&5Lvc(M!7wYu%tbx<0+uj3-2B;4e3N z7A?E49pH}_J3A-@3NCJ$O9EAo)*kMABR0vv7uZH`7!UWWX(w#kuMP{qR|~_^poW{{ z&f0gO7miI;Oc6M~!&J$JuzDP#0_V z;#bpL{qZEMpX)nqy*HP(aBmsz{5kODp=Lk5%F=XvJsgwUxfi}Ma*sPHPsE$3TivvI z{{#;qNY~@~cz4%?jAO!ysgjQ7?}rZ`CLKjLVq=E`v~pMY|L`J^XT*UIxU0J>T^76Qh%ctScz-+MKb&6*CEMl~o3te%lFF4^3 zU9(EFXT;2CmB*NV(()qQ9nW++JP?;ytMK`;;(LCnr35oWLWeqiJUeilBNU|bx>Az5 zFkmiVak63Q$6{#M4ar#HEsxK>*v+rWy^9|ak6Lr2X*AEk3J9_v4dpp5@Of^-n3L53@Z>Z3 zv@X&u8FZq1q3}R9hvBP+#K$bFv}NJ?#vltJ;5@L9`?ShBpfvZBS=YGWk~$0M{WcDJroq(|1M~s3@gnq z^6!xEzP4KoT9zr zhjIp#d*kQoNr{HB4ngh$PyEHe{fUQ+I;dA^^dVpV9^I4XfMgu9&zB@bApwa$H2LCF&Dd^fz|r z9=rSk^z_)X_}%I}ZWWxJo$GDK#>Q+w=aI?pw!Oo73EsD{X-{I&R~lCiBZWLXNDruG z-O$Pyge|a3P{Mhi&+gyAVO1gX$*o-6X5w2*0$hph=rcl}vQ|E7&(#oj>Olq3n9IcNV>YN61VV*wlZ0$*uG@;*Lm#DV*x$ z{=NKKRzi;Q1moLSuD(7vxUdpYN#ptm#yMEwn@4XWMn|tABW5nXl|E(-GwAkQhN4?Q z9pVj8VuU)MuI%j2dCXUkK3-oc?*7Z9OD%bMc<5^7JH1I-ouBu?yP!`);UntDT6=v- z<4fm)GtO$--!_uLCE6N$JrY*c>Fp7%z2`=Iq@Dx-*_&%5KOATL4hz_1K(+0( zROm2*G(%qlGwrR{wHJ6+HtrpyyHrUWPpI`l9YP0IE^VjIw|HLY7UT#rGDi=UCp(-* zV8qtY&;VwytX7yzGgT#rgH59bxPsy;Ooq3cY9PQCq ziQshcHVHD=EPG_P**`VljUc%G(O-luW8au&q{*SCBv*r zjr_{qas#rnD*-w1IVSL!XzsYG&wP5L7-oZaB&bPgsma+bRCLTXeQL?kEE~s}B*S6@x zU|62(3lifLl>Xwye}?15zZ6L>$9mBgYx46|Lykv{5;Yi%Mq-0AGNKgORb@I17IaAT z6}ooLXV_**EDW&hgX;1>D>Eia$LvqTQ zM5P(IzG&d?U=!e=^BV$00T_u0i`5QMX+wYeqX!X#bzxBuD)e-H45m(< zCWpzXstvc46I}u^?Qvp0ZO!ai^K>|5Qgd@_%A}ETl1GWO6KEi$C!>BJGuQ+bvdq8~ zYgR$7(I|-g>1=u+)iPJ=w;;((O?#}X>M3hK4vr29E+Ac?>{gGA#KscOiPlpDe}RH!>k(x`<-` z>Oy@%kzQ@c;u_?DVA{3)?MIg<{gb+polB2f!ijoQ7KqPFT;k7&6tk!lspEVV2`q|H-rH*R@0iZs7<#amxd3`#8*z%e2_pbm8 z2_-CrE*d&z9aYBRQ8nj1RiZzKivt;7mByb*iW}4RdK8k@I_(4mAH?d{oetM}s>3f+ zd|uU!!ljWkDw^GPl)Y^#E^ML&Pho}meN+=$BIIP@J)#8b_9U*kmRi?=H|52tC#u)> z5DCTYY53dOWykuqT_(?mGrg6O8k*Mtu`CjyI(;M+nf(L8w#KhYV1-5`XMbUlPJrn> z`GfIsIIUbA=S~2R;9Al9I70w^|Hwl=JvUUpNZK*e)q=0|eSCs6Ros+v364Cgup|Uy#!i=gLE7BHfDO!+-5=9~c@)hiZdz@jlEPYVT2e58PB$!1t>nUm3^+U-(*pIW1 z7y!#w=mZ4U7yGY&Ab##?CV13B+}zv@DsCDS%+v_Eo6J&X-(H}(l19i8fNWZem5AFX z$jX?kLU|o((l`x*bp(1=z1ev{ng*tkQGyE}uajI@^t8yz#)WJA+UwuHr@F(f=2D@- z)P)uie7Y@8+#Foqp076J9VFB^<-e?sO~&+lanGPWfwD#-56GvT({l>^4b6JYCU4f# zip}|bXwh;|d@h|!p(HFX-=L`zVFzE2hukx`V~?t^sKnCO6mTe&qX_zFplcqpINi7( zD1L?I4(qcpS|{&%H8?2~X!e<3tB!Y1gY)h5zUN`#D=UQTertbtZ1l3Qt?O>WXBW*9 zBL3j*pHm&Wt6kCu)}c=C^h$s5Wwf+7+Ml{Z9@LmP1RVd|#h5D4pB7S42f_<#Y~4`$ z!x$G77!|oS-<-xLWa41s#HD4tk7wAn7t@nZr0pc5-yg2)UvTT>PjMgBg2CBZNtjrw*cHq(tCF7-P*#| zh-V2c_~qJl;X^=3kyk^77OUX>`-bx6f*GTohxj3j)(7|=RssQ+gSGmyaP^92mo0Z; zy+wn1Z_!|QAs=O`ss6K!`wA`As?24L%tLU9vvp%r_YIT#FuG_rVSr-T*`${m~)F{nfo&Wg!#v+ zmk7S=UR;DZ|C7B@`)=$3BLROW(S8)*qtAp3F@;W4)mX(=@ zHu_0mkpk^>_4#hidS{icR`AasN&On?J09NH_1)}ek|y94UO|o*a$hP`}QPasX6sL zat+Sg-%KVrPyiJZFFb-XeqJ`ufrom_#?uM2JefJ0JIHtd&rVN59gz!=ZG^jryRkuF z-3=zYQ%iF*fBX%VICULDay1KgaT4bmb`ui`n8Y>cX-GmpKNr2EebF{tG3V&`G@ZrL;N1XuYOg5lkUtVlQX>GOI+ZrsGa?H$KpsW+!J1O+pahwbg17^#= z$$2Sc^W>0kh}bQrwgm&=YKsZRHFIebAG3ewQOl8V*w=}NPbLftHB*lbaI6UBYJ6R6yE%q^#`hGP+cp zis|^X*WPRXdt*%01FBPGY4Mi-<^ni69AV;P{5m*oiI;eR1yGY(@4_oBv<*+lsaXxE%?+N|R-DLt%Oyqb(@ATPHf3*CyYXLWQiB2l5G?GsmdzJNY zYOT6fhk4q2*Y{l>{VA^t#BO=7rjSsLK0&%xuibusQ}y}_ajT zGcO3Or6zb$BuP>g)F>++ZEgB@;W=|nl<&f4y%BOVLmr3tQr165!!Met6dZV-SRL!tP%HW{lYl60}`?c~T*E%Qp zxc2Vd=M2Rc5u9Di189NbK2}x?Xy1A{%NqXkLF1ai33MsD#rtxLEUYHb4%|d#D38D& zp~D(k&vQ}Jue^>~UvuRg6;J)76=Nm2EI8#^Ikj_Wbjy}qV_E>==C8rj+2?qF?z7!LugEn*WWSFa5A z{_NRNPcN<%=j|MZrOw=i!i*;16g*e7-X(f*`IE5-c}+3n+^dAyU5{SI537CPpadns z+}b2~{%*V}r65Z`&NYl=)h^GI+Jp=(6=%)o$nk+4#&_lT7pNIbkO)WJjr05W1Rn*O z<%v*}$Pmo$ueH{Rc@_90`AcVq7T?n|=AT~I1=P7b?KP?klCBD+YP%_r?JxIuv=ZM5 zX4X)OihP%_A$Tb8-u}gcF=Y-Yvs&*>h;3%0p&mV7N$f?@D~JW(1`K)BM$+8yH4dl4 zbg?RGE8ZO|FEof&vY7*!etXb+%{{UwS2<*KkB8@HFx*IeOg5yS5mpmVJ;&ce<{B!Q z`;wluXpmcxQ$DQr6hxA%#Uzy*tFd#hVo^nIOHmMaZsOM*+W<+yBLEAK2@zs)W?bMRV)4m6Q;>vjd*zzqpsn zbu{;D?6y=v9!OHwE8e0q=P%t@cUp;&x;l9%$UOd1z-zs>|05;IVejN}78xA}0~jpb z=IsQeAo+MTa;JT;nRXe@SHP9*SiEkk+xt0glFa{fy$2&z@KD|wnZkL5xwvMHTMLCZ zl$Vzl)xqdvfrSwZ>%B_U4gHmGeDOoWc2@;vtbK57sCn7sh~ROW-Oc=UtlLkiBJwSh zU&%jTcdE&%nX{mIkN(trAS7*f`>_hK#{f|8Z98sk)^j%|0?;jT3DR9x_#ZG~@kxk^ zLoH?^SZj#3s9T!_!yXfs@zBOjEDId%pT_r=Uf4RHhq|s_NEao??lYtfyGVQudhe&w zSBAY1k@G-e)2PNL@2}mX`>3@#p^FMzy>F1e=^|)f{9qZkFtCI7<#0Nh zr#^XMnP2wiuk8$QQO(Elt*NWu`EeRV-8QW9NpCP{H5Ba%@e(iB$_A2etX^J0Q)3P!la>tTgQcK)S{%gAjGMb>r)Au!^_J@Na7DRi?`0P8+IQi?Ua5i*%>R4=IotsRFHsVJh$!?Th!Ijl8qGl$eY`d*Si4D zFDtouxm!jQc_O)NX(RE{+OjXsL5n^z{j1~Z-HrDSt_mrDPBTC=pnqPu=~{!c*cjA-0Y1jt=(rR`VUvdolPbHI>iJ zTX!;cQzsevZQoBPhbD7$8>`!CMsb8*ywe?Pi^K>^x8pmgkzU z$s1V!KoeR%F5%r3(B2r98M=7t;y^3U?;xkCN=WZkhwY zL_wch^S#sfmK=ii@{w^HLd!M9J`PaSb5}Wkd$9T-E)ucpvyeKeWvZc$KcG^M(fR6D ze$i)>Vd78rqrh_B2p&|ARJiCZw?mgssbCWS?E{AhoKME3pfwfJ~xZ}-mrTM#K5h*eKtH@sX+5VV%n}t zX>pF)oN(Dw{xZe#Ib0-edvkpL`Kc4)sEZ&XxlG_tF{je`7%bioUT^N*ELe)GY4f6A z@t*A#iFbGOg@23Q=g?sK>q-6eaj#*a>Wi{vU*e%>Yij8fv*jm}hViE^msY&zBKDv^ zyA^~H(l^Gvahf_!P_W10WnP?{l@ zOkAH0bQ97!*nXaE^D^c7Wm#`Ny;ugFN*CJNbadnx!6%0$j2E`43J4FuPYWG(NFN@Yjr66 zBZCAI&&WjxSp6zL(oqTE zRBajG_`YM$nPriYl{SKlFw;8fA`L<&6*8X?IF;V_84@7|qzY#Gq5&1FI!>CRJAx#F zS(P_jHEe8ENx73$hIZ=W!4+kn{`DQ&XM%)$1@-l=%7B+K4-}-92ih-lDNQOYyk}w> z0i*gO9kcwr8W~vhiR?A34WjM`Se>u%{#6*Yq-MoLa&kn-lcWnQti-jIF^Jz8*qEDt zGxV2eIuxbA0a=`e5Y&Ifk+43KOIS~1i2OK-Kq8B7>6Uw`u7#BqJqGrVzP>|iMg~fl z*Feg^R8Ex<^-n)xfCR!}?6dA;1U0ZEiI*`zTx<*nQZr)4_hkM9%PbABQRZX93Uf@S z$e@c9FIN9g<#UzfPpRT^^S%{V$mp(FIac6Ih(U6x%gFNE)FUd(n z!$kZ4{=kf6;KomwdG0F%C<8W|^#B?Dra9+PoEfaTYB05a3sxO}_Xa4|2ddn_2MILq z-DV%JKj$IwDa}?6WAXE}S)M+y`kFRriO#I(bX9bclf;r*MIoS;Q&pzJ* zp{#cM`_kxJ7SiT@hDUo%0WKW@juHO}(w2=sdX+b0m#CRSJ_mPUf_HwoQp&+3x*C4y zQ(WNu%#toXJQM3TcHS)ZR_FCIf9yV7N_g&X47c&(HeL)}sOmwYmM6MhI~}kmP6$2p z2N7r&bZ-Q)Vz~c@2dk6nByaG3^iuu?#M~b5FaA}scKSkTLFC^RtB%m_04{gUG~$Dsa?IpGE~!>$*v&Z#q`1;6&@D^(LxFaWklbsUL8{#gtsX;eeEl zRo3%tlV6Z*axZw4|7b#Bs-L@$AT`q?liu2T7%a$MqhcXH`+YwW%L9g4QCs_Jmo443 z(?Xe13`}1#j5ZEG*niq{F2ABpq2;_fFJK@)c#j-YK2UjmXnDnJN;h@-dQrR15Nx_^ zTD9jJ)zEJhM9Z+-oCPUQ<_~iBQ3baJLVN9@B)>Q{^?h^m&Mnpfw-3)VZS>zpdlGKT zt1EvEpOw*qw|WDa#NUPvevQeaw%wg!!1=Ns^4Pq5t8FUlfbVv|7C(VgAmK6%b6h_! zrU28Q-R|GhP>Hy03ZM30mKW=Gy}$oQ08u>} zl06aux;X5oW4pdMZ_yA5SoqQkxumf7n}*^lDcWOQApz!-%|x@0z4gw4nCv35jeTfSm11d)*3{sz4w+PF0mOd{8cSm_&Br(ie*xiIi>*`826tkIBFHQFpu_VXoovBs(8uoe>X|W><8Y}*9Lt*} zL;aIx-8N-W1@&+5VHkB}m``}E3a_sD@81AZxJBMg4{=Zc@5@r>S`HZOwbW@s0ojs1 z7kgu{A42Phqp|K#8|%uz zps)`Y+1wL|K{aT~QYm9)pB?_0?-~nnW}3c%_k9CutqnSH`Y~A=??h>jPIdpVlMuf! zu!cYZxwB-Iixs+z5JA@`vVy(hNz4mdLC=)RiAH-T$k)$QNkU=SO`d*w_XpY$BJ>7M z_?*UZ#+%mbrb^~wWLC>#5yR1c68^*F35;=X8$GsWOgmjgj)TC{Y$p+W)4O9OPA(UC z9EBu3j}a%L5lz~57h$@EJ|O68739ym3?r1&adH%U_87lyv$j9eJ2WcleNz| zGm&Z$ftJIWtxeY^;AWwEDM@J1K$*DgW0e0O#VQ|n4r)0X+Tfa zVz4PZidWuclm%+W;T!Oo|Ns8$zdfKL%=bqx2gs>QzR<1A>zxD^u#qHNqoZ^m8(11So@VB(U*9C{S8>g_hT7SU%z2d`(W8sB_<<*KO0mw9 zn2k~J*TXfOvn=@Be@$N3j_1pI-_4d8xVbV_npi?^nDE@u-MPV`6cae6LhgILF&}Bs z^p%JQ+-kg-1Bd-;^c^4mU`QYW2stCi83Qaj?e;tUK>_+vRXLJnXfG|#&*JQNJrQ|Fp&RgA{cNx96ri+Q|^iR~|GMh98`Sf(!nzQ=Sv(M~_Kal8)DT z*`=&kWLKz$S_|4oEpUM|p$2%fUyyrLR}|MO_Dn8pvV0n>roQG8Y7qCMjdXBuA4DG2 z)uzLvSS|Nl->QUz#A1?0+J0!g)vM49?tH$zSjTVUxSd`}H|J9ZI5d?vq~9D~2UUn3 zrhlTt<{V+5i!Aj|IYA+Cs`YvAJeF=(uQb0E_q(+q3_?ISa}*fF$Dxc@Mz_F07I+|B6r&B z#C}4e_m**XRKd5DOv-);SO5QHAOHM0rPf(cn)=p5ux^vC;=LxGimS^JqHWKPgso2d zrpI?2r(5}7L_l&I-+Ua=NnWJ@4h(Hv#hPMMvcMHe+(E9p>YM*t;ND%J!J<3w8^b%x z6BW|41O3UMLo!K?Lf34y!b{oHDv#9WD;2Eo^P{%`$bQ5LA2m_Il2T#>L%=W!DQI6X zH0P0&yk-z7rt1W6VN>;{_Bs3y_x z4=f~C5OEpx%(l!Vuh0LaE7iKzz!*hENWI%e1rJEJH~3syt#UhA1&@t;qyKjABo6sO zI$MIn>BtO3O3p0(y@bH4b zf>ng@2oxlY_?;DlBX}=13a5KF^S#>^lqjE@$@w?Rndfm{s}ekI5utNg&2t@BT|Kvy z+sNx?zsE=}DQsVf&Ur7k3vr-gd@<`NK|3aiQmVjzEta}qEnq?SCc7`_1q@HZ49z4T zPHCbtj2IN)DK#9X27kbiB_vJhz%XaQ;zt{G#hU(P%@0kHpn(bJgn^?gL$9J>r2P?7 zwk7eOx(P$!|zSb9HD@ahB8}p+6;ycDf7V8Y;G16b$hq!->tjkh%>Y0U&pjJ&a^ zfc@7{G110U87_e5bTDIlkel8WBfZXbv_a5u+xRqyYdZ-`m;M^gaQWQRbB+jy5I~}f zHb$pc&Bm4C9d1pbN*QdRYWo3M#ZJ^M?SD36uE}7RBm(ew``m3(tHp?uHd;s`bcBxl2qI$C zYh1FQ9sEC8mo6WQ)xBN6dAsIQFJ)ue1~RtigfjhGY=l{OJwD=p&oGgKXVbth>OGTP z|Lv2R3(%*4)2=uY5(-bwNr~*vEMPwh8JpE_|80_TbqgHkJ|roW=9w>RpiXB9b+Wi zo%G2b_*AJI1bJ@it@mdCiRlR=Y+xVu1FG;eA-3UUwd2iye36sBF?3F%MC{|XbIck) zJSD}7(?CfmkDqvZ>zN+WvsI5+^(8#vyd1=0Fn8OW+k5S*=UQVmkz{RmXC}3M%kwq2 zj{QjRzQ}B$G*Sj`@oeF*>w+AulzHe0CDqM8!8qsH3qjSHJK6iinT99psP-qTt_peOo0Qg8$p> z_{Rs*^M*yHxFI}>^{|Ul_Sz*Fj7%*?+v;MrhTU2pW%KyY@`80g6 z$XEF5Ea{AIOp|S9?XQ74l=H`u?umd2z8?uGafL?&=*q40xbw=*c~3${vxQFW4Z^7k zF9%ELbb#*9?~uP2`l35sP%#3n$KVhE(907nG=v;Mig2KS7=9b2h&OK+=~3cMPGMSk zHEmvOKLSA2^&9d;&mX@$DDQy_$@P&B@4-Mh@`u57%{ySoh4icAUQrspJuui@YduK} zGaGUCV4k)j})LP1O$*g-AGt`=+BTov)4dq52%WU&mouq5zVN@JIR|}JzGS{7ak{1D z8~3P{Ji3oJCyP#Jrdd|GFZX5}K2l-suPaO>!ss&d74wepXe!tBU>aB7c;Dntne@(r z%55P-qTH0xp8GvivAXEI&2v}v6b%CJ$gB5Q%>6VkNGX{x9!q3_PeVsp9VGmMiQ;Bk z45kb2tBJ%9qa(o;ryDv+(LSpjRomx5ltQ+;uL>gYG<=>}8viE-n5h>oggaak6p@@= zZrl1dSaCx{h>fnn3}_nCM~!@S zZ^cV}^yv+wJUbkA`h}R8x6oyU&n9ir3h8^z)kvA6+dR1}SH~PK-8e+|?tETnjkM~Q zJ#POeQ&*dZvs@oHJQbE~w>bD~fLAznN(zz_v{&Dg=Q}t>Z_)k1J;-Ov7cF0|R|t!? zzUo1V2n4Ep)>*8$(sF6J(&Ut=#H#;cM`2WN0g<=EE~6j6B9Nn$9E_@sq@jWbgf((J z5B{4AAOZ<%4CO1OcUmiUF4H)+{>NLEE52bWOtrT-I0j)KbP<&7mMk^mPl|IvnlJTB zUd;Vufrpia+_8uDJJvgVWy*M^58wa6Q8Qn6v_gEPn?njyh99+Lc@Q}J)3VTiNRJT4 zdi;Z_6k$}i2@~Q!Cx?w^45O=-Y{8RX&FQ(E(7slB+Nzygl%#sl+ZcgnFQ;F{ge2I& zEVTr$`Pa%&>8Zts2eO%uYLE8Ao%Bh*7bwLKa{=4|@_p9-)om%JA4vAt@z9H-Qkw@w zp7>Jw)0I90sYE9`)#K9+nMOel|39-@Y_Rr+x6)%N;ZbMyx-^TH(D(Om0T7$=9j1(e z8g6k^#Zj}Z3_ zFPQOF8XZn+^P_ycVf~8$6$Aj4^zzS&J2TCT<n#k#ROSt$& zRbIj;FF<0kRWv@o#xjIlO4;};kyIRZds%{fO7FkbbyAUHQuMY@w6CIiix^DyBd{0t zl}3Srf?{fF+DV&Egej{&A)&U`p|j)k=49yun1e&n(s#(94~MU83>t$FWZeZwRyu%( z`a6@t&TX?g<75XOTmgSPJvCja+bL+#`$LO;9R>ixfYjicygyV@^a`uW#KRyp56t_{ zS^^}Dx7h$%h4F`zuHP{e=m2ek^iF|2$YWb>Ko_x%{NFspO1;j^l!W?=T4Uo8sQrr) zgoI~4Y!y~^WYM`6InZd#h@_>s?j#k6~~Y5%Vj#1Z!wP zrKMz=ytm(gVgo4?o!?Hd{-dV@{jS}gU0+)tWL0!uq7^DWy|{_{=RE{ELGB6mhw~dp zAlqMO--tG4D$xKcN|4)iUwerqGIWTK?jO@{WkLIhCQsiyyjxH}1By%-aMr~YJ!0A< z{K&u%sw_~|tv2L;!F&7V$@*`<4j?nrw;Q#1ya3I0{EU1_rF8Ju%1=af3yU6ijI(Wi7OgxMjme1GPma|smfZCwEd2Xx zH{@ra`W3D#m=9NCd1kZ{B7i(JXY*q3G@PwpXY!7-ljF!5<*GOXlEPo+ekE#jII?t1 zDEVb|P@h2#>rC8%buD!~jisLdjX(aIzS6mG+6GzC$|$%Kv3)OhTgqQ!7%aU}Si1O# z$}}z&S0M5)q;gxzr8*oa<;yOwp_0{8k{z6fQx(m1skCRYe^{^MjOttj1oE5YZiImT z`Y)0>Q4;>01hLfxr|oJTbJm|2F^_jBwS(_^dH#IqxLC9E^jOhovcmNa*V#9{N`ZvK z3OUmQXb*O5*I2X9ADH9Jvr6k%s`hX#G!JjIik>_{JaJgeqKF4Eaj2T7``knQ@-koB z!6zKs187yYuFlQoS_sZUbo%a=?>GMch3u7!{{*-(l>DWI-awu7lU_CFz*&s{s^> z!J*QyUS3wvZN2#Ch~#>^Z_2vJ_k@+3$#qJkwJicCI*h&+!v6(^yf4^id6kqp#Wi6n z#`%GLD!Uu=Cgn)LJ?CgM5fh}8BhgjiG5-=29Q`LtdsMGp;z&fvZtP^))zO}lZb(M?mvF8?+jPfuE!WQl*7-QwSK&e zz!8GDa1%hXIsDko4q2KY<(Cpf&ov6MHKRO51yw-}shJ z(yH4ezu01<+Sl|BeuihcBPj|3{ReXq=3X(-+l%CM4xp#_FaSLv#Y(rAKi=9)ZzK{k z6O0u&$j$jz@A}EzP9yOv1oUaFZ#gwoozRE!C5zP(u$#7soyTa2Vc8-Xdv{qx6vIu?OMm*wX%e3)YLq>yN5a%oIb|?Vk{H>S} z{;}C~4x^&}b`I|wm8jAlpXRoh(XD0b^lP1$Tj@7Lqc$K|92o4>cEHg5%l_q zMkO32W%~=bfP%yYZp~$K?a9+Zs`M#c zhA12um1jH-qGt8_qh_4Ia2I%vr86@R#z*yGZ5h&t#%z1VhqB1EYxeyIckQ-IYs8Go z=BWVN_Emc^zi=xJjTX_M5Z+<9i)b2AYixwwMY>XTAyY*pb>@>{qsP&s7cm?UCR(mp zwUff=ENWwnKkQ@Xgz(M<_vXDKfwvh!&9(z>gV(-Ue4?=CbTF-bvN3jX{fq#F z{UWL!ohniVC4bU4DO*?0Z>WY+04Fz!>v09@-79WiY5;m18Ddb+nNuq1dUJ`(F=JNo zrNf`&(uSSDvl|*F4KAm2F$^LT5kVm2R6AfKK*be~rD{DG8G10pNXV1Y{Ox+?JL+tcrI-yq5A6}dJ1H3 zNA#}9vMJHrJeCz!1aZcxHh8;@pR=XTIW>UmE*^ac() zPYRUjWNf%Tvt+rF*Ftp=8@(qWjHS z!j+Z1J2PgK4`)KYW~0W%aj!PH=xf;E!=85f)ys)%Gs-+&v$~Idex>p!^~|DY2lxmS zB;U})8$+#+qAx{gudhQ%ReW5S;DRmtM}_HJw+3ola4lk!G&H;*>`f%Ag~|Mp$3|_B z3nd|M$Drk7^cXtkVO!6jz(BI2gA@)seP|1+RIZM=CIxRUmw7pwR4?U=`hrhs8aY9k(sCTa=6s?MPH-l<7iFw->0%E z$jHewlGDYJLSDSXATRS>&MJ)=g!0&L_59qA_+uqh$^Fu-HzAj^;9R(H=}>c#b^Z z7JC$5L+BH5=$amm@vxq8d8hOeyN|^{G%fsa#d`m*6St^xW=1Pz#*Nu46KIWUn&k?dwDckC%)mYK4_CExDbc%KR9j zcyN7KxO%g^*dlOn#`{?XyV`o)On>7~58ek9ir^{(46*R;ceqi8lc5yx6hT-P451)JS=Mf;=LBOb0K>jSfx3vb3Ny)!;xvX>t{|w7|}rXX!JOGdsEHX zK{*RmNzcfoBQx%Xf=cE%(UtP3e>l%u3e1ykzH*)~kRF4BN;B)(T+}tgwgWVUdBaaR zQY4J@+m0HeAK0i&#DmPvkWBqVKfL@Qn)%l~eEUWEwtMlme9C?3H}7TbMqdry9(lQGA~ zo$*+Xe8}(K7|;Q>8GL_4gNAlWb8bge{!xk}nZN$&d47hN!Y@r!5a`#hb?!V{qXHR~ zU^;c1uBg_k_`lq{$T{pk_N zi4+qZxa&p>?~_*h7hLRBmT z2v0UW`$Z04_`9DTBk;ffFIoAY%CPYa>QZ&5FE+TnaM?9`J3sAec!kL@Nt-DB6NRsp zDdTKu=Mz$jJ+691-HZzg=oiOz(epl~agvl4Jn!Oby99b6ua%R2PA{h6G#qPggT-+y zIFV4DF<3YId{lNcyj;I&nM-HH3&}d*BI2gAEo}Mvr-%xZdhVH?AVko9hTmEf0krTP znA72j=FJAW_X#fhGoIFFrUAUcPFQ{RilfBsj~YW>Z~Unw#>)}2i~yHNM8ZeE4L=k4 z?>>cDGw7RWZ$)tD`3o_ExG}7a3VQ8SjRt=CF*l9!Wx50=1idWz*I3X#n#YA6@f0S% z9CN>@bvqA`Km{Lh%9lc!%rG5)4BP%BUB|+Ot zPo+Z?zIdL6Sk03A?dHVy30j7iT{RExP~Vwc_pc}s5lq@GXIq}nGvx}!Mvn&ZESukg z`ZUef5w2N1oS)|C_KNaW-Cl(U&LV$i5+z!BeLU0oBA;tgte$WpmW_PKz=+G92Hmnt zp4Y*lwn@*4ZfiPI%9Wx~P|?aKudH^t0_BjyJNKQy)o{b50lAc^vcSD9{|+(E6?bPR ziFzgh37Few`@W(=%7}0nbQlV?AL)!Q-m2po^#Z+B`fjzm3KYuaoj&8?_V0q?>d}Gt zU2TNwaC$zs(V)WGwgRzutvTBUH!ly}1I(Wa9moXlv2;)Z^jjAws8-fP5+x7G$sSYU z8R=)=&XDd&gTWr+zNqm;tuhxfo6cNZ5K4^x)olUT@Zr1?yukCmH$Tbzj3>pv2QKJ2 z`Zp6N*g?nq?giFLc(M~eXN+iMd=-)}SS_ARLb4wRfG0oA%QvriR(m@H`zZ-YOm^7*mDt`i&D5Y5q z8Qh_?Y(^B>SoHh&hFB&;{pEU$)6;Rw$>kJl*7=PiFA4eFJcSWR%tka}i@jeKm$Ex# zc;?pA>WUHijDbFVO}18z+J>|&F{ecv$XzY5t`Tne1q`NBo|>FhwBc4_cOaVh9gDH6 zedSc*dUbFC9_HyANc{A08W(&HnCGg0vfYW<1b}gu{LM9_! z{lN=X;BbuVOwel&tn+&`?2b+yqR3|imzcGFuzcg`=H}tdEbndfL?o zkI{jOt_s>%GnOI6`;~^s3A0V?j+L6v7ra>i;1hCL&-lm5I?#Vf*_zp&^%ZJT z^EH!%=s73OmsjyNAJ53sEhle}RaP&56TysUiReU4V}BT{mFDVX+%)w zCQy7AA{k1=yVGl2-aJhDiKl*K927YUOgX%?^6iS8;3qhJdQx`2H;QoCU%#Hwz(nvj z+2hogkMOp3UKpG+8@>U=4yc(NN1UKvBWF(y^a#)!+^iG@{D>Z}3TF0FM(fY_qE7!n zAcr&h-fV71O3ktT>ffQolAh%w6NGokam8k7oejXU&||g`Q@!e<`Ic(=FkYP3LrIOd zXLK*pmtdEyQGrnX6;FQHRs4*lErjR;)m)v0R;AA}{6Qc%FpzC5!u@k}_SjU|&mzb& z{Dvz$a3fKhq%BXijj{5fdwT#Qj;<_F3*&`fRaRb)icSmNa9wuOs{Ltga3Cg$fSdAZ zGb@om2Z)p=6qrW;TAmERwQPoiF$P`oOsK;0tz9jSmln_V1lsR9gc7~nMB`OP*@iI_ z_a0|D#ID-!rhZI|^#ukdMmn%f6A3x>vmhcON`M`v3U#S_?)O^C9dlxjCp>$KR4dJW z-sN=p=4>PkI{1X&BK7G4-LFqqIzNvyV<#!+koDK!wc^?%n&zR@hy6QndfvgT@J~} ztgh2TW&BNEjNtIxn*X@A;|<*gnqg>E>d($~wJY7acCD82ZYIvl(v=(44(~1IeO9Xx zL>0ZOhUG6ogL9Zj4!%cqg_cJY82100A1n)D;<-Th;quE03F&?Y+ihfP*=fN)Vf<&1-+whwfvTvj2#kh19>-I)Yongx_XjdEWINHHvS=ZYUSn=GR z?4E?w17AgV$m=f#ulR=^_Yi0*5_65;ST*T#>SWU7@~fonXCP)l6_ne=z+I=TOzq^sW)l zo|l>iEH@O4IllFJSwZI~(vAG^z=$;)ig zrz{;wrVy2Wzd!k{`FtGN0k&Q#bNvwkn~qxp7@P4+(Hi~N@eTKuevaY@8vta3K8^%9 zONN3hy*J5l71fSk5gZ>MA3F6tVDtJb7AUej(oI-1msk1ofOQWI%ZKlQ&jp-z|KKS> zzF4T0k8p?E6ZNvB2BZJ76IuIS4jzcW3W*3KClm1YWf6UFINQ16L83&@B#4B z4;2&Li&4cVJvIo%o~06O^u;J}3^AkotmS(q0*3cWp1j{F4tEcCIC&2MKe3t2=8%bd z@F)2>Yz8*Pwbb0WnP1)_-AYjPNCyQKQN+=#Ed)m5j-Ivrn4O%Z)+*C&t}`sx+l#=W z1|~Bi0J172KGgzvea8v+1g5KuikeN<<8gbt_XhPFyUM9U^HKZJWVPl%HW`K_MG!YH z@vn~}K<&oYB}uL`g}g$KhzMh2=bYgB`1ggAt;lC%nS{E^O7n#VX}{CW>4?56iowtr z<0O_I12xdUsxn0_Q!**BKu)f2L(ZYG5m|qz3LE2au89$E8>NxVm|G#4kf;}*MQhz& zE8Zw629OFSWfSSjVS`QqD8AFeKFq&MstnKSkG-U5YUGvq$wH<=gWbrZ*jLH^Gvb{g z1+~z?r@i%2W3A{U3h6!6{J|>U?}PuU)z_?O0%H*eQatodK0ORPmr z>wdPVVi2U(n7)5bV-)H3cR$KtCv%GL#+`#xto3<%@2A-xKaBA$I2PR4 z`>PnFqf6chzH@d*5bgkKUmvIE)9nebIaOaVB^Ji0VF>*%c7N)@U2?lqed*X}#k!I= z{DFW`ptM0&EwiCwa3@&*&s-{M5+X!>;aq8cS_o~UtZcL~6_#PBJrT7u*=IMF^&f~jki z_1mb8^baE5tQhMJ8!>P4LRSnza|LRML9aLg-$4dqq_MYBr4uT29mZhCx}TwPWzip< z^C&6n>?3MK{7v*_5c1z@hr{i#PG^)?K@puEQvpTAeAOzXzx*fam>$asQ)zQHjp1UW$cPXpT+<&&RPXcX_jp79WUgL7Ef?>S!Yx4seM z^{!cbal3}i%kdI22H+;OhHC5S zt@Zb_?)ogfW_37sk4{`^DRxVtbk6K44+I(*+y6`E=tYPG`^VYY7(LHNPS4tH%ebwj zi-l5$UCh6f3sWCg!$Q}}t#xX4RRVKZ5HwwmN91woo8h;@6l=wb{JhK_e|`~{zqUr= z9=0zTqEGt%;)u)9`dO4-GlyxjM}5*xVa-mfx#F27dT2ZC$Zith3*yf^HE?Awg;~UJ zoKHj(Y0U{XuDfF`#$(Ed;=K4dfret!3Z0UR(9MUGbUinPQG@Y69^1X#a$ZpdG_#J& z@i?uLXhLsAbxu4qu81YLTQ%NIWt?37_%0}rnz2*=j;rH~DHq@9Rj`9@&sBlO(w%cf ztOZJ{aq;cy8}i;;`XupYW6#v4*LS;SJElcz16OHm+%{qnBnjC!uR2{14{i^O=<(R8 z-_p%+XsuZ0xEAQt9J1EGTONJ0l3`K_@_W_;_{tloWp0zWCfk=8Z!|E147TIL9C*+4 zW^Bh6E-xRmnK6T;ZWgTJ(=w%mNgv5pGfI8`T??SHe9V3GSsaWKLDE8_RfZ-Rdwn2c zSDIN3A(^OlKWSd%N*#FbN>kq4ctal~^+xE(el$;A>|u14k}mEQmZM>MVrF5I$X6Ym zlZNadI(Hn8orQ9CKr0pRAa;qoFU0MROU7Px!nT3zb?7HO!3wYJFFX~p_V*(+VntXXqD@o0}+OO{3T+kuB5X)(O5ow#~m4FTIKXj z6nz~aFir!mowjQ@VzzC0IF%#%qg*eUmT+mLH&{mtr+%oHAzm0!wO#57?jH#UowIt~ zgs29<(>S)r`m-no$Lrx-S58h%=Fv7wQbcX*b1LM5C-aq!sNtnU>TN2a{C2yw_(_Qd7xtc-`;0q}``)R+$gj|`s+SGf#Z5CkjT5kqe`<2u`c2<@u#M1`mj4SwUys? zt-hARW+|Dfm4bW$!e+n+RsjPK6_wDLLEjYJ@ZRPeVgi;c3BdYDZ=&9$#N+|iZm_rv zrh*tMNXZUm&izFn5~5f(Co!LTbs-KOp%_@AN1SA(-SslZQ5{N+3k;J(rB~0m;8ok71DztHUEdqnF z%;n2Pz+*Nb)AJu>vy`LAk|PqaIdIgAhVlSf>rk{DSJ*{|*U@8a$KLh6%rC$XGfMmf z)0vP%5HcXU=!^go?g7Ag)%s&8q3tuh`5D_!*&5bKG^}K6VPW2{fP`=Et*^(eLW4g2RL5+&7@|?QNYBf=v)f z?|Sz|7g|MK-m}dF*XN*bI(|R~h>4iZdWgw_Lj(W%MG#^eGOUC=1AUVNz>!gJGuL`rRxFN+XC-)jCT<;FPq%A#x9N6YZ0+}@mm-Rj;5 z#fJOR!>4^o44>){1CP-2;IEHJ=0`TJ1Y@4l2hZsMdIf+2MDR7N1yw2Ls`V_lrr%Qx(jnTW=7zyn1HLZ_HRHzc`tX~T|7RRM;H<}T`5t~ zUYuVM=0<3v52KK!*-a;U zGuK1r7~2k)*G8E<#5ceJMayh=^{ z95U-d43^MM^VX1WO75@jn)3P7WWFk+N2|c=vR#W*XvD4 ztK;yUI&LBcZF3_~ze?n`AI_Kl+{`ZBA9)ej2xk(}tT~zx;C}zt|Hyb4nNs>xz|-UJ zjy;}YhR4Zy`+XsWAX6Qfb}+KOV}w4wh?G`&fK^bC2@?OtPX^#AN12Q8aN;PilwUQ3xA2`C4D>{O|{MC82; z_iFB@*7=I0PN=5Q=0iSJQTX*Q{JjX(SCiKV0esjHn7hONPrLCF70ZAl<>vUh^}s}2p*=t3LX zYdlAX^QXwo}Q!X4z1ztWx5wX~Kqb#RLPKNR2dS(}u)MBF8{Za?WgRb;dHxwJf_C+RLj#S}y>y(MzDk@W7>bc( z%=^I9cNJ7WZ=R+gE~`}47^{5sCnW=3iF7sD>OOyshKY4*n16HwiFn8mlx`#>!rrKI zb^Tk6cT-_TGZZVb&CH)M^9xh4oT8KN%_JV0xtgeAWM`R`{pZzF_V4v1&UWs(gd&v1 zNs*O}$98uu-LP`Ct~fJ6m+@GInVwhT_nob%Td)Q~a#X;Te8_rkpFNTOx-Bn*EQ7qXn*W^1r^GWDoU-}0*63T>Nvdi^vk5hT?{(|OJPTBizvu15hi~X|HUZzaJuT;qvnYDpFmP|G=6PKW2=Q;;Q+UO} z47V5(xlKE|wAPd36{am2s9Ss-;LZ##u74dvLqoi7rD(_vu|!Uc#Sk1s;{|;zu-4Y! zy8b;&6!E*XF3EsGsG{|j?Fad8nGY;&XDe0P!-`fzkk!_L0(}W;=h`v?!tr6;J*7i6 z(ucus?KK$rwA1gpJIcfYpegD~jV&rT)DpLdgBHd!UTNBnV~SPuCh>Op&|G)19^SSX?MZ1p z_%25~Ua34T?kY7Zy9bS=lC@%cAY*UO+oyFG@=yFcNPyVmYOnpgs@A*Lp%Bu{`pF!$ z>s1#Pz`SfTk;B=A{mKJ={bv>R1E#4)ahv+o&of(!D40+Xsfp^~+K91pKpX=W%UNEl zB>YQ1mh#$qyQb$OHCEKdQSDJ*E0~OomKK-X`8}WLN~`ru(_w809&5^bG6o7JDk>q_ zXMLDuzMbWI)|g3ch35BRho~mRXpz?hjM^GyA4-I#VgdutgJ0q?@OX$*wDEf0Yt+b5 z1PFOxPiL3BkYxGqV%}I$d-~-uqnJT7tKHSJA8ylUp@U$DowEcTOIfiA+p(?1;JQt? z6?%EWGCK+YXxPcY*DpXlrrX>06oHaFio_Eux8ox^9 zqF)cmz5XPug5ijTiGO$!Zrux&H%O5sq5N$pA4U_*d27la17?V{aPWw6lFS313*$a- z@#^@LR~oHuF@^Tpoq8~-b^*~W0^7mKA^%3RV4&hqn-EFRogVW9yf%oa>d7rMzVu=v zXd}lLT|X|Gf~^PNp7H?KI!)(tB#4cRLW}Xs=O9M}mV5H9AIR zFLEU#dHK%1HBWwT!6lso@Kc<_Cj};*a#{4=MoU_=io6X}5n>#yYH}m{iiG458c4Id zm;Nvje!-U#Ko|4F8;^(Bn?AenMK_#QvOx6=osa`$Fxj6^h7pcc^ z(Rc-rqT>y5>jXv%+Z0o~bC1h){R-`ef;U|asm8eNLRhxx&6>7-k)NqTrP@VDZ_b*v zb07X_24$sx7bO4BTr?lS-?2Wh8fThl)Z7fcjk#?Z6U!hg}VJ}T@@#VL>Vb#pI^9>MR!8QffHSl9l#!&hn_Vb4Zz@F z2}I%_xX$~_`TFqhF>r3eKxN)YVto%J(T*ZL;+R=HSc@BJ>BuIFCJfltO}G4>@@lY* zPmOVr>xj25<@>eZ@#VZWTnh(&%vvUMHSX9%y%H4{amjqWjc{A{H$=ew`XlWJ`>q`Q zC3MnP=%~_iQeQ%~G)tj5;s_Y8GjVQd>(82j6Xp| zFWapZ(ANW5-?04;+Jx|jp{ksECP&k_&lP_Q@}nrI`Gx9SpegLc0xEsRqj+MPo@zp@ zo+X2qTp?UdbKN~{7km)9hS7UtUH@VJOU}pSW@Zjx=ci&DYMFroli?^{hpAz5XsM~K zLrPJk6wXGY$4sZw%6ZYY=KVgiGqG_dwfMEoo$*B)1sTkLwp;paNr!-$uw}^lFug|s znLjU@Zs_Q|dwT{9{`$M~w+TIexMHYA|5ufbGq#aIPW|Cq3*`4?WG3cX5{n!luOtBR za@vd+C5MIm8be2QzdD_twA}VyTl?yx)!=l|qP0-QWJoy}|ACCz72O)|Sw28F&43e z1kx{9K4unvS70jEOY{;m=z1+}mZ(B#{o~~)C)m_;zlPZQ{Kvu__#M zd8d_qZId+G1Ebnt$G>E7)WSVHrY?TR(u{~ z0!(xxaQpX8^rMJ~1(ky~foeFmCW)}T7eMsPA+`8|u{gP$v=e$(Mb zE>;^Gp15D3`*C=i0p>|v%yM2p7*Q3U6q$-w^PJ^aSlPO6HiwDrr`*|tn@)lxdhDfU zw*9S2y6a#K|^rMjv*3&2Y&}bvHn-M~%IW46;#r?;#IAqD(P8L-e zGa6=kA6#%K%>2{7HAEX z(JVB*+YQbGqki7Xw@;Wo&iOz4@9>w_bu?$y;kj*?ky(ORl* z0czgMg9JL*Tg?fB)zNPBu=*pbm9|CZgnh=unE{%U)tTMJ3!l%Nzg#9!LO$yxRj-LY zueO+*D1S#Hy`+Ag?v}}hGahMzj#(fvid{oms zI_@0tKY8$cgNSsK&PRw5KT&+~(C!K|Yi6SPmZ(J-u%)P2_A09T zV+58mWU2kG9M z2hJOx{=Klp`eJj{$u2eX9*iKc!$$79sn}$#;SQJCnYH-hDTFgw0Zf6v+e&BMqda!z z?Fg|xoz-tgy1!gMPO%4{-}W8&nc!G!yB3;H7S#M%`V*`C5u@<&g7=0YDiBkT-;+4& z$o;StfS!Vo{@OZrieRc}a^@zFHmo2iG=6uoFHYLpt4kNL-DfK`R$7hz6^}~5nw$xG zGM$QzJ|XAXG<>^(O^X~kaL_2fLa()%dF$n6@o3458^@;_$}1Qx*BSfp#HrZBay--g z!`hFmY)zEq;y3#OkNIXFV0u@RF1kv`6__pp$tepn0v;~UFiymW{L)uSn+}NO!46-) zs+^7jftOGW*`_Ab_8P;7k*&;uoG&Zl3X&@WU4vCaG>vJ#@9=jj*=5J--&J~->h5SM zuJCc$w(eP{+*hQ=vR<)cGL_qF?iFGKd9wU~lKYSkvu>N3Uy z)=7fc{b!;M#jmk^(R_@$5|HyQ?H;GDDSA-<1aL9De5QPRbz)#3H~RY<28MCN9=m>& zkF_bg{+Pi(9Ngfkb$fCBLzzYMTbi8)hcu!AQqtvxT@`)|jOv}LlLE2kuleB;ChWCY zi)t96aI4gS{puACPn|5POgDpTydbT`z+EzX-N#xlsrNUfKUyyc=_e^-m04lUML zjs^mv>K(3k5%C}d&c;QvJ&UeVfYTlRUwgMyRuezlQ}Ye7y+XlGXumZVP6>YT(^JoV#+q(B%2 z&+1KO?HROhtJIY74mL4F%G@5_E^s#lopx+wgpTxcEdRrNw2kq7%;#GlPp|I(4$<1*On}^(CE2xQI zTRVCr3T73g>z|ajPdUf>rDLx)A0|w@Mh7;;Uh%mVjzZP-inmBlW)k8=1OYvPNm2># zLDV;@e}h=qf`<8{3pExz7}J&$HF_~r%;|!qYPox*#hNyHjj5~W|Aww2yh<_KQW*x5 z{~xIH?FGBH|AQQKXSBWQ*B9JYuI8z^8Jlqqbr;i<6HqZT4^#VbId7lf|IDS6e)jyou)Q|3z8~Du>-!5 z+WQ)w>s)-Y6?=cH0f^uL&Q+uA>c&v^vSKJ_kvU^Cqy@2(^$N~$8IB2BCqyAST(4w* z-nPPBJ7aA1@Vfbd`cU+f9|)>O65rk;T_k%EzB_r;Jx-zHuz0*W7HOp#CKK&cp=xkj z&<@!I*l2=(MxlX+MCtLYZdon5^K&^y2H*@n4$E14AqT1dl?5N(Hz%2|caG7ZLjZj% z`K?X`s_LI80#06hhoKc;Sv0$`7@ccBM-C`q{WwX!9he!;*MZW5UQq!8`-4bI zt)$o-IT?@Jqn|ll&&h%#!qjQ1?EFjt2`EzNIskl*$KEb_Tm8u)qy0_b$dwC44YsUTEarY!O zpc(kgfC2&uA^Vg08^!rA1~D z!`pb%A;B_aUxPXlT!!>(;68xnpJvhIJoH3&4;xD=+}*|HD*1v5JH9mhv3G zTTtk1J9?TaVr^nbqx{Emj=N!dxm8iQQfsS=8F0>H!($5h>JSG^-n>o(hI^LxRJ1~dNxQDI>KvNIm7Yk7vh89TBH=95SNeF| zBuV`X68@*vHpip&b!ly=t|Vi-GQL@Rik@8I7H%WEMQUyE0r!;#w0#!_VRqa5!Mej> z?Z)=62vwk`U~_~$C6UjCMT`_hcMEsB^+b;+orPQ%jrvN=)-t=Iv2b`>U6W#O`#vC7 ztk4Vj&}veuLGobSMX*w!h9&*qQGxmC5nmRIjJt20;a68QWMm`4LR;q2;i9VbrxdfJ z=koIFwpRKd_rHAWnl+oRa(Hdu`mo!|A6`o|6Nt<flDIw%f9z{^x#y29hek}7 zkU9k>&+V=xLi94BSJlH6+<8sy&c|a9N35i~_nAI?1!#*P5Q?odSVXOe)#`4>|GOeI z7|b8_uk|mA?440G1ARg+#*(Oycc*o8K@IIQ!9v||6a7|XC~s`NAz)kk-(`*V~ zIa#J#ZBcip9x^3nlngB{qY2Z;^|kIWY-ip&NWFE{q;0dJAPbXeKQ*&x6gQMoa)w}5$e95i^3qHf$-xf)*m-HD2$<6AJA&d$U)`K-Go{v2|)%ZTeXyo`!C@lRHU zv#HbANozX?uhtqvpo@}YmnZEjDi}e`EpKk?p-z_vmHM9Q@#Tk$l<ZP{MZ)n zFlO`X zHPTYQ9Bo1>t5D*K?uRLqE5sPa2L*vp@{`71Sjq)nBMFb4oqRwA8<$mH38`9=-a%R; z>zqOHojv+&nD>v?5ilf+1Lgf4J6As%pMO%WagtXF@?U!ODyw&7rw&(RE+3BH?Y&8i zZ3mo!DhlbUrwt}#vI;Q8b5&@A>2g&#Ebh6#?%X%Ye00x#+N;jiLe~ zLts6NVvl_&OE`=FKia~W>KS5CpIF8me-tnYPsqS?`|-ub5NN;?w$)Fg6sa-G%zF?5 zHhac0-P1n=<=6RQSpfOd4+eKs`PwL|6$zk+T!*6ZHoj~`{`EzfI_(@iZ|R?#{P6^t zxyZl1NzZ>&wJsufn&nyJxAs-MHP2+#Wt|a(ktQ}$&lj12H7CM(?5c0P%{VpJxd9mP z%y(U-wgXc+`TXa;1%eTlVTo0Du*nuKYh_r_=oB=123E^++Kmlkt0qT#LIl}HyR5pzcilZ*625+Kl@F0#hlPg0d5$%ujtQ+3 zkQ#ro`Ylq|6(+OvpOh(vS?(ZX{7foi;nmzRwfs40tbcmfQTe}oq)6w;@V(~P>} zZ!K}Rfs9%Y!~OQj>j+@7be7AoTIbwg9AoKd>G+(8lfa2ud<0>Q949IBR2}M@FVYgE z0h8YNt(}mTY?dFAj&GjOtC4oOPwDMz`C-ODKo@ckd)Hg><}ec#N@D-Ud8hhNq7oq!qO#On)KrDLG$VfkgT0M96$Cd<$W({~!DO z4`T4MKzMJ9TaZbqHXgm!UdycXlX;Ts?kk*LrYM9D^mowYng>i!lYsh2!n(wgI4;fV zU^!jH!#sc-&uEs~lYYX=N~yrS?y7)P+10kN_uOmeSZ1*%Ce@i$hM)BV5`s~vvV?v* zftJ4t*JXto3bpl;2q42z5NLyp8vK60;%G|#N5!MI4SqF}7K_4^-cvcy^j>}iH}|zb z7k)phY>cxM+X;nYXdvL}DkEv9H;#~AYf zO)}!#-aPvN$Z9q+*)zArnn!w<#CF5Y72O%1dWR8rvgA6mxe2jMf&=@LS|)&D5MU^v zm(4|oqVGq|!?z4}{n;$HNN(-E1@S(-{qaT^HXg{@50`i6ua-z-uLnjy2a)9-c^iGP z+i@*(QFIJ*lGa?F?;b_5ruc@wANW9x@2!8z-(Hdo_p-HwJo#l*;_@6voMsF6^VyPM zY+{_k+~D`NxzE$iT_+)nc{U3-*9^&Cpem;7bs^S4u8cljiziECF(07YA$4l+IY_M%GuQd$OYaUo*F8;#X)ly3=7dyYvdU({ucF%FG+WF8tSDf`{OKQ0+0K>xtU>t@ceuG>~`M;^=M~1-Dms1HMh9C%>IkS59Ra8!M~(ZuT@X|lv5|h z{K53}sb_8LGaKGacDZ=`v&&5`(N`upi{3^#SR4JGcT^#@Vb6rgvYf!ed=6K|PooD< zy@A`_Sh=Nu>vg4o{WxF;3&#dRLZkRJ)A*nLSL)8qCZ$W303FBR>FVdQ&MBb@0G88B A4*&oF literal 0 HcmV?d00001 diff --git a/plugins/docs/publish-package.md b/plugins/docs/publish-package.md new file mode 100644 index 0000000000..c1066c750b --- /dev/null +++ b/plugins/docs/publish-package.md @@ -0,0 +1,84 @@ +# Publishing Packages + +## Introduction + +This guide details the process of publishing `plugin-types`, `plugins-styles` and `plugins-runtime` packages, which are essential for plugin development. Below is a walkthrough for publishing these packages and managing releases. + +## Publishing Libraries + +Publishing packages enables the distribution of types and styles libraries. Currently, all packages share the same version, meaning some releases might not contain updates but will still increment the version. Follow the steps below for the automated publishing processes. + +### Previewing a Release + +To generate a preview of the release to check if everything is as expected, run the following command: + +```shell +git checkout main +npm run release +``` + +### Generating a Real Release + +To create an actual release, disable the dry-run option: + +```shell +npm run release -- --dry-run false +``` + +This command will: + +- Update the `CHANGELOG.md` +- Update the library's `package.json` version +- Generate a commit +- Create a new git tag +- Publish to NPM with the `latest` tag + +Ensure everything is correct before proceeding with the git push. Once verified, execute the following commands: + +```shell +git push +git push origin vX.X.X +``` + +Replace `vX.X.X` with the new version number. + +> 📘 To update the documentation site, you must also update the `stable` branch: + +```shell +git checkout stable +git merge main +git push origin stable +``` + +For detailed information, refer to the [Nx Release Documentation](https://nx.dev/recipes/nx-release/get-started-with-nx-release). + +### Creating a Preview Version + +To generate a preview version and avoid publishing it as the latest release, use: + +```shell +npm run release -- --dry-run false --latest false --preid next +``` + +For example, if the current version is `0.8.0` and you select the `prepatch` option as a version specifier, it will generate the version `0.8.1-next.0` and publish it with the next tag on npm. + +### Help + +To see more options, run: + +```shell +npm run release -- --help +``` + +## Important Reminders + +- Ensure to update the [penpot](https://github.com/penpot/penpot/blob/develop/frontend/package.json) and [penpot-plugin-starter-template](https://github.com/penpot/penpot-plugin-starter-template) with every release to provide developers with the latest configuration and features. + +- Update the API documentations following [this documentation](api-docs.md). + +## Relevant Files and Scripts + +- **CSS Build Script**: `./tools/scripts/build-css.mjs` +- **Types Build Script**: `./tools/scripts/build-types.mjs` +- **Release Script**: `./tools/scripts/publish.ts` +- **Publish config**: `./nx.json` diff --git a/plugins/docs/test-e2e.md b/plugins/docs/test-e2e.md new file mode 100644 index 0000000000..692e862a2f --- /dev/null +++ b/plugins/docs/test-e2e.md @@ -0,0 +1,82 @@ +## End-to-End (E2E) Testing Guide + +### Setting Up + +1. **Configure Environment Variables** + + Create and populate the `.env` file with a valid user mail & password: + + ```env + E2E_LOGIN_EMAIL="test@penpot.app" + E2E_LOGIN_PASSWORD="123123123" + E2E_SCREENSHOTS= "true" + ``` + +2. **Run E2E Tests** + + Use the following command to execute the E2E tests: + + ```bash + npm run test:e2e + ``` + +### Writing Tests + +1. **Adding Tests** + + Place your test files in the `/apps/e2e/src/**/*.spec.ts` directory. Below is an example of a test file: + + ```ts + import testingPlugin from './plugins/create-board-text-rect'; + import { Agent } from './utils/agent'; + + describe('Plugins', () => { + it('create board - text - rectangle', async () => { + const agent = await Agent(); + const result = await agent.runCode(testingPlugin.toString()); + + expect(result).toMatchSnapshot(); + }); + }); + ``` + + **Explanation**: + + - `Agent` opens a browser, logs into Penpot, and creates a file. + - `runCode` executes the plugin code and returns the file state after execution. + +2. **Using `runCode` Method** + + The `runCode` method takes the plugin code as a string: + + ```ts + const result = await agent.runCode(testingPlugin.toString()); + ``` + + It can also accept an options object: + + ```ts + const result = await agent.runCode(testingPlugin.toString(), { + autoFinish: false, // default: true + screenshot: 'test-name', // default: '' + }); + + // Finish will close the browser & delete the file + agent.finish(); + ``` + +3. **Snapshot Testing** + + The `toMatchSnapshot` method stores the result and throws an error if the content does not match the previous result: + + ```ts + expect(result).toMatchSnapshot(); + ``` + + Snapshots are stored in the `apps/e2e/src/__snapshots__/*.spec.ts.snap` directory. + + If you need to refresh all the snapshopts run the test with the update option: + + ```bash + npm run test:e2e -- --update + ``` diff --git a/plugins/eslint.base.config.js b/plugins/eslint.base.config.js new file mode 100644 index 0000000000..2745f27ac4 --- /dev/null +++ b/plugins/eslint.base.config.js @@ -0,0 +1,49 @@ +import { FlatCompat } from '@eslint/eslintrc'; +import nxEslintPlugin from '@nx/eslint-plugin'; +import js from '@eslint/js'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +export const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, +}); + +export default [ + js.configs.recommended, + { plugins: { '@nx': nxEslintPlugin } }, + { + files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], + rules: { + '@nx/enforce-module-boundaries': [ + 'error', + { + enforceBuildableLibDependency: true, + allow: [], + depConstraints: [ + { + sourceTag: '*', + onlyDependOnLibsWithTags: ['*'], + }, + ], + }, + ], + }, + }, + ...compat.config({ extends: ['plugin:@nx/typescript'] }).map((config) => ({ + ...config, + files: ['**/*.ts', '**/*.tsx'], + rules: {}, + })), + ...compat.config({ extends: ['plugin:@nx/javascript'] }).map((config) => ({ + ...config, + files: ['**/*.js', '**/*.jsx'], + rules: {}, + })), + { + ignores: ['eslint.config.js', 'vite.config.{js,ts,mjs,mts}'], + }, +]; diff --git a/plugins/eslint.config.js b/plugins/eslint.config.js new file mode 100644 index 0000000000..5252f62475 --- /dev/null +++ b/plugins/eslint.config.js @@ -0,0 +1,119 @@ +import baseConfig, { compat } from './eslint.base.config.js'; +import globals from 'globals'; + +export default [ + ...baseConfig, + { + files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], + rules: { + '@nx/enforce-module-boundaries': [ + 'error', + { + enforceBuildableLibDependency: true, + allow: [], + depConstraints: [ + { + sourceTag: 'type:plugin', + onlyDependOnLibsWithTags: [ + 'type:util', + 'type:ui', + 'type:feature', + ], + }, + { + sourceTag: 'type:app', + onlyDependOnLibsWithTags: [ + 'type:util', + 'type:ui', + 'type:feature', + ], + }, + { + sourceTag: 'type:feature', + onlyDependOnLibsWithTags: [ + 'type:feature', + 'type:ui', + 'type:util', + ], + }, + { + sourceTag: 'type:ui', + onlyDependOnLibsWithTags: ['type:ui', 'type:util'], + }, + { + sourceTag: 'type:util', + onlyDependOnLibsWithTags: ['type:util'], + }, + { + sourceTag: 'type:e2e', + onlyDependOnLibsWithTags: ['type:ui', 'type:util'], + }, + ], + }, + ], + }, + languageOptions: { + globals: { + penpot: 'readonly', + repairIntrinsics: 'readonly', + hardenIntrinsics: 'readonly', + Compartment: 'readonly', + harden: 'readonly', + }, + }, + }, + ...compat + .config({ + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended-requiring-type-checking', + 'plugin:deprecation/recommended', + 'prettier', + ], + }) + .map((config) => ({ + ...config, + files: ['**/*.ts', '**/*.tsx'], + rules: { + '@typescript-eslint/no-unused-vars': ['error'], + 'no-multiple-empty-lines': [2, { max: 1 }], + quotes: ['error', 'single', { avoidEscape: true }], + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': ['error'], + }, + })), + ...compat + .config({ + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended-requiring-type-checking', + 'plugin:deprecation/recommended', + 'prettier', + ], + }) + .map((config) => ({ + ...config, + files: ['**/*.spec.ts'], + rules: { + '@typescript-eslint/no-unused-vars': ['error'], + 'no-multiple-empty-lines': [2, { max: 1 }], + quotes: ['error', 'single', { avoidEscape: true }], + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unsafe-argument': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + '@ngrx/prefix-selectors-with-select': 'off', + }, + languageOptions: { + globals: { + ...globals.jest, + }, + }, + })), + { + files: ['**/*.js', '**/*.jsx'], + rules: {}, + }, +]; diff --git a/plugins/libs/plugin-types/README.md b/plugins/libs/plugin-types/README.md new file mode 100644 index 0000000000..d93947dfef --- /dev/null +++ b/plugins/libs/plugin-types/README.md @@ -0,0 +1,29 @@ +# Penpot plugin-types + +The `@penpot/plugin-types` package provides TypeScript type definitions for the Penpot Plugin API, making it easier to develop plugins for the Penpot design platform with full type safety and IDE support. It streamlines the development process by ensuring that your code is well-typed and less prone to errors. + +### Getting started + +#### Installation + +To add penpot's plugin-types to your project, use the following command: + +```bash +npm install @penpot/plugin-types +``` + +#### Configuration + +To ensure the typings work correctly in your project, update your tsconfig.json as follows: + +```json +"typeRoots": [ + "./node_modules/@types", + "./node_modules/@penpot" +], +"types": ["plugin-types"], +``` + +### Learn more + +For more information on how to build plugins using the Penpot PLugin API, refer to the official documentation. You can also explore practical examples in the samples repository to see real-world implementations. diff --git a/plugins/libs/plugin-types/index.d.ts b/plugins/libs/plugin-types/index.d.ts new file mode 100644 index 0000000000..04b2632206 --- /dev/null +++ b/plugins/libs/plugin-types/index.d.ts @@ -0,0 +1,4417 @@ +/** + * These are methods and properties available on the `penpot` global object. + * + */ +export interface Penpot + extends Omit { + ui: { + /** + * Opens the plugin UI. It is possible to develop a plugin without interface (see Palette color example) but if you need, the way to open this UI is using `penpot.ui.open`. + * There is a minimum and maximum size for this modal and a default size but it's possible to customize it anyway with the options parameter. + * + * @param name title of the plugin, it'll be displayed on the top of the modal + * @param url of the plugin + * @param options height and width of the modal. + * + * @example + * ```js + * penpot.ui.open('Plugin name', 'url', {width: 150, height: 300}); + * ``` + */ + open: ( + name: string, + url: string, + options?: { width: number; height: number }, + ) => void; + + size: { + /** + * Returns the size of the modal. + * @example + * ```js + * const size = penpot.ui.size; + * console.log(size); + * ``` + */ + width: number; + height: number; + } | null; + + /** + * Resizes the plugin UI. + * @param width The width of the modal. + * @param height The height of the modal. + * @example + * ```js + * penpot.ui.resize(300, 400); + * ``` + * */ + resize: (width: number, height: number) => void; + + /** + * Sends a message to the plugin UI. + * + * @param message content usually is an object + * + * @example + * ```js + * this.sendMessage({ type: 'example-type', content: 'data we want to share' }); + * ``` + */ + sendMessage: (message: unknown) => void; + /** + * This is usually used in the `plugin.ts` file in order to handle the data sent by our plugin + * + @param callback - A function that will be called whenever a message is received. + * The function receives a single argument, `message`, which is of type `T`. + * + * @example + * ```js + * penpot.ui.onMessage((message) => {if(message.type === 'example-type' { ...do something })}); + * ``` + */ + onMessage: (callback: (message: T) => void) => void; + }; + /** + * Provides access to utility functions and context-specific operations. + */ + utils: ContextUtils; + /** + * Closes the plugin. When this method is called the UI will be closed. + * + * @example + * ```js + * penpot.closePlugin(); + * ``` + */ + closePlugin: () => void; + /** + * Adds an event listener for the specified event type. + * Subscribing to events requires `content:read` permission. + * + * The following are the possible event types: + * - pagechange: event emitted when the current page changes. The callback will receive the new page. + * - shapechange: event emitted when the shape changes. This event requires to send inside the `props` object the shape + * that will be observed. For example: + * ```javascript + * // Observe the current selected shape + * penpot.on('shapechange', (shape) => console.log(shape.name), { shapeId: penpot.selection[0].id }); + * ``` + * - selectionchange: event emitted when the current selection changes. The callback will receive the list of ids for the new selection + * - themechange: event emitted when the user changes its theme. The callback will receive the new theme (currently: either `dark` or `light`) + * - documentsaved: event emitted after the document is saved in the backend. + * + * @param type The event type to listen for. + * @param callback The callback function to execute when the event is triggered. + * @param props The properties for the current event handler. Only makes sense for specific events. + * @return the listener id that can be used to call `off` and cancel the listener + * + * @example + * ```js + * penpot.on('pagechange', () => {...do something}). + * ``` + */ + on( + type: T, + callback: (event: EventsMap[T]) => void, + props?: { [key: string]: unknown }, + ): symbol; + + /** + * Removes an event listener for the specified event type. + * + * @param listenerId the id returned by the `on` method when the callback was set + * + * @example + * ```js + * const listenerId = penpot.on('contentsave', () => console.log("Changed")); + * penpot.off(listenerId); + * ``` + */ + off(listenerId: symbol): void; +} + +/** + * Type for all the possible types of actions in an interaction. + */ +export type Action = + | NavigateTo + | OpenOverlay + | ToggleOverlay + | CloseOverlay + | PreviousScreen + | OpenUrl; + +/** + * Represents an active user in Penpot, extending the `User` interface. + * This interface includes additional properties specific to active users. + */ +export interface ActiveUser extends User { + /** + * The position of the active user. + * + * @example + * ```js + * const userPosition = activeUser.position; + * console.log(userPosition); + * ``` + */ + position?: { x: number; y: number }; + /** + * The zoom level of the active user. + * + * @example + * ```js + * const userZoom = activeUser.zoom; + * console.log(userZoom); + * ``` + */ + readonly zoom?: number; +} + +/** + * Type of all the animations that can be added to an interaction. + */ +export type Animation = Dissolve | Slide | Push; + +/** + * Represents blur properties in Penpot. + * This interface includes properties for defining the type and intensity of a blur effect, along with its visibility. + */ +export interface Blur { + /** + * The optional unique identifier for the blur effect. + */ + id?: string; + /** + * The optional type of the blur effect. + * Currently, only 'layer-blur' is supported. + */ + type?: 'layer-blur'; + /** + * The optional intensity value of the blur effect. + */ + value?: number; + /** + * Specifies whether the blur effect is hidden. + * Defaults to false if omitted. + */ + hidden?: boolean; +} + +/** + * Represents a board in Penpot. + * This interface extends `ShapeBase` and includes properties and methods specific to board. + */ +export interface Board extends ShapeBase { + /** + * The type of the shape, which is always 'board' for boards. + */ + readonly type: 'board'; + + /** + * When true the board will clip the children inside + */ + clipContent: boolean; + + /** + * WHen true the board will be displayed in the view mode + */ + showInViewMode: boolean; + + /** + * The grid layout configuration of the board, if applicable. + */ + readonly grid?: GridLayout; + + /** + * The flex layout configuration of the board, if applicable. + */ + readonly flex?: FlexLayout; + + /** + * The guides associated with the board. + */ + guides: Guide[]; + + /** + * The ruler guides attached to the board + */ + readonly rulerGuides: RulerGuide[]; + + /** + * The horizontal sizing behavior of the board. + */ + horizontalSizing?: 'auto' | 'fix'; + + /** + * The vertical sizing behavior of the board. + */ + verticalSizing?: 'auto' | 'fix'; + + /** + * The fills applied to the shape. + */ + fills: Fill[]; + + // Container Properties + /** + * The children shapes contained within the board. + * When writing into this property, you can only reorder the shapes, not + * changing the structure. If the new shapes don't match the current shapes + * it will give a validation error. + * + * @example + * ```js + * board.children = board.children.reverse(); + * ``` + */ + children: Shape[]; + + /** + * Appends a child shape to the board. + * @param child The child shape to append. + * + * @example + * ```js + * board.appendChild(childShape); + * ``` + */ + appendChild(child: Shape): void; + + /** + * Inserts a child shape at the specified index within the board. + * @param index The index at which to insert the child shape. + * @param child The child shape to insert. + * + * @example + * ```js + * board.insertChild(0, childShape); + * ``` + */ + insertChild(index: number, child: Shape): void; + + /** + * Adds a flex layout configuration to the board (so it's necessary to create a board first of all). + * @return Returns the flex layout configuration added to the board. + * @example + * ```js + * const board = penpot.createBoard(); + * const flex = board.addFlexLayout(); + * + * // You can change the flex properties as follows. + * flex.dir = "column"; + * flex.wrap = "wrap"; + * flex.alignItems = "center"; + * flex.justifyContent = "center"; + * flex.horizontalSizing = "fill"; + * flex.verticalSizing = "fill"; + * ``` + */ + addFlexLayout(): FlexLayout; + /** + * Adds a grid layout configuration to the board (so it's necessary to create a board first of all). You can add rows and columns, check addRow/addColumn. + * @return Returns the grid layout configuration added to the board. + * @example + * ```js + * const board = penpot.createBoard(); + * const grid = board.addGridLayout(); + * + * // You can change the grid properties as follows. + * grid.alignItems = "center"; + * grid.justifyItems = "start"; + * grid.rowGap = 10; + * grid.columnGap = 10; + * grid.verticalPadding = 5; + * grid.horizontalPadding = 5; + */ + addGridLayout(): GridLayout; + + /** + * Creates a new ruler guide. + */ + addRulerGuide(orientation: RulerGuideOrientation, value: number): RulerGuide; + + /** + * Removes the `guide` from the current page. + */ + removeRulerGuide(guide: RulerGuide): void; + + /** + * @return Returns true when the current board is a VariantContainer + */ + isVariantContainer(): boolean; +} + +/** + * Represents a VariantContainer in Penpot + * This interface extends `Board` and includes properties and methods specific to VariantContainer. + */ +export interface VariantContainer extends Board { + /** + * Access to the Variant interface, for attributes and actions over the full Variant (not only this VariantContainer) + */ + readonly variants: Variants | null; +} + +/** + * Represents a boolean operation shape in Penpot. + * This interface extends `ShapeBase` and includes properties and methods specific to boolean operations. + */ +export interface Boolean extends ShapeBase { + /** + * The type of the shape, which is always 'bool' for boolean operation shapes. + */ + readonly type: 'boolean'; + + /** + * Converts the boolean shape to its path data representation. + * @return Returns the path data (d attribute) as a string. + * @deprecated Use the `d` attribute + */ + toD(): string; + + /** + * The content of the boolean shape, defined as the path string. + * @deprecated Use either `d` or `commands`. + */ + content: string; + + /** + * The content of the boolean shape, defined as the path string. + */ + d: string; + + /** + * The content of the boolean shape, defined as an array of path commands. + */ + commands: Array; + + /** + * The fills applied to the shape. + */ + fills: Fill[]; + + // Container Properties + /** + * The children shapes contained within the boolean shape. + */ + readonly children: Shape[]; + /** + * Appends a child shape to the boolean shape. + * @param child The child shape to append. + * + * @example + * ```js + * boolShape.appendChild(childShape); + * ``` + */ + appendChild(child: Shape): void; + /** + * Inserts a child shape at the specified index within the boolean shape. + * @param index The index at which to insert the child shape. + * @param child The child shape to insert. + * + * @example + * ```js + * boolShape.insertChild(0, childShape); + * ``` + */ + insertChild(index: number, child: Shape): void; +} + +/** + * Represents the boolean operation types available in Penpot. + * These types define how shapes can be combined or modified using boolean operations. + */ +export type BooleanType = 'union' | 'difference' | 'exclude' | 'intersection'; + +/** + * Bounds represents the boundaries of a rectangular area, + * defined by the coordinates of the top-left corner and the dimensions of the rectangle. + * + * @example + * ```js + * const bounds = { x: 50, y: 50, width: 200, height: 100 }; + * console.log(bounds); + * ``` + */ +export type Bounds = { + /** + * Top-left x position of the rectangular area defined + */ + x: number; + /** + * Top-left y position of the rectangular area defined + */ + y: number; + /** + * Width of the represented area + */ + width: number; + /** + * Height of the represented area + */ + height: number; +}; + +/** + * This action will close a targeted board that is opened as an overlay. + */ +export interface CloseOverlay { + /** + * The action type + */ + readonly type: 'close-overlay'; + + /** + * The overlay to be closed with this action. + */ + readonly destination?: Board; + + /** + * Animation displayed with this interaction. + */ + readonly animation: Animation; +} + +/** + * Represents color properties in Penpot. + * This interface includes properties for defining solid colors, gradients, and image fills, along with metadata. + */ +export interface Color { + /** + * The optional reference ID for an external color definition. + */ + id?: string; + /** + * The optional reference to an external file for the color definition. + */ + fileId?: string; + /** + * The optional name of the color. + */ + name?: string; + /** + * The optional path or category to which this color belongs. + */ + path?: string; + /** + * The optional solid color, represented as a string (e.g., '#FF5733'). + */ + color?: string; + /** + * The optional opacity level of the color, ranging from 0 (fully transparent) to 1 (fully opaque). + * Defaults to 1 if omitted. + */ + opacity?: number; + /** + * The optional reference ID for an external color definition. + * @deprecated Use `id` instead + */ + refId?: string; + /** + * The optional reference to an external file for the color definition. + * @deprecated Use `fileId` + */ + refFile?: string; + /** + * The optional gradient fill defined by a Gradient object. + */ + gradient?: Gradient; + /** + * The optional image fill defined by an ImageData object. + */ + image?: ImageData; +} + +/** + * Additional color information for the methods to extract colors from a list of shapes. + */ +export interface ColorShapeInfo { + /** + * List of shapes with additional information + */ + readonly shapesInfo: ColorShapeInfoEntry[]; +} + +/** + * Entry for the color shape additional information. + */ +export interface ColorShapeInfoEntry { + /** + * Property that has the color (example: fill, stroke...) + */ + readonly property: string; + + /** + * For properties that are indexes (such as fill) represent the index + * of the color inside that property. + */ + readonly index?: number; + + /** + * Identifier of the shape that contains the color + */ + readonly shapeId: string; +} + +/** + * Comments allow the team to have one priceless conversation getting and + * providing feedback right over the designs and prototypes. + */ +export interface Comment { + /** + * The `user` that has created the comment. + */ + readonly user: User; + + /** + * The `date` the comment has been created. + */ + readonly date: Date; + + /** + * The `content` for the commentary. The owner can modify the comment. + */ + content: string; + + /** + * Remove the current comment from its comment thread. Only the owner can remove their comments. + * Requires the `comment:write` permission. + */ + remove(): void; +} + +/** + * Represents a list of comments one after the other. Usually these threads + * are conversations the users have in Penpot. + */ +export interface CommentThread { + /** + * This is the number that is displayed on the workspace. Is an increasing + * sequence for each comment. + */ + readonly seqNumber: number; + + /** + * If the thread is attached to a `board` this will have that board + * reference. + */ + readonly board?: Board; + + /** + * Owner of the comment thread + */ + readonly owner?: User; + + /** + * The `position` in absolute coordinates in the canvas. + */ + position: Point; + + /** + * Whether the thread has been marked as `resolved` or not. + */ + resolved: boolean; + + /** + * List of `comments` ordered by creation date. + * Requires the `comment:read` or `comment:write` permission. + */ + findComments(): Promise; + + /** + * Creates a new comment after the last one in the thread. The current user will + * be used as the creation user. + * Requires the `comment:write` permission. + */ + reply(content: string): Promise; + + /** + * Removes the current comment thread. Only the user that created the thread can + * remove it. + * Requires the `comment:write` permission. + */ + remove(): void; +} + +/** + * CommonLayout represents a common layout interface in the Penpot application. + * It includes various properties for alignment, spacing, padding, and sizing, as well as a method to remove the layout. + */ +export interface CommonLayout { + /** + * The `alignItems` property specifies the default alignment for items inside the container. + * It can be one of the following values: + * - 'start': Items are aligned at the start. + * - 'end': Items are aligned at the end. + * - 'center': Items are centered. + * - 'stretch': Items are stretched to fill the container. + */ + alignItems?: 'start' | 'end' | 'center' | 'stretch'; + /** + * The `alignContent` property specifies how the content is aligned within the container when there is extra space. + * It can be one of the following values: + * - 'start': Content is aligned at the start. + * - 'end': Content is aligned at the end. + * - 'center': Content is centered. + * - 'space-between': Content is distributed with space between. + * - 'space-around': Content is distributed with space around. + * - 'space-evenly': Content is distributed with even space around. + * - 'stretch': Content is stretched to fill the container. + */ + alignContent?: + | 'start' + | 'end' + | 'center' + | 'space-between' + | 'space-around' + | 'space-evenly' + | 'stretch'; + /** + * The `justifyItems` property specifies the default justification for items inside the container. + * It can be one of the following values: + * - 'start': Items are justified at the start. + * - 'end': Items are justified at the end. + * - 'center': Items are centered. + * - 'stretch': Items are stretched to fill the container. + */ + justifyItems?: 'start' | 'end' | 'center' | 'stretch'; + /** + * The `justifyContent` property specifies how the content is justified within the container when there is extra space. + * It can be one of the following values: + * - 'start': Content is justified at the start. + * - 'center': Content is centered. + * - 'end': Content is justified at the end. + * - 'space-between': Content is distributed with space between. + * - 'space-around': Content is distributed with space around. + * - 'space-evenly': Content is distributed with even space around. + * - 'stretch': Content is stretched to fill the container. + */ + justifyContent?: + | 'start' + | 'center' + | 'end' + | 'space-between' + | 'space-around' + | 'space-evenly' + | 'stretch'; + + /** + * The `rowGap` property specifies the gap between rows in the layout. + */ + rowGap: number; + /** + * The `columnGap` property specifies the gap between columns in the layout. + */ + columnGap: number; + + /** + * The `verticalPadding` property specifies the vertical padding inside the container. + */ + verticalPadding: number; + /** + * The `horizontalPadding` property specifies the horizontal padding inside the container. + */ + horizontalPadding: number; + + /** + * The `topPadding` property specifies the padding at the top of the container. + */ + topPadding: number; + /** + * The `rightPadding` property specifies the padding at the right of the container. + */ + rightPadding: number; + /** + * The `bottomPadding` property specifies the padding at the bottom of the container. + */ + bottomPadding: number; + /** + * The `leftPadding` property specifies the padding at the left of the container. + */ + leftPadding: number; + + /** + * The `horizontalSizing` property specifies the horizontal sizing behavior of the container. + * It can be one of the following values: + * - 'fit-content': The container fits the content. + * - 'fill': The container fills the available space. + * - 'auto': The container size is determined automatically. + */ + horizontalSizing: 'fit-content' | 'fill' | 'auto'; + /** + * The `verticalSizing` property specifies the vertical sizing behavior of the container. + * It can be one of the following values: + * - 'fit-content': The container fits the content. + * - 'fill': The container fills the available space. + * - 'auto': The container size is determined automatically. + */ + verticalSizing: 'fit-content' | 'fill' | 'auto'; + + /** + * The `remove` method removes the layout. + */ + remove(): void; +} + +/** + * Represents the context of Penpot, providing access to various Penpot functionalities and data. + */ +export interface Context { + /** + * The root shape in the current Penpot context. Requires `content:read` permission. + * + * @example + * ```js + * const rootShape = context.root; + * console.log(rootShape); + * ``` + */ + readonly root: Shape | null; + /** + * Retrieves file data from the current Penpot context. Requires `content:read` permission. + * @return Returns the file data or `null` if no file is available. + * + * @example + * ```js + * const fileData = context.currentFile; + * console.log(fileData); + * ``` + */ + readonly currentFile: File | null; + /** + * The current page in the Penpot context. Requires `content:read` permission. + * + * @example + * ```js + * const currentPage = context.currentPage; + * console.log(currentPage); + * ``` + */ + readonly currentPage: Page | null; + /** + * The viewport settings in the Penpot context. + * + * @example + * ```js + * const viewportSettings = context.viewport; + * console.log(viewportSettings); + * ``` + */ + readonly viewport: Viewport; + + /** + * Context encapsulating the history operations + * + * @example + * ```js + * const historyContext = context.history; + * console.log(historyContext); + * ``` + */ + readonly history: HistoryContext; + + /** + * The library context in the Penpot context, including both local and connected libraries. Requires `library:read` permission. + * + * @example + * ```js + * const libraryContext = context.library; + * console.log(libraryContext); + * ``` + */ + readonly library: LibraryContext; + /** + * The fonts context in the Penpot context, providing methods to manage fonts. Requires `content:read` permission. + * + * @example + * ```js + * const fontsContext = context.fonts; + * console.log(fontsContext); + * ``` + */ + readonly fonts: FontsContext; + /** + * The current user in the Penpot context. Requires `user:read` permission. + * + * @example + * ```js + * const currentUser = context.currentUser; + * console.log(currentUser); + * ``` + */ + readonly currentUser: User; + /** + * An array of active users in the Penpot context. Requires `user:read` permission. + * + * @example + * ```js + * const activeUsers = context.activeUsers; + * console.log(activeUsers); + * ``` + */ + readonly activeUsers: ActiveUser[]; + + /** + * The current theme (light or dark) in Penpot. + * + * @example + * ```js + * const currentTheme = context.theme; + * console.log(currentTheme); + * ``` + */ + readonly theme: Theme; + + /** + * Access to the localStorage proxy + */ + readonly localStorage: LocalStorage; + + /** + * The currently selected shapes in Penpot. Requires `content:read` permission. + * + * @example + * ```js + * const selectedShapes = context.selection; + * console.log(selectedShapes); + * ``` + */ + selection: Shape[]; + + /** + * Retrieves colors applied to the given shapes in Penpot. Requires `content:read` permission. + * @return Returns an array of colors and their shape information. + * + * @example + * ```js + * const colors = context.shapesColors(shapes); + * console.log(colors); + * ``` + */ + shapesColors(shapes: Shape[]): (Color & ColorShapeInfo)[]; + + /** + * Replaces a specified old color with a new color in the given shapes. Requires `content:write` permission. + * + * @example + * ```js + * context.replaceColor(shapes, oldColor, newColor); + * ``` + */ + replaceColor(shapes: Shape[], oldColor: Color, newColor: Color): void; + + /** + * Uploads media to Penpot and retrieves its image data. Requires `content:write` permission. + * @param name The name of the media. + * @param url The URL of the media to be uploaded. + * @return Returns a promise that resolves to the image data of the uploaded media. + * + * @example + * ```js + * const imageData = await context.uploadMediaUrl('example', 'https://example.com/image.jpg'); + * console.log(imageData); + * + * // to insert the image in a shape we can do + * const board = penpot.createBoard(); + * const shape = penpot.createRectangle(); + * board.appendChild(shape); + * shape.fills = [{ fillOpacity: 1, fillImage: imageData }]; + * ``` + */ + uploadMediaUrl(name: string, url: string): Promise; + + /** + * Uploads media to penpot and retrieves the image data. Requires `content:write` permission. + * @param name The name of the media. + * @param data The image content data + * @return Returns a promise that resolves to the image data of the uploaded media. + * + * @example + * ```js + * const imageData = await context.uploadMediaData('example', imageData, 'image/jpeg'); + * console.log(imageData); + * ``` + */ + uploadMediaData( + name: string, + data: Uint8Array, + mimeType: string, + ): Promise; + + /** + * Groups the specified shapes. Requires `content:write` permission. + * @param shapes - An array of shapes to group. + * @return Returns the newly created group or `null` if the group could not be created. + * @example + * ```js + * const penpotShapesArray = penpot.selection; + * penpot.group(penpotShapesArray); + * ``` + */ + group(shapes: Shape[]): Group | null; + /** + * Ungroups the specified group. Requires `content:write` permission. + * @param group - The group to ungroup. + * @param other - Additional groups to ungroup. + * + * @example + * ```js + * const penpotShapesArray = penpot.selection; + * // We need to make sure that something is selected, and if the selected shape is a group, + * if (selected.length && penpot.utils.types.isGroup(penpotShapesArray[0])) { + * penpot.group(penpotShapesArray[0]); + * } + * ``` + */ + ungroup(group: Group, ...other: Group[]): void; + + /** + * Use this method to create the shape of a rectangle. Requires `content:write` permission. + * + * @example + * ```js + * const shape = penpot.createRectangle(); + * // just change the values like this + * shape.name = "Example rectangle"; + * + * // for solid color + * shape.fills = [{ fillColor: "#7EFFF5" }]; + * // for linear gradient color + * shape.fills = [{ + * fillColorGradient: { + * "type": "linear", + * "startX": 0.5, + * "startY": 0, + * "endX": 0.5, + * "endY": 1, + * "width": 1, + * "stops": [ + * { + * "color": "#003ae9", + * "opacity": 1, + * "offset": 0 + * }, + * { + * "color": "#003ae9", + * "opacity": 0, + * "offset": 1 + * } + * ] + * } + *}]; + * // for a image fill + * const imageData = await context.uploadMediaUrl('example', 'https://example.com/image.jpg'); + * shape.fills = [{ fillOpacity: 1, fillImage: imageData }]; + * + * shape.borderRadius = 8; + * shape.strokes = [ + * { + * strokeColor: "#2e3434", + * strokeStyle: "solid", + * strokeWidth: 2, + * strokeAlignment: "center", + * }, + *]; + * ``` + */ + createRectangle(): Rectangle; + /** + * Use this method to create a board. This is the first step before anything else, the container. Requires `content:write` permission. + * Then you can add a gridlayout, flexlayout or add a shape inside the board. + * Just a heads-up: board is a board in Penpot UI. + * + * @example + * ```js + * const board = penpot.createBoard(); + * + * // to add grid layout + * board.addGridLayout(); + * // to add flex layout + * board.addFlexLayout(); + * + * // to create a shape inside the board + * const shape = penpot.createRectangle(); + * board.appendChild(shape); + * ``` + */ + createBoard(): Board; + /** + * Use this method to create the shape of an ellipse. Requires `content:write` permission. + * + * @example + * ```js + * const shape = penpot.createEllipse(); + * // just change the values like this + * shape.name = "Example ellipse"; + * + * // for solid color + * shape.fills = [{ fillColor: "#7EFFF5" }]; + * // for linear gradient color + * shape.fills = [{ + * fillColorGradient: { + * "type": "linear", + * "startX": 0.5, + * "startY": 0, + * "endX": 0.5, + * "endY": 1, + * "width": 1, + * "stops": [ + * { + * "color": "#003ae9", + * "opacity": 1, + * "offset": 0 + * }, + * { + * "color": "#003ae9", + * "opacity": 0, + * "offset": 1 + * } + * ] + * } + *}]; + * // for an image fill + * const imageData = await context.uploadMediaUrl('example', 'https://example.com/image.jpg'); + * shape.fills = [{ fillOpacity: 1, fillImage: imageData }]; + * + * shape.strokes = [ + * { + * strokeColor: "#2e3434", + * strokeStyle: "solid", + * strokeWidth: 2, + * strokeAlignment: "center", + * }, + *]; + * ``` + */ + createEllipse(): Ellipse; + /** + * Use this method to create a path. Requires `content:write` permission. + * + * @example + * ```js + * const path = penpot.createPath(); + * path.name = "My path"; + * + * // for solid color + * path.fills = [{ fillColor: "#7EFFF5" }]; + * + * ``` + */ + createPath(): Path; + /** + * Creates a Boolean shape based on the specified boolean operation and shapes. Requires `content:write` permission. + * @param boolType The type of boolean operation ('union', 'difference', 'exclude', 'intersection'). + * @param shapes An array of shapes to perform the boolean operation on. + * @return Returns the newly created Boolean shape resulting from the boolean operation. + * + * @example + * ```js + * const booleanShape = context.createBoolean('union', [shape1, shape2]); + * ``` + */ + createBoolean(boolType: BooleanType, shapes: Shape[]): Boolean | null; + /** + * Creates a Group from an SVG string. Requires `content:write` permission. + * @param svgString The SVG string representing the shapes to be converted into a group. + * @return Returns the newly created Group containing the shapes from the SVG. + * + * @example + * ```js + * const svgGroup = context.createShapeFromSvg('...'); + * ``` + */ + createShapeFromSvg(svgString: string): Group | null; + /** + * Creates a Group from an SVG string. The SVG can have images and the method returns + * a Promise because the shape will be available after all images are uploaded. + * Requires `content:write` permission. + * @param svgString The SVG string representing the shapes to be converted into a group. + * @return Returns a promise with the newly created Group containing the shapes from the SVG. + * + * @example + * ```js + * const svgGroup = await context.createShapeFromSvgWithImages('...'); + * ``` + */ + createShapeFromSvgWithImages(svgString: string): Promise; + + /** + * Creates a Text shape with the specified text content. Requires `content:write` permission. + * @param text The text content for the Text shape. + * @return Returns the new created shape, if the shape wasn't created can return null. + * + * @example + * ```js + * const board = penpot.createBoard(); + * let text; + * text = penpot.createText(); + * // just change the values like this + * text.growType = 'auto-height'; + * text.fontFamily = 'Work Sans'; + * text.fontSize = '12'; + * text.fills = [{fillColor: '#9f05ff', fillOpacity: 1}]; + * text.strokes = [{strokeOpacity: 1, strokeStyle: 'solid', strokeWidth: 2, strokeColor: '#deabff', strokeAlignment: 'outer'}]; + * board.appendChild(text); + * ``` + */ + createText(text: string): Text | null; + + /** + * Generates markup for the given shapes. Requires `content:read` permission + * @param shapes + * @param options + * + * @example + * ```js + * const markup = context.generateMarkup(shapes, { type: 'html' }); + * console.log(markup); + * ``` + */ + generateMarkup(shapes: Shape[], options?: { type?: 'html' | 'svg' }): string; + + /** + * Generates styles for the given shapes. Requires `content:read` permission + * @param shapes + * @param options + * + * @example + * ```js + * const styles = context.generateStyle(shapes, { type: 'css' }); + * console.log(styles); + * ``` + */ + generateStyle( + shapes: Shape[], + options?: { + type?: 'css'; + withPrelude?: boolean; + includeChildren?: boolean; + }, + ): string; + + /** + * Generates the fontfaces styles necessaries to render the shapes. + * Requires `content:read` permission + * @param shapes + * + * @example + * ```js + * const fontfaces = context.generateFontFaces(penpot.selection); + * console.log(fontfaces); + * ``` + */ + generateFontFaces(shapes: Shape[]): Promise; + + /** + * Adds the current callback as an event listener + * + * @example + * ```js + * const listenerId = context.addListener('selectionchange', (event) => { + * console.log(event); + * }); + * ``` + */ + addListener( + type: T, + callback: (event: EventsMap[T]) => void, + props?: { [key: string]: unknown }, + ): symbol; + + /** + * Removes the listenerId from the list of listeners + * + * @example + * ```js + * context.removeListener(listenerId); + * ``` + */ + removeListener(listenerId: symbol): void; + + /** + * Opens the viewer section. Requires `content:read` permission. + */ + openViewer(): void; + + /** + * Creates a new page. Requires `content:write` permission. + */ + createPage(): Page; + + /** + * Changes the current open page to given page. Requires `content:read` permission. + * @param page the page to open + * @param newWindow if true opens the page in a new window + * + * @example + * ```js + * context.openPage(page); + * ``` + */ + openPage(page: Page, newWindow?: boolean): void; + + /** + * Aligning will move all the selected layers to a position relative to one + * of them in the horizontal direction. + * @param shapes to align + * @param direction where the shapes will be aligned + */ + alignHorizontal( + shapes: Shape[], + direction: 'left' | 'center' | 'right', + ): void; + + /** + * Aligning will move all the selected layers to a position relative to one + * of them in the vertical direction. + * @param shapes to align + * @param direction where the shapes will be aligned + */ + alignVertical(shapes: Shape[], direction: 'top' | 'center' | 'bottom'): void; + + /** + * Distributing objects to position them horizontally with equal distances between them. + * @param shapes to distribute + */ + distributeHorizontal(shapes: Shape[]): void; + + /** + * Distributing objects to position them vertically with equal distances between them. + * @param shapes to distribute + */ + distributeVertical(shapes: Shape[]): void; + + /** + * Converts the shapes into Paths. If the shapes are complex will put together + * all its paths into one. + * @param shapes to flatten + */ + flatten(shapes: Shape[]): Path[]; +} + +/** + * Utility methods for geometric calculations in Penpot. + * + * @example + * ```js + * const centerPoint = geometryUtils.center(shapes); + * console.log(centerPoint); + * ``` + */ +export interface ContextGeometryUtils { + /** + * Calculates the center point of a given array of shapes. + * This method computes the geometric center (centroid) of the bounding boxes of the provided shapes. + * @param shapes - The array of shapes to calculate the center for. + * @return Returns the center point as an object with `x` and `y` coordinates, or null if the array is empty. + * + * @example + * ```js + * const centerPoint = geometryUtils.center(shapes); + * console.log(centerPoint); + * ``` + */ + center(shapes: Shape[]): { x: number; y: number } | null; +} + +/** + * Utility methods for determining the types of Penpot shapes. + * + * @example + * ```js + * const isBoard = typesUtils.isBoard(shape); + * console.log(isBoard); + * ``` + */ +export interface ContextTypesUtils { + /** + * Checks if the given shape is a board. + * @param shape - The shape to check. + * @return Returns true if the shape is a board, otherwise false. + */ + isBoard(shape: Shape): shape is Board; + + /** + * Checks if the given shape is a group. + * @param shape - The shape to check. + * @return Returns true if the shape is a Group, otherwise false. + */ + isGroup(shape: Shape): shape is Group; + + /** + * Checks if the given shape is a mask. + * @param shape - The shape to check. + * @return Returns true if the shape is a Group (acting as a mask), otherwise false. + */ + isMask(shape: Shape): shape is Group; + + /** + * Checks if the given shape is a boolean operation. + * @param shape - The shape to check. + * @return Returns true if the shape is a Bool, otherwise false. + */ + isBool(shape: Shape): shape is Boolean; + + /** + * Checks if the given shape is a rectangle. + * @param shape - The shape to check. + * @return Returns true if the shape is a Rectangle, otherwise false. + */ + isRectangle(shape: Shape): shape is Rectangle; + + /** + * Checks if the given shape is a path. + * @param shape - The shape to check. + * @return Returns true if the shape is a Path, otherwise false. + */ + isPath(shape: Shape): shape is Path; + + /** + * Checks if the given shape is a text element. + * @param shape - The shape to check. + * @return Returns true if the shape is a Text, otherwise false. + */ + isText(shape: Shape): shape is Text; + + /** + * Checks if the given shape is an ellipse. + * @param shape - The shape to check. + * @return Returns true if the shape is an Ellipse, otherwise false. + */ + isEllipse(shape: Shape): shape is Ellipse; + + /** + * Checks if the given shape is an SVG. + * @param shape - The shape to check. + * @return Returns true if the shape is a SvgRaw, otherwise false. + */ + isSVG(shape: Shape): shape is SvgRaw; + + /** + * Checks if the given shape is a variant container. + * @param shape - The shape to check. + * @return Returns true if the shape is a variant container, otherwise false. + */ + isVariantContainer(shape: Shape): shape is VariantContainer; + + /** + * Checks if the given component is a VariantComponent. + * @param component - The component to check. + * @return Returns true if the component is a VariantComponent, otherwise false. + */ + isVariantComponent( + component: LibraryComponent, + ): component is LibraryVariantComponent; +} + +/** + * Utility methods for various operations in Penpot. + */ +export interface ContextUtils { + /** + * Geometry utility methods for Penpot. + * Provides methods for geometric calculations, such as finding the center of a group of shapes. + * + * @example + * ```js + * const centerPoint = penpot.utils.geometry.center(shapes); + * console.log(centerPoint); + * ``` + */ + readonly geometry: ContextGeometryUtils; + /** + * Type utility methods for Penpot. + * Provides methods for determining the types of various shapes in Penpot. + * + * @example + * ```js + * const isBoard = utils.types.isBoard(shape); + * console.log(isBoard); + * ``` + */ + readonly types: ContextTypesUtils; +} + +/** + * Dissolve animation + */ +export interface Dissolve { + /** + * Type of the animation + */ + readonly type: 'dissolve'; + + /** + * Duration of the animation effect + */ + readonly duration: number; + + /** + * Function that the dissolve effect will follow for the interpolation. + * Defaults to `linear`. + */ + readonly easing?: 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out'; +} + +/** + * Represents an ellipse shape in Penpot. + * This interface extends `ShapeBase` and includes properties specific to ellipses. + */ +export interface Ellipse extends ShapeBase { + type: 'ellipse'; + + /** + * The fills applied to the shape. + */ + fills: Fill[]; +} + +/** + * Represents a mapping of events to their corresponding types in Penpot. + * This interface provides information about various events that can be triggered in the application. + * + * @example + * ```js + * penpot.on('pagechange', (event) => { + * console.log(event); + * }); + * ``` + */ +export interface EventsMap { + /** + * The `pagechange` event is triggered when the active page in the project is changed. + */ + pagechange: Page; + /** + * The `filechange` event is triggered when there are changes in the current file. + */ + filechange: File; + /** + * The `selectionchange` event is triggered when the selection of elements changes. + * This event passes a list of identifiers of the selected elements. + */ + selectionchange: string[]; + /** + * The `themechange` event is triggered when the application theme is changed. + */ + themechange: Theme; + /** + * The `finish` event is triggered when some operation is finished. + */ + finish: string; + + /** + * This event will trigger whenever the shape in the props change. It's mandatory to send + * with the props an object like `{ shapeId: '' }` + */ + shapechange: Shape; + + /** + * The `contentsave` event will trigger when the content file changes. + */ + contentsave: void; +} + +/** + * Represents export settings in Penpot. + * This interface includes properties for defining export configurations. + */ +export interface Export { + /** + * Type of the file to export. Can be one of the following values: png, jpeg, svg, pdf + */ + type: 'png' | 'jpeg' | 'svg' | 'pdf'; + /** + * For bitmap formats represent the scale of the original size to resize the export + */ + scale?: number; + /** + * Suffix that will be appended to the resulting exported file + */ + suffix?: string; + /** + * If true will ignore the children when exporting the shape + */ + skipChildren?: boolean; +} + +/** + * File represents a file in the Penpot application. + * It includes properties for the file's identifier, name, and revision number. + */ +export interface File extends PluginData { + /** + * The `id` property is a unique identifier for the file. + */ + readonly id: string; + + /** + * The `name` for the file + */ + name: string; + + /** + * The `revn` will change for every document update + */ + revn: number; + + /** + * List all the pages for the current file + */ + pages: Page[]; + + /* + * Export the current file to an archive. + * @param `exportType` indicates the type of file to generate. + * - `'penpot'` will create a *.penpot file with a binary representation of the file + * - `'zip'` will create a *.zip with the file exported in several SVG files with some JSON metadata + * @param `libraryExportType` indicates what to do with the linked libraries of the file when + * exporting it. Defaults to `all` if not sent. + * - `'all'` will include the libraries as external files that will be exported in a single bundle + * - `'merge'` will add all the assets into the main file and only one file will be imported + * - `'detach'` will unlink all the external assets and no libraries will be imported + * @param `progressCallback` for `zip` export can be pass this callback so a progress report is sent. + * + * @example + * ```js + * const exportedData = await file.export('penpot', 'all'); + * ``` + */ + export( + exportType: 'penpot' | 'zip', + libraryExportType?: 'all' | 'merge' | 'detach', + ): Promise; + + /** + * Retrieves the versions for the file. + * @param `criteria.createdBy` retrieves only the versions created by the user `createdBy`. + * Requires the `content:read` permission. + */ + findVersions(criteria?: { createdBy: User }): Promise; + + /** + * Saves the current version into the versions history. + * Requires the `content:write` permission. + */ + saveVersion(label: string): Promise; +} + +/** + * Type defining the file version properties. + */ +export interface FileVersion { + /** + * The current label to identify the version. + */ + label: string; + + /** + * The user that created the version. If not present, the + * version is an autosave. + */ + readonly createdBy?: User; + + /** + * The date when the version was created. + */ + readonly createdAt: Date; + + /** + * If the current version has been generated automatically. + */ + readonly isAutosave: boolean; + + /* + * Restores the current version and replaces the content of the active file + * for the contents of this version. + * Requires the `content:write` permission. + * Warning: Calling this will close the plugin because the workspace will reload + */ + restore(): void; + + /** + * Remove the current version. + * Requires the `content:write` permission. + */ + remove(): Promise; + + /** + * Converts an autosave version into a permanent version. + * Requires the `content:write` permission. + */ + pin(): Promise; +} + +/** + * Represents fill properties in Penpot. You can add a fill to any shape except for groups. + * This interface includes properties for defining solid color fills, gradient fills, and image fills. + */ +export interface Fill { + /** + * The optional solid fill color, represented as a string (e.g., '#FF5733'). + */ + fillColor?: string; + /** + * The optional opacity level of the solid fill color, ranging from 0 (fully transparent) to 1 (fully opaque). + * Defaults to 1 if omitted. + */ + fillOpacity?: number; + /** + * The optional gradient fill defined by a Gradient object. + */ + fillColorGradient?: Gradient; + /** + * The optional reference to an external file for the fill color. + */ + fillColorRefFile?: string; + /** + * The optional reference ID within the external file for the fill color. + */ + fillColorRefId?: string; + /** + * The optional image fill defined by an ImageData object. + */ + fillImage?: ImageData; +} + +/** + * Represents a flexible layout configuration in Penpot. + * This interface extends `CommonLayout` and includes properties for defining the direction, + * wrapping behavior, and child management of a flex layout. + */ +export interface FlexLayout extends CommonLayout { + /** + * The direction of the flex layout. + * - 'row': Main axis is horizontal, from left to right. + * - 'row-reverse': Main axis is horizontal, from right to left. + * - 'column': Main axis is vertical, from top to bottom. + * - 'column-reverse': Main axis is vertical, from bottom to top. + */ + dir: 'row' | 'row-reverse' | 'column' | 'column-reverse'; + /** + * The optional wrapping behavior of the flex layout. + * - 'wrap': Child elements will wrap onto multiple lines. + * - 'nowrap': Child elements will not wrap. + */ + wrap?: 'wrap' | 'nowrap'; + /** + * Appends a child element to the flex layout. + * @param child The child element to be appended, of type `Shape`. + * + * @example + * ```js + * flexLayout.appendChild(childShape); + * ``` + */ + appendChild(child: Shape): void; +} + +/** + * Defines an interaction flow inside penpot. A flow is defined by a starting board for an interaction. + */ +export interface Flow { + /** + * The page in which the flow is defined + */ + readonly page: Page; + + /** + * The name for the current flow + */ + name: string; + + /** + * The starting board for this interaction flow + */ + startingBoard: Board; + + /** + * Removes the flow from the page + */ + remove(): void; +} + +/** + * Represents a font in Penpot, which includes details about the font family, variants, and styling options. + * This interface provides properties and methods for describing and applying fonts within Penpot. + */ +export interface Font { + /** + * This property holds the human-readable name of the font. + */ + name: string; + + /** + * The unique identifier of the font. + */ + fontId: string; + + /** + * The font family of the font. + */ + fontFamily: string; + + /** + * The default font style of the font. + */ + fontStyle?: 'normal' | 'italic' | null; + + /** + * The default font variant ID of the font. + */ + fontVariantId: string; + + /** + * The default font weight of the font. + */ + fontWeight: string; + + /** + * An array of font variants available for the font. + */ + variants: FontVariant[]; + + /** + * Applies the font styles to a text shape. + * @param text - The text shape to apply the font styles to. + * @param variant - Optional. The specific font variant to apply. If not provided, applies the default variant. + * + * @example + * ```js + * font.applyToText(textShape, fontVariant); + * ``` + */ + applyToText(text: Text, variant?: FontVariant): void; + + /** + * Applies the font styles to a text range within a text shape. + * @param range - The text range to apply the font styles to. + * @param variant - Optional. The specific font variant to apply. If not provided, applies the default variant. + * + * @example + * ```js + * font.applyToRange(textRange, fontVariant); + * ``` + */ + applyToRange(range: TextRange, variant?: FontVariant): void; +} + +/** + * Represents a font variant in Penpot, which defines a specific style variation of a font. + * This interface provides properties for describing the characteristics of a font variant. + */ +export interface FontVariant { + /** + * The name of the font variant. + */ + name: string; + + /** + * The unique identifier of the font variant. + */ + fontVariantId: string; + + /** + * The font weight of the font variant. + */ + fontWeight: string; + + /** + * The font style of the font variant. + */ + fontStyle: 'normal' | 'italic'; +} + +/** + * Represents the context for managing fonts in Penpot. + * This interface provides methods to interact with fonts, such as retrieving fonts by ID or name. + */ +export interface FontsContext { + /** + * An array containing all available fonts. + */ + all: Font[]; + + /** + * Finds a font by its unique identifier. + * @param id - The ID of the font to find. + * @return Returns the `Font` object if found, otherwise `null`. + * + * @example + * ```js + * const font = fontsContext.findById('font-id'); + * if (font) { + * console.log(font.name); + * } + * ``` + */ + findById(id: string): Font | null; + + /** + * Finds a font by its name. + * @param name - The name of the font to find. + * @return Returns the `Font` object if found, otherwise `null`. + * + * @example + * ```js + * const font = fontsContext.findByName('font-name'); + * if (font) { + * console.log(font.name); + * } + * ``` + */ + findByName(name: string): Font | null; + + /** + * Finds all fonts matching a specific ID. + * @param id - The ID to match against. + * @return Returns an array of `Font` objects matching the provided ID. + * + * @example + * ```js + * const fonts = fontsContext.findAllById('font-id'); + * console.log(fonts); + * ``` + */ + findAllById(id: string): Font[]; + + /** + * Finds all fonts matching a specific name. + * @param name - The name to match against. + * @return Returns an array of `Font` objects matching the provided name. + * + * @example + * ```js + * const fonts = fontsContext.findAllByName('font-name'); + * console.log(fonts); + * ``` + */ + findAllByName(name: string): Font[]; +} + +/** + * Represents a gradient configuration in Penpot. + * A gradient can be either linear or radial and includes properties to define its shape, position, and color stops. + */ +export type Gradient = { + /** + * Specifies the type of gradient. + * - 'linear': A gradient that transitions colors along a straight line. + * - 'radial': A gradient that transitions colors radiating outward from a central point. + * + * @example + * ```js + * const gradient: Gradient = { type: 'linear', startX: 0, startY: 0, endX: 100, endY: 100, width: 100, stops: [{ color: '#FF5733', offset: 0 }] }; + * ``` + */ + type: 'linear' | 'radial'; + /** + * The X-coordinate of the starting point of the gradient. + */ + startX: number; + /** + * The Y-coordinate of the starting point of the gradient. + */ + startY: number; + /** + * The X-coordinate of the ending point of the gradient. + */ + endX: number; + /** + * The Y-coordinate of the ending point of the gradient. + */ + endY: number; + /** + * The width of the gradient. For radial gradients, this could be interpreted as the radius. + */ + width: number; + /** + * An array of color stops that define the gradient. + */ + stops: Array<{ color: string; opacity?: number; offset: number }>; +}; + +/** + * GridLayout represents a grid layout in the Penpot application, extending the common layout interface. + * It includes properties and methods to manage rows, columns, and child elements within the grid. + */ +export interface GridLayout extends CommonLayout { + /** + * The `dir` property specifies the primary direction of the grid layout. + * It can be either 'column' or 'row'. + */ + dir: 'column' | 'row'; + /** + * The `rows` property represents the collection of rows in the grid. + * This property is read-only. + */ + readonly rows: Track[]; + /** + * The `columns` property represents the collection of columns in the grid. + * This property is read-only. + */ + readonly columns: Track[]; + + /** + * Adds a new row to the grid. + * @param type The type of the row to add. + * @param value The value associated with the row type (optional). + * + * @example + * ```js + * const board = penpot.createBoard(); + * const grid = board.addGridLayout(); + * grid.addRow("flex", 1); + * ``` + */ + addRow(type: TrackType, value?: number): void; + /** + * Adds a new row to the grid at the specified index. + * @param index The index at which to add the row. + * @param type The type of the row to add. + * @param value The value associated with the row type (optional). + * + * @example + * ```js + * gridLayout.addRowAtIndex(0, 'fixed', 100); + * ``` + */ + addRowAtIndex(index: number, type: TrackType, value?: number): void; + /** + * Adds a new column to the grid. + * @param type The type of the column to add. + * @param value The value associated with the column type (optional). + * + * @example + * ```js + * const board = penpot.createBoard(); + * const grid = board.addGridLayout(); + * grid.addColumn('percent', 50); + * ``` + */ + addColumn(type: TrackType, value?: number): void; + /** + * Adds a new column to the grid at the specified index. + * @param index The index at which to add the column. + * @param type The type of the column to add. + * @param value The value associated with the column type. + * + * @example + * ```js + * gridLayout.addColumnAtIndex(1, 'auto'); + * ``` + */ + addColumnAtIndex(index: number, type: TrackType, value: number): void; + /** + * Removes a row from the grid at the specified index. + * @param index The index of the row to remove. + * + * @example + * ```js + * gridLayout.removeRow(2); + * ``` + */ + removeRow(index: number): void; + /** + * Removes a column from the grid at the specified index. + * @param index The index of the column to remove. + * + * @example + * ```js + * gridLayout.removeColumn(3); + * ``` + */ + removeColumn(index: number): void; + /** + * Sets the properties of a column at the specified index. + * @param index The index of the column to set. + * @param type The type of the column. + * @param value The value associated with the column type (optional). + * + * @example + * ```js + * gridLayout.setColumn(0, 'fixed', 200); + * ``` + */ + setColumn(index: number, type: TrackType, value?: number): void; + /** + * Sets the properties of a row at the specified index. + * @param index The index of the row to set. + * @param type The type of the row. + * @param value The value associated with the row type (optional). + * + * @example + * ```js + * gridLayout.setRow(1, 'flex'); + * ``` + */ + setRow(index: number, type: TrackType, value?: number): void; + + /** + * Appends a child element to the grid at the specified row and column. + * @param child The child element to append. + * @param row The row index where the child will be placed. + * @param column The column index where the child will be placed. + * + * @example + * ```js + * gridLayout.appendChild(childShape, 0, 1); + * ``` + */ + appendChild(child: Shape, row: number, column: number): void; +} + +/** + * Represents a group of shapes in Penpot. + * This interface extends `ShapeBase` and includes properties and methods specific to groups. + */ +export interface Group extends ShapeBase { + /** + * The type of the shape, which is always 'group' for groups. + */ + readonly type: 'group'; + + // Container Properties + /** + * The children shapes contained within the group. + */ + readonly children: Shape[]; + /** + * Appends a child shape to the group. + * @param child The child shape to append. + * + * @example + * ```js + * group.appendChild(childShape); + * ``` + */ + appendChild(child: Shape): void; + /** + * Inserts a child shape at the specified index within the group. + * @param index The index at which to insert the child shape. + * @param child The child shape to insert. + * + * @example + * ```js + * group.insertChild(0, childShape); + * ``` + */ + insertChild(index: number, child: Shape): void; + + /** + * Checks if the group is currently a mask. + * A mask defines a clipping path for its child shapes. + */ + isMask(): boolean; + + /** + * Converts the group into a mask. + */ + makeMask(): void; + /** + * Removes the mask from the group. + */ + removeMask(): void; +} + +/** + * Represents a board guide in Penpot. + * This type can be one of several specific board guide types: column, row, or square. + */ +export type Guide = GuideColumn | GuideRow | GuideSquare; + +/** + * Represents a goard guide for columns in Penpot. + * This interface includes properties for defining the type, visibility, and parameters of column guides within a board. + */ +export interface GuideColumn { + /** + * The type of the guide, which is always 'column' for column guides. + */ + type: 'column'; + /** + * Specifies whether the column guide is displayed. + */ + display: boolean; + /** + * The parameters defining the appearance and layout of the column guides. + */ + params: GuideColumnParams; +} + +/** + * Represents parameters for board guide columns in Penpot. + * This interface includes properties for defining the appearance and layout of column guides within a board. + */ +export interface GuideColumnParams { + /** + * The color configuration for the column guides. + */ + color: { color: string; opacity: number }; + /** + * The optional alignment type of the column guides. + * - 'stretch': Columns stretch to fit the available space. + * - 'left': Columns align to the left. + * - 'center': Columns align to the center. + * - 'right': Columns align to the right. + */ + type?: 'stretch' | 'left' | 'center' | 'right'; + /** + * The optional size of each column. + */ + size?: number; + /** + * The optional margin between the columns and the board edges. + */ + margin?: number; + /** + * The optional length of each item within the columns. + */ + itemLength?: number; + /** + * The optional gutter width between columns. + */ + gutter?: number; +} + +/** + * Represents a board guide for rows in Penpot. + * This interface includes properties for defining the type, visibility, and parameters of row guides within a board. + */ +export interface GuideRow { + /** + * The type of the guide, which is always 'row' for row guides. + */ + type: 'row'; + /** + * Specifies whether the row guide is displayed. + */ + display: boolean; + /** + * The parameters defining the appearance and layout of the row guides. + * Note: This reuses the same parameter structure as column guides. + */ + params: GuideColumnParams; +} + +/** + * Represents a board guide for squares in Penpot. + * This interface includes properties for defining the type, visibility, and parameters of square guides within a board. + */ +export interface GuideSquare { + /** + * The type of the guide, which is always 'square' for square guides. + */ + type: 'square'; + /** + * Specifies whether the square guide is displayed. + */ + display: boolean; + /** + * The parameters defining the appearance and layout of the square guides. + */ + params: GuideSquareParams; +} + +/** + * Represents parameters for board guide squares in Penpot. + * This interface includes properties for defining the appearance and size of square guides within a board. + */ +export interface GuideSquareParams { + /** + * The color configuration for the square guides. + */ + color: { color: string; opacity: number }; + /** + * The optional size of each square guide. + */ + size?: number; +} + +/** + * This object allows to access to some history functions + */ +export interface HistoryContext { + /** + * Starts an undo block. All operations done inside this block will be undone together until + * a call to `undoBlockFinish` is called. + * @returns the block identifier + */ + undoBlockBegin(): Symbol; + + /** + * Ends the undo block started with `undoBlockBegin` + * @param blockId is the id returned by `undoBlockBegin` + * + * @example + * ```js + * historyContext.undoBlockFinish(blockId); + * ``` + */ + undoBlockFinish(blockId: Symbol): void; +} + +/** + * Represents an image shape in Penpot. + * This interface extends `ShapeBase` and includes properties specific to image shapes. + */ +export interface Image extends ShapeBase { + type: 'image'; + + /** + * The fills applied to the shape. + */ + fills: Fill[]; +} + +/** + * Represents image data in Penpot. + * This includes properties for defining the image's dimensions, metadata, and aspect ratio handling. + */ +export type ImageData = { + /** + * The optional name of the image. + */ + name?: string; + /** + * The width of the image. + */ + width: number; + /** + * The height of the image. + */ + height: number; + /** + * The optional media type of the image (e.g., 'image/png', 'image/jpeg'). + */ + mtype?: string; + /** + * The unique identifier for the image. + */ + id: string; + /** + * Whether to keep the aspect ratio of the image when resizing. + * Defaults to false if omitted. + */ + keepAspectRatio?: boolean; + + /** + * Returns the imaged data as a byte array. + */ + data(): Promise; +}; + +/** + * Penpot allows you to prototype interactions by connecting boards, which can act as screens. + */ +export interface Interaction { + /** + * The shape that owns the interaction + */ + readonly shape?: Shape; + + /** + * The user action that will start the interaction. + */ + trigger: Trigger; + + /** + * Time in **milliseconds** after the action will happen. Only applies to `after-delay` triggers. + */ + delay?: number | null; + + /** + * The action that will execute after the trigger happens. + */ + action: Action; + + /** + * Removes the interaction + */ + remove(): void; +} + +/** + * Properties for defining the layout of a cell in Penpot. + */ +export interface LayoutCellProperties { + /** + * The row index of the cell. + * This value is optional and indicates the starting row of the cell. + */ + row?: number; + + /** + * The number of rows the cell should span. + * This value is optional and determines the vertical span of the cell. + */ + rowSpan?: number; + + /** + * The column index of the cell. + * This value is optional and indicates the starting column of the cell. + */ + column?: number; + + /** + * The number of columns the cell should span. + * This value is optional and determines the horizontal span of the cell. + */ + columnSpan?: number; + + /** + * The name of the grid area that this cell belongs to. + * This value is optional and can be used to define named grid areas. + */ + areaName?: string; + + /** + * The positioning mode of the cell. + * This value can be 'auto', 'manual', or 'area' and determines how the cell is positioned within the layout. + */ + position?: 'auto' | 'manual' | 'area'; +} + +/** + * Properties for defining the layout of a child element in Penpot. + */ +export interface LayoutChildProperties { + /** + * Specifies whether the child element is positioned absolutely. + * When set to true, the element is taken out of the normal document flow and positioned relative to its nearest positioned ancestor. + */ + absolute: boolean; + + /** + * Defines the stack order of the child element + * Elements with a higher zIndex will be displayed in front of those with a lower zIndex. + */ + zIndex: number; + + /** + * Determines the horizontal sizing behavior of the child element + * - 'auto': The width is determined by the content. + * - 'fill': The element takes up the available width. + * - 'fix': The width is fixed. + */ + horizontalSizing: 'auto' | 'fill' | 'fix'; + + /** + * Determines the vertical sizing behavior of the child element. + * - 'auto': The height is determined by the content. + * - 'fill': The element takes up the available height. + * - 'fix': The height is fixed. + */ + verticalSizing: 'auto' | 'fill' | 'fix'; + + /** + * Aligns the child element within its container. + * - 'auto': Default alignment. + * - 'start': Aligns the element at the start of the container. + * - 'center': Centers the element within the container. + * - 'end': Aligns the element at the end of the container. + * - 'stretch': Stretches the element to fill the container. + */ + alignSelf: 'auto' | 'start' | 'center' | 'end' | 'stretch'; + + /** + * Sets the horizontal margin of the child element. + * This is the space on the left and right sides of the element. + */ + horizontalMargin: number; + + /** + * Sets the vertical margin of the child element. + * This is the space on the top and bottom sides of the element. + */ + verticalMargin: number; + + /** + * Sets the top margin of the child element. + * This is the space above the element. + */ + topMargin: number; + + /** + * Sets the right margin of the child element. + * This is the space to the right of the element. + */ + rightMargin: number; + + /** + * Sets the bottom margin of the child element. + * This is the space below the element. + */ + bottomMargin: number; + + /** + * Sets the left margin of the child element. + * This is the space to the left of the element. + */ + leftMargin: number; + + /** + * Defines the maximum width of the child element. + * If set to null, there is no maximum width constraint. + */ + maxWidth: number | null; + + /** + * Defines the maximum height of the child element. + * If set to null, there is no maximum height constraint. + */ + maxHeight: number | null; + /** + * Defines the minimum width of the child element. + * If set to null, there is no minimum width constraint. + */ + minWidth: number | null; + + /** + * Defines the minimum height of the child element. + * If set to null, there is no minimum height constraint. + */ + minHeight: number | null; +} + +/** + * Represents a library in Penpot, containing colors, typographies, and components. + */ +export interface Library extends PluginData { + /** + * The unique identifier of the library. + */ + readonly id: string; + + /** + * The name of the library. + */ + readonly name: string; + + /** + * An array of color elements in the library. + * @example + * ```js + * console.log(penpot.library.local.colors); + * ``` + */ + readonly colors: LibraryColor[]; + + /** + * An array of typography elements in the library. + */ + readonly typographies: LibraryTypography[]; + + /** + * An array of component elements in the library. + * @example + * ```js + * console.log(penpot.library.local.components); + */ + readonly components: LibraryComponent[]; + + /** + * Creates a new color element in the library. + * @return Returns a new `LibraryColor` object representing the created color element. + * + * @example + * ```js + * const newColor = penpot.library.local.createColor(); + * console.log(newColor); + * ``` + */ + createColor(): LibraryColor; + + /** + * Creates a new typography element in the library. + * @return Returns a new `LibraryTypography` object representing the created typography element. + * + * @example + * ```js + * const newTypography = library.createTypography(); + * ``` + */ + createTypography(): LibraryTypography; + + /** + * Creates a new component element in the library using the provided shapes. + * @param shapes An array of `Shape` objects representing the shapes to be included in the component. + * @return Returns a new `LibraryComponent` object representing the created component element. + * + * @example + * ```js + * const newComponent = penpot.library.local.createComponent([shape1, shape2]); + * ``` + */ + createComponent(shapes: Shape[]): LibraryComponent; +} + +/** + * Represents a color element from a library in Penpot. + * This interface extends `LibraryElement` and includes properties specific to color elements. + */ +export interface LibraryColor extends LibraryElement { + /** + * The color value of the library color. + */ + color?: string; + + /** + * The opacity value of the library color. + */ + opacity?: number; + + /** + * The gradient value of the library color, if it's a gradient. + */ + gradient?: Gradient; + + /** + * The image data of the library color, if it's an image fill. + */ + image?: ImageData; + + /** + * Converts the library color into a fill object. + * @return Returns a `Fill` object representing the color as a fill. + * + * @example + * ```js + * const fill = libraryColor.asFill(); + * ``` + */ + asFill(): Fill; + /** + * Converts the library color into a stroke object. + * @return Returns a `Stroke` object representing the color as a stroke. + * + * @example + * ```js + * const stroke = libraryColor.asStroke(); + * ``` + */ + asStroke(): Stroke; +} + +/** + * Represents a component element from a library in Penpot. + * This interface extends `LibraryElement` and includes properties specific to component elements. + */ +export interface LibraryComponent extends LibraryElement { + /** + * Creates an instance of the component. + * @return Returns a `Shape` object representing the instance of the component. + * + * @example + * ```js + * const componentInstance = libraryComponent.instance(); + * ``` + */ + instance(): Shape; + + /** + * @return Returns the reference to the main component shape. + */ + mainInstance(): Shape; + + /** + * @return true when this component is a VariantComponent + */ + isVariant(): boolean; + + /** + * Creates a new Variant from this standard Component. It creates a VariantContainer, transform this Component into a VariantComponent, duplicates it, and creates a + * set of properties based on the component name and path. + * Similar to doing it with the contextual menu or the shortcut on the Penpot interface + */ + transformInVariant(): void; +} + +/** + * Represents a component element from a library in Penpot. + * This interface extends `LibraryElement` and includes properties specific to component elements. + */ +export interface LibraryVariantComponent extends LibraryComponent { + /** + * Access to the Variant interface, for attributes and actions over the full Variant (not only this VariantComponent) + */ + readonly variants: Variants | null; + + /** + * A list of the variants props of this VariantComponent. Each property have a key and a value + */ + readonly variantProps: { [property: string]: string }; + + /** + * If this VariantComponent has an invalid name, that does't follow the structure [property]=[value], [property]=[value] + * this field stores that invalid name + */ + variantError: string; + + /** + * Creates a duplicate of the current VariantComponent on its Variant + */ + addVariant(): void; + + /** + * Sets the value of the variant property on the indicated position + */ + + setVariantProperty(pos: number, value: string): void; +} + +/** + * Represents the context of Penpot libraries, including both local and connected libraries. + * This type contains references to the local library and an array of connected libraries. + */ +export type LibraryContext = { + /** + * The local library in the Penpot context. + * + * @example + * ```js + * const localLibrary = libraryContext.local; + * ``` + */ + readonly local: Library; + + /** + * An array of connected libraries in the Penpot context. + * + * @example + * ```js + * const connectedLibraries = libraryContext.connected; + * ``` + */ + readonly connected: Library[]; + + /** + * Retrieves a summary of available libraries that can be connected to. + * @return Returns a promise that resolves to an array of `LibrarySummary` objects representing available libraries. + * + * @example + * ```js + * const availableLibraries = await libraryContext.availableLibraries(); + * ``` + */ + availableLibraries(): Promise; + + /** + * Connects to a specific library identified by its ID. + * @return Returns a promise that resolves to the `Library` object representing the connected library. + * @param libraryId - The ID of the library to connect to. + * + * @example + * ```js + * const connectedLibrary = await libraryContext.connectLibrary('library-id'); + * ``` + */ + connectLibrary(libraryId: string): Promise; +}; + +/** + * Represents an element in a Penpot library. + * This interface provides information about a specific element in a library. + */ +export interface LibraryElement extends PluginData { + /** + * The unique identifier of the library element. + */ + readonly id: string; + + /** + * The unique identifier of the library to which the element belongs. + */ + readonly libraryId: string; + + /** + * The name of the library element. + */ + name: string; + + /** + * The path of the library element. + */ + path: string; +} + +/** + * Represents a summary of a Penpot library. + * This interface provides properties for summarizing various aspects of a Penpot library. + */ +export interface LibrarySummary { + /** + * The unique identifier of the library. + */ + readonly id: string; + + /** + * The name of the library. + */ + readonly name: string; + + /** + * The number of colors in the library. + */ + readonly numColors: number; + + /** + * The number of components in the library. + */ + readonly numComponents: number; + + /** + * The number of typographies in the library. + */ + readonly numTypographies: number; +} + +/** + * Represents a typography element from a library in Penpot. + * This interface extends `LibraryElement` and includes properties specific to typography elements. + */ +export interface LibraryTypography extends LibraryElement { + /** + * The unique identifier of the font used in the typography element. + */ + fontId: string; + + /** + * The font family of the typography element. + */ + fontFamily: string; + + /** + * The unique identifier of the font variant used in the typography element. + */ + fontVariantId: string; + + /** + * The font size of the typography element. + */ + fontSize: string; + + /** + * The font weight of the typography element. + */ + fontWeight: string; + + /** + * The font style of the typography element. + */ + fontStyle?: 'normal' | 'italic' | null; + + /** + * The line height of the typography element. + */ + lineHeight: string; + + /** + * The letter spacing of the typography element. + */ + letterSpacing: string; + + /** + * The text transform applied to the typography element. + */ + textTransform?: 'uppercase' | 'capitalize' | 'lowercase' | null; + + /** + * Applies the typography styles to a text shape. + * @param shape The text shape to apply the typography styles to. + * + * @example + * ```js + * typographyElement.applyToText(textShape); + * ``` + */ + applyToText(shape: Shape): void; + + /** + * Applies the typography styles to a range of text within a text shape. + * @param range Represents a range of text within a Text shape. This interface provides properties for styling and formatting text ranges. + * + * @example + * ```js + * typographyElement.applyToTextRange(textShape); + * ``` + */ + applyToTextRange(range: TextRange): void; + + /** + * Sets the font and optionally its variant for the typography element. + * @param font - The font to set. + * @param variant - The font variant to set (optional). + * + * @example + * ```js + * typographyElement.setFont(newFont, newVariant); + * ``` + */ + setFont(font: Font, variant?: FontVariant): void; +} + +/** + * Proxy for the local storage. Only elements owned by the plugin + * can be stored and accessed. + * Warning: other plugins won't be able to access this information but + * the user could potentialy access the data through the browser information. + */ +export interface LocalStorage { + /** + * Retrieve the element with the given key + * Requires the `allow:localstorage` permission. + */ + getItem(key: string): string; + + /** + * Set the data given the key. If the value already existed it + * will be overriden. The value will be stored in a string representation. + * Requires the `allow:localstorage` permission. + */ + setItem(key: string, value: unknown): void; + + /** + * Remove the value stored in the key. + * Requires the `allow:localstorage` permission. + */ + removeItem(key: string): void; + + /** + * Return all the keys for the data stored by the plugin. + * Requires the `allow:localstorage` permission. + */ + getKeys(): string[]; +} + +/** + * It takes the user from one board to the destination set in the interaction. + */ +export interface NavigateTo { + /** + * Type of action + */ + readonly type: 'navigate-to'; + + /** + * Board to which the action targets + */ + readonly destination: Board; + + /** + * When true the scroll will be preserved. + */ + readonly preserveScrollPosition?: boolean; + + /** + * Animation displayed with this interaction. + */ + readonly animation?: Animation; +} + +/** + * It opens a board right over the current board. + */ +export interface OpenOverlay extends OverlayAction { + /** + * The action type + */ + readonly type: 'open-overlay'; +} + +/** + * This action opens an URL in a new tab. + */ +export interface OpenUrl { + /** + * The action type + */ + readonly type: 'open-url'; + /** + * The URL to open when the action is executed + */ + readonly url: string; +} + +/** + * Base type for the actions "open-overlay" and "toggle-overlay" that share most of their properties + */ +export interface OverlayAction { + /** + * Overlay board that will be opened. + */ + readonly destination: Board; + + /** + * Base shape to which the overlay will be positioned taking constraints into account. + */ + readonly relativeTo?: Shape; + + /** + * Positioning of the overlay. + */ + readonly position?: + | 'manual' + | 'center' + | 'top-left' + | 'top-right' + | 'top-center' + | 'bottom-left' + | 'bottom-right' + | 'bottom-center'; + + /** + * For `position = 'manual'` the location of the overlay. + */ + readonly manualPositionLocation?: Point; + + /** + * When true the overlay will be closed when clicking outside + */ + readonly closeWhenClickOutside?: boolean; + + /** + * When true a background will be added to the overlay. + */ + readonly addBackgroundOverlay?: boolean; + + /** + * Animation displayed with this interaction. + */ + readonly animation?: Animation; +} + +/** + * Page represents a page in the Penpot application. + * It includes properties for the page's identifier and name, as well as methods for managing shapes on the page. + */ +export interface Page extends PluginData { + /** + * The `id` property is a unique identifier for the page. + */ + readonly id: string; + /** + * The `name` property is the name of the page. + */ + name: string; + + /** + * The ruler guides attached to the board + */ + readonly rulerGuides: RulerGuide[]; + + /** + * The root shape of the current page. Will be the parent shape of all the shapes inside the document. + * Requires `content:read` permission. + */ + root: Shape; + + /** + * Retrieves a shape by its unique identifier. + * @param id The unique identifier of the shape. + * + * @example + * ```js + * const shape = penpot.currentPage.getShapeById('shapeId'); + * ``` + */ + getShapeById(id: string): Shape | null; + + /** + * Finds all shapes on the page. + * Optionaly it gets a criteria object to search for specific criteria + * @param criteria + * @example + * ```js + * const shapes = penpot.currentPage.findShapes({ name: 'exampleName' }); + * ``` + */ + findShapes(criteria?: { + name?: string; + nameLike?: string; + type?: + | 'board' + | 'group' + | 'boolean' + | 'rectangle' + | 'path' + | 'text' + | 'ellipse' + | 'svg-raw' + | 'image'; + }): Shape[]; + + /** + * The interaction flows defined for the page. + */ + readonly flows: Flow[]; + + /** + * Creates a new flow in the page. + * @param name the name identifying the flow + * @param board the starting board for the current flow + * + * @example + * ```js + * const flow = penpot.currentPage.createFlow('exampleFlow', board); + * ``` + */ + createFlow(name: string, board: Board): Flow; + + /** + * Removes the flow from the page + * @param flow the flow to be removed from the page + */ + removeFlow(flow: Flow): void; + + /** + * Creates a new ruler guide. + */ + addRulerGuide( + orientation: RulerGuideOrientation, + value: number, + board?: Board, + ): RulerGuide; + + /** + * Removes the `guide` from the current page. + */ + removeRulerGuide(guide: RulerGuide): void; + + /** + * Creates a new comment thread in the `position`. Optionaly adds + * it into the `board`. + * Returns the thread created. + * Requires the `comment:write` permission. + */ + addCommentThread(content: string, position: Point): Promise; + + /** + * Removes the comment thread. + * Requires the `comment:write` permission. + */ + removeCommentThread(commentThread: CommentThread): Promise; + + /** + * Find all the comments that match the criteria. + * - `onlyYours`: if `true` will return the threads where the current + * user has engaged. + * - `showResolved`: by default resolved comments will be hidden. If `true` + * the resolved will be returned. + * Requires the `comment:read` or `comment:write` permission. + */ + findCommentThreads(criteria?: { + onlyYours: boolean; + showResolved: boolean; + }): Promise; +} + +/** + * Represents a path shape in Penpot. + * This interface extends `ShapeBase` and includes properties and methods specific to paths. + */ +export interface Path extends ShapeBase { + /** + * The type of the shape, which is always 'path' for path shapes. + */ + readonly type: 'path'; + /** + * Converts the path shape to its path data representation. + * @return Returns the path data (d attribute) as a string. + * @deprecated Use the `d` attribute + */ + toD(): string; + + /** + * The content of the boolean shape, defined as the path string. + * @deprecated Use either `d` or `commands`. + */ + content: string; + + /** + * The content of the boolean shape, defined as the path string. + */ + d: string; + + /** + * The content of the boolean shape, defined as an array of path commands. + */ + commands: Array; + + /** + * The fills applied to the shape. + */ + fills: Fill[]; +} + +/** + * Represents a path command in Penpot. + * This interface includes a property for defining the type of command. + */ +interface PathCommand { + /** + * The type of path command. + * Possible values include: + * - 'M' or 'move-to': Move to a new point. + * - 'Z' or 'close-path': Close the current path. + * - 'L' or 'line-to': Draw a straight line to a new point. + * - 'H' or 'line-to-horizontal': Draw a horizontal line to a new point. + * - 'V' or 'line-to-vertical': Draw a vertical line to a new point. + * - 'C' or 'curve-to': Draw a cubic Bezier curve to a new point. + * - 'S' or 'smooth-curve-to': Draw a smooth cubic Bezier curve to a new point. + * - 'Q' or 'quadratic-bezier-curve-to': Draw a quadratic Bezier curve to a new point. + * - 'T' or 'smooth-quadratic-bezier-curve-to': Draw a smooth quadratic Bezier curve to a new point. + * - 'A' or 'elliptical-arc': Draw an elliptical arc to a new point. + * + * @example + * ```js + * const pathCommand: PathCommand = { command: 'M', params: { x: 0, y: 0 } }; + * ``` + */ + command: + | 'M' + | 'move-to' + | 'Z' + | 'close-path' + | 'L' + | 'line-to' + | 'H' + | 'line-to-horizontal' + | 'V' + | 'line-to-vertical' + | 'C' + | 'curve-to' + | 'S' + | 'smooth-curve-to' + | 'Q' + | 'quadratic-bezier-curve-to' + | 'T' + | 'smooth-quadratic-bezier-curve-to' + | 'A' + | 'elliptical-arc'; + + /** + * Optional parameters associated with the path command. + */ + params?: { + /** + * The x-coordinate of the point (or endpoint). + */ + x?: number; + + /** + * The y-coordinate of the point (or endpoint). + */ + y?: number; + + /** + * The x-coordinate of the first control point for curves. + */ + c1x?: number; + + /** + * The y-coordinate of the first control point for curves. + */ + c1y?: number; + + /** + * The x-coordinate of the second control point for curves. + */ + c2x?: number; + + /** + * The y-coordinate of the second control point for curves. + */ + c2y?: number; + + /** + * The radius of the ellipse's x-axis. + */ + rx?: number; + + /** + * The radius of the ellipse's y-axis. + */ + ry?: number; + + /** + * The rotation angle of the ellipse's x-axis. + */ + xAxisRotation?: number; + + /** + * A flag indicating whether to use the larger arc. + */ + largeArcFlag?: boolean; + + /** + * A flag indicating the direction of the arc. + */ + sweepFlag?: boolean; + }; +} + +/** + * Provides methods for managing plugin-specific data associated with a Penpot shape. + */ +export interface PluginData { + /** + * Retrieves the data for our own plugin, given a specific key. + * + * @param key The key for which to retrieve the data. + * @return Returns the data associated with the key as a string. + * + * @example + * ```js + * const data = shape.getPluginData('exampleKey'); + * console.log(data); + * ``` + */ + getPluginData(key: string): string; + + /** + * Sets the plugin-specific data for the given key. + * + * @param key The key for which to set the data. + * @param value The data to set for the key. + * + * @example + * ```js + * shape.setPluginData('exampleKey', 'exampleValue'); + * ``` + */ + setPluginData(key: string, value: string): void; + + /** + * Retrieves all the keys for the plugin-specific data. + * + * @return Returns an array of strings representing all the keys. + * + * @example + * ```js + * const keys = shape.getPluginDataKeys(); + * console.log(keys); + * ``` + */ + getPluginDataKeys(): string[]; + + /** + * If we know the namespace of an external plugin, this is the way to get their data. + * + * @param namespace The namespace for the shared data. + * @param key The key for which to retrieve the data. + * @return Returns the shared data associated with the key as a string. + * + * @example + * ```js + * const sharedData = shape.getSharedPluginData('exampleNamespace', 'exampleKey'); + * console.log(sharedData); + * ``` + */ + getSharedPluginData(namespace: string, key: string): string; + + /** + * Sets the shared plugin-specific data for the given namespace and key. + * + * @param namespace The namespace for the shared data. + * @param key The key for which to set the data. + * @param value The data to set for the key. + * + * @example + * ```js + * shape.setSharedPluginData('exampleNamespace', 'exampleKey', 'exampleValue'); + * ``` + */ + setSharedPluginData(namespace: string, key: string, value: string): void; + + /** + * Retrieves all the keys for the shared plugin-specific data in the given namespace. + * + * @param namespace The namespace for the shared data. + * @return Returns an array of strings representing all the keys in the namespace. + * + * @example + * ```js + * const sharedKeys = shape.getSharedPluginDataKeys('exampleNamespace'); + * console.log(sharedKeys); + * ``` + */ + getSharedPluginDataKeys(namespace: string): string[]; +} + +/** + * Point represents a point in 2D space, typically with x and y coordinates. + */ +export type Point = { x: number; y: number }; + +/** + * It takes back to the last board shown. + */ +export interface PreviousScreen { + /** + * The action type + */ + readonly type: 'previous-screen'; +} + +/** + * Push animation + */ +export interface Push { + /** + * Type of the animation + */ + readonly type: 'push'; + + /** + * Direction for the push animation + */ + readonly direction: 'right' | 'left' | 'up' | 'down'; + + /** + * Duration of the animation effect + */ + readonly duration: number; + + /** + * Function that the dissolve effect will follow for the interpolation. + * Defaults to `linear` + */ + readonly easing?: 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out'; +} + +/** + * Represents a rectangle shape in Penpot. + * This interface extends `ShapeBase` and includes properties specific to rectangles. + */ +export interface Rectangle extends ShapeBase { + /** + * The type of the shape, which is always 'rect' for rectangle shapes. + */ + readonly type: 'rectangle'; + + /** + * The fills applied to the shape. + */ + fills: Fill[]; +} + +/** + * Represents a ruler guide. These are horizontal or vertical lines that can be + * used to position elements in the UI. + */ +export interface RulerGuide { + /** + * `orientation` indicates whether the ruler is either `horizontal` or `vertical` + */ + readonly orientation: RulerGuideOrientation; + + /** + * `position` is the position in the axis in absolute positioning. If this is a board + * guide will return the positioning relative to the board. + */ + position: number; + + /** + * If the guide is attached to a board this will retrieve the board shape + */ + board?: Board; +} + +/** + * + */ +export type RulerGuideOrientation = 'horizontal' | 'vertical'; + +/** + * Represents shadow properties in Penpot. + * This interface includes properties for defining drop shadows and inner shadows, along with their visual attributes. + */ +export interface Shadow { + /** + * The optional unique identifier for the shadow. + */ + id?: string; + /** + * The optional style of the shadow. + * - 'drop-shadow': A shadow cast outside the element. + * - 'inner-shadow': A shadow cast inside the element. + */ + style?: 'drop-shadow' | 'inner-shadow'; + /** + * The optional X-axis offset of the shadow. + */ + offsetX?: number; + /** + * The optional Y-axis offset of the shadow. + */ + offsetY?: number; + /** + * The optional blur radius of the shadow. + */ + blur?: number; + /** + * The optional spread radius of the shadow. + */ + spread?: number; + /** + * Specifies whether the shadow is hidden. + * Defaults to false if omitted. + */ + hidden?: boolean; + /** + * The optional color of the shadow, defined by a Color object. + */ + color?: Color; +} + +/** + * Shape represents a union of various shape types used in the Penpot project. + * This type allows for different shapes to be handled under a single type umbrella. + * + * @example + * ```js + * let shape: Shape; + * if (penpot.utils.types.isRectangle(shape)) { + * console.log(shape.type); + * } + * ``` + */ +export type Shape = + | Board + | Group + | Boolean + | Rectangle + | Path + | Text + | Ellipse + | SvgRaw + | Image; + +/** + * Represents the base properties and methods of a shape in Penpot. + * This interface provides common properties and methods shared by all shapes. + */ +export interface ShapeBase extends PluginData { + /** + * The unique identifier of the shape. + */ + readonly id: string; + + /** + * The name of the shape. + */ + name: string; + + /** + * The parent shape. If the shape is the first level the parent will be the root shape. + * For the root shape the parent is null + */ + readonly parent: Shape | null; + + /** + * Returns the index of the current shape in the parent + */ + readonly parentIndex: number; + + /** + * The x-coordinate of the shape's position. + */ + x: number; + + /** + * The y-coordinate of the shape's position. + */ + y: number; + + /** + * The width of the shape. + */ + readonly width: number; + + /** + * The height of the shape. + */ + readonly height: number; + + /** + * @return Returns the bounding box surrounding the current shape + */ + readonly bounds: Bounds; + + /** + * @return Returns the geometric center of the shape + */ + readonly center: Point; + + /** + * Indicates whether the shape is blocked. + */ + blocked: boolean; + + /** + * Indicates whether the shape is hidden. + */ + hidden: boolean; + + /** + * Indicates whether the shape is visible. + */ + visible: boolean; + + /** + * Indicates whether the shape has proportion lock enabled. + */ + proportionLock: boolean; + + /** + * The horizontal constraints applied to the shape. + */ + constraintsHorizontal: 'left' | 'right' | 'leftright' | 'center' | 'scale'; + + /** + * The vertical constraints applied to the shape. + */ + constraintsVertical: 'top' | 'bottom' | 'topbottom' | 'center' | 'scale'; + + /** + * The border radius of the shape. + */ + borderRadius: number; + + /** + * The border radius of the top-left corner of the shape. + */ + borderRadiusTopLeft: number; + + /** + * The border radius of the top-right corner of the shape. + */ + borderRadiusTopRight: number; + + /** + * The border radius of the bottom-right corner of the shape. + */ + borderRadiusBottomRight: number; + + /** + * The border radius of the bottom-left corner of the shape. + */ + borderRadiusBottomLeft: number; + + /** + * The opacity of the shape. + */ + opacity: number; + + /** + * The blend mode applied to the shape. + */ + blendMode: + | 'normal' + | 'darken' + | 'multiply' + | 'color-burn' + | 'lighten' + | 'screen' + | 'color-dodge' + | 'overlay' + | 'soft-light' + | 'hard-light' + | 'difference' + | 'exclusion' + | 'hue' + | 'saturation' + | 'color' + | 'luminosity'; + + /** + * The shadows applied to the shape. + */ + shadows: Shadow[]; + + /** + * The blur effect applied to the shape. + */ + blur?: Blur; + + /** + * The export settings of the shape. + */ + exports: Export[]; + + /** + * The x-coordinate of the shape relative to its board. + */ + boardX: number; + + /** + * The y-coordinate of the shape relative to its board. + */ + boardY: number; + + /** + * The x-coordinate of the shape relative to its parent. + */ + parentX: number; + + /** + * The y-coordinate of the shape relative to its parent. + */ + parentY: number; + + /** + * Indicates whether the shape is flipped horizontally. + */ + flipX: boolean; + + /** + * Indicates whether the shape is flipped vertically. + */ + flipY: boolean; + + /** + * @return Returns the rotation in degrees of the shape with respect to it's center. + */ + rotation: number; + + /** + * The fills applied to the shape. + */ + fills: Fill[] | 'mixed'; + + /** + * The strokes applied to the shape. + */ + strokes: Stroke[]; + + /** + * Layout properties for children of the shape. + */ + readonly layoutChild?: LayoutChildProperties; + + /** + * Layout properties for cells in a grid layout. + */ + readonly layoutCell?: LayoutChildProperties; + + /** + * Changes the index inside the parent of the current shape. + * This method will shift the indexes of the shapes around that position to + * match the index. + * If the index is greater than the number of elements it will positioned last. + * + * @param index the new index for the shape to be in + */ + setParentIndex(index: number): void; + + /** + * @return Returns true if the current shape is inside a component instance + */ + isComponentInstance(): boolean; + + /** + * @return Returns true if the current shape is inside a component **main** instance + */ + isComponentMainInstance(): boolean; + + /** + * @return Returns true if the current shape is inside a component **copy** instance + */ + isComponentCopyInstance(): boolean; + + /** + * @return Returns true when the current shape is the root of a component tree + */ + isComponentRoot(): boolean; + + /** + * @return Returns true when the current shape is the head of a components tree nested structure + */ + isComponentHead(): boolean; + + /** + * @return Returns the equivalent shape in the component main instance. If the current shape is inside a + * main instance will return `null`; + */ + componentRefShape(): Shape | null; + + /** + * @return Returns the root of the component tree structure for the current shape. If the current shape + * is already a root will return itself. + */ + componentRoot(): Shape | null; + + /** + * @return Returns the head of the component tree structure for the current shape. If the current shape + * is already a head will return itself. + */ + componentHead(): Shape | null; + + /** + * @return If the shape is a component instance, returns the reference to the component associated + * otherwise will return null + */ + component(): LibraryComponent | null; + + /** + * If the current shape is a component it will remove the component information and leave the + * shape as a "basic shape" + */ + detach(): void; + + /** + * TODO + */ + swapComponent(component: LibraryComponent): void; + + /** + * Switch a VariantComponent copy to the nearest one that has the specified property value + * @param pos The position of the poroperty to update + * @param value The new value of the property + */ + switchVariant(pos: number, value: string): void; + + /** + * Combine several standard Components into a VariantComponent. Similar to doing it with the contextual menu + * on the Penpot interface. + * The current shape must be a component main instance. + * @param ids A list of ids of the main instances of the components to combine with this one. + */ + combineAsVariants(ids: string[]): void; + + /** + * @return Returns true when the current shape is the head of a components tree nested structure, + * and that component is a VariantComponent + */ + isVariantHead(): boolean; + + /** + * Resizes the shape to the specified width and height. + * @param width The new width of the shape. + * @param height The new height of the shape. + * + * @example + * ```js + * shape.resize(200, 100); + * ``` + */ + resize(width: number, height: number): void; + + /** + * Rotates the shape in relation with the given center. + * @param angle Angle in degrees to rotate. + * @param center Center of the transform rotation. If not send will use the geometri center of the shapes. + * + * @example + * ```js + * shape.rotate(45); + * ``` + */ + rotate(angle: number, center?: { x: number; y: number } | null): void; + + /** + * Moves the current shape to the front of its siblings + */ + bringToFront(): void; + + /** + * Moves the current shape one position forward in its list of siblings + */ + bringForward(): void; + + /** + * Moves the current shape to the back of its siblings + */ + sendToBack(): void; + + /** + * Moves the current shape one position backwards in its list of siblings + */ + sendBackward(): void; + + /** + * Generates an export from the current shape. + * + * @example + * ```js + * shape.export({ type: 'png', scale: 2 }); + * ``` + */ + export(config: Export): Promise; + + /** + * The interactions for the current shape. + */ + readonly interactions: Interaction[]; + + /** + * Adds a new interaction to the shape. + * @param trigger defines the conditions under which the action will be triggered + * @param action defines what will be executed when the trigger happens + * @param delay for the type of trigger `after-delay` will specify the time after triggered. Ignored otherwise. + * + * @example + * ```js + * shape.addInteraction('click', { type: 'navigate-to', destination: anotherBoard }); + * ``` + */ + addInteraction(trigger: Trigger, action: Action, delay?: number): Interaction; + + /** + * Removes the interaction from the shape. + * @param interaction is the interaction to remove from the shape + * + * @example + * ```js + * shape.removeInteraction(interaction); + * ``` + */ + removeInteraction(interaction: Interaction): void; + + /** + * Creates a clone of the shape. + * @return Returns a new instance of the shape with identical properties. + */ + clone(): Shape; + + /** + * Removes the shape from its parent. + */ + remove(): void; +} + +/** + * Slide animation + */ +export interface Slide { + /** + * Type of the animation. + */ + readonly type: 'slide'; + + /** + * Indicate if the slide will be either in-to-out `in` or out-to-in `out`. + */ + readonly way: 'in' | 'out'; + + /** + * Direction for the slide animation. + */ + readonly direction: 'right' | 'left' | 'up' | 'down'; + + /** + * Duration of the animation effect. + */ + readonly duration: number; + + /** + * If `true` the offset effect will be used. + */ + readonly offsetEffect?: boolean; + + /** + * Function that the dissolve effect will follow for the interpolation. + * Defaults to `linear`. + */ + readonly easing?: 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out'; +} + +/** + * Represents stroke properties in Penpot. You can add a stroke to any shape except for groups. + * This interface includes properties for defining the color, style, width, alignment, and caps of a stroke. + */ +export interface Stroke { + /** + * The optional color of the stroke, represented as a string (e.g., '#FF5733'). + */ + strokeColor?: string; + /** + * The optional reference to an external file for the stroke color. + */ + strokeColorRefFile?: string; + /** + * The optional reference ID within the external file for the stroke color. + */ + strokeColorRefId?: string; + /** + * The optional opacity level of the stroke color, ranging from 0 (fully transparent) to 1 (fully opaque). + * Defaults to 1 if omitted. + */ + strokeOpacity?: number; + /** + * The optional style of the stroke. + */ + strokeStyle?: 'solid' | 'dotted' | 'dashed' | 'mixed' | 'none' | 'svg'; + /** + * The optional width of the stroke. + */ + strokeWidth?: number; + /** + * The optional alignment of the stroke relative to the shape's boundary. + */ + strokeAlignment?: 'center' | 'inner' | 'outer'; + /** + * The optional cap style for the start of the stroke. + */ + strokeCapStart?: StrokeCap; + /** + * The optional cap style for the end of the stroke. + */ + strokeCapEnd?: StrokeCap; + /** + * The optional gradient stroke defined by a Gradient object. + */ + strokeColorGradient?: Gradient; +} + +/** + * Represents the cap style of a stroke in Penpot. + * This type defines various styles for the ends of a stroke. + */ +export type StrokeCap = + | 'round' + | 'square' + | 'line-arrow' + | 'triangle-arrow' + | 'square-marker' + | 'circle-marker' + | 'diamond-marker'; + +/** + * Represents an SVG raw shape in Penpot. + * This interface extends `ShapeBase` and includes properties specific to raw SVG shapes. + */ +export interface SvgRaw extends ShapeBase { + type: 'svg-raw'; +} + +/** + * Text represents a text element in the Penpot application, extending the base shape interface. + * It includes various properties to define the text content and its styling attributes. + */ +export interface Text extends ShapeBase { + /** + * The type of the shape, which is always 'text' for text shapes. + */ + readonly type: 'text'; + /** + * The characters contained within the text shape. + */ + characters: string; + /** + * The grow type of the text shape, defining how the text box adjusts its size. + * Possible values are: + * - 'fixed': Fixed size. + * - 'auto-width': Adjusts width automatically. + * - 'auto-height': Adjusts height automatically. + */ + growType: 'fixed' | 'auto-width' | 'auto-height'; + + /** + * The font ID used in the text shape, or 'mixed' if multiple fonts are used. + */ + fontId: string | 'mixed'; + + /** + * The font family used in the text shape, or 'mixed' if multiple font families are used. + */ + fontFamily: string | 'mixed'; + + /** + * The font variant ID used in the text shape, or 'mixed' if multiple font variants are used. + */ + fontVariantId: string | 'mixed'; + + /** + * The font size used in the text shape, or 'mixed' if multiple font sizes are used. + */ + fontSize: string | 'mixed'; + + /** + * The font weight used in the text shape, or 'mixed' if multiple font weights are used. + */ + fontWeight: string | 'mixed'; + + /** + * The font style used in the text shape, or 'mixed' if multiple font styles are used. + */ + fontStyle: 'normal' | 'italic' | 'mixed' | null; + + /** + * The line height used in the text shape, or 'mixed' if multiple line heights are used. + */ + lineHeight: string | 'mixed'; + + /** + * The letter spacing used in the text shape, or 'mixed' if multiple letter spacings are used. + */ + letterSpacing: string | 'mixed'; + + /** + * The text transform applied to the text shape, or 'mixed' if multiple text transforms are used. + */ + textTransform: 'uppercase' | 'capitalize' | 'lowercase' | 'mixed' | null; + + /** + * The text decoration applied to the text shape, or 'mixed' if multiple text decorations are used. + */ + textDecoration: 'underline' | 'line-through' | 'mixed' | null; + + /** + * The text direction for the text shape, or 'mixed' if multiple directions are used. + */ + direction: 'ltr' | 'rtl' | 'mixed' | null; + + /** + * The horizontal alignment of the text shape. It can be a specific alignment or 'mixed' if multiple alignments are used. + */ + align: 'left' | 'center' | 'right' | 'justify' | 'mixed' | null; + + /** + * The vertical alignment of the text shape. It can be a specific alignment or 'mixed' if multiple alignments are used. + */ + verticalAlign: 'top' | 'center' | 'bottom' | null; + + /** + * Gets a text range within the text shape. + * @param start - The start index of the text range. + * @param end - The end index of the text range. + * @return Returns a TextRange object representing the specified text range. + * + * @example + * ```js + * const textRange = textShape.getRange(0, 10); + * console.log(textRange.characters); + * ``` + */ + getRange(start: number, end: number): TextRange; + + /** + * Applies a typography style to the text shape. + * @param typography - The typography style to apply. + * @remarks + * This method sets various typography properties for the text shape according to the given typography style. + * + * @example + * ```js + * textShape.applyTypography(typography); + * ``` + */ + applyTypography(typography: LibraryTypography): void; +} + +/** + * Represents a range of text within a Text shape. + * This interface provides properties for styling and formatting text ranges. + */ +export interface TextRange { + /** + * The Text shape to which this text range belongs. + */ + readonly shape: Text; + + /** + * The characters associated with the current text range. + */ + readonly characters: string; + + /** + * The font ID of the text range. It can be a specific font ID or 'mixed' if multiple fonts are used. + */ + fontId: string | 'mixed'; + + /** + * The font family of the text range. It can be a specific font family or 'mixed' if multiple font families are used. + */ + fontFamily: string | 'mixed'; + + /** + * The font variant ID of the text range. It can be a specific font variant ID or 'mixed' if multiple font variants are used. + */ + fontVariantId: string | 'mixed'; + + /** + * The font size of the text range. It can be a specific font size or 'mixed' if multiple font sizes are used. + */ + fontSize: string | 'mixed'; + + /** + * The font weight of the text range. It can be a specific font weight or 'mixed' if multiple font weights are used. + */ + fontWeight: string | 'mixed'; + + /** + * The font style of the text range. It can be a specific font style or 'mixed' if multiple font styles are used. + */ + fontStyle: 'normal' | 'italic' | 'mixed' | null; + + /** + * The line height of the text range. It can be a specific line height or 'mixed' if multiple line heights are used. + */ + lineHeight: string | 'mixed'; + + /** + * The letter spacing of the text range. It can be a specific letter spacing or 'mixed' if multiple letter spacings are used. + */ + letterSpacing: string | 'mixed'; + + /** + * The text transform applied to the text range. It can be a specific text transform or 'mixed' if multiple text transforms are used. + */ + textTransform: + | 'uppercase' + | 'capitalize' + | 'lowercase' + | 'none' + | 'mixed' + | null; + + /** + * The text decoration applied to the text range. It can be a specific text decoration or 'mixed' if multiple text decorations are used. + */ + textDecoration: 'underline' | 'line-through' | 'none' | 'mixed' | null; + + /** + * The text direction for the text range. It can be a specific direction or 'mixed' if multiple directions are used. + */ + direction: 'ltr' | 'rtl' | 'mixed' | null; + + /** + * The fill styles applied to the text range. + */ + fills: Fill[] | 'mixed'; + + /** + * The horizontal alignment of the text range. It can be a specific alignment or 'mixed' if multiple alignments are used. + */ + align: 'left' | 'center' | 'right' | 'justify' | 'mixed' | null; + + /** + * The vertical alignment of the text range. It can be a specific alignment or 'mixed' if multiple alignments are used. + */ + verticalAlign: 'top' | 'center' | 'bottom' | 'mixed' | null; + + /** + * Applies a typography style to the text range. + * This method sets various typography properties for the text range according to the given typography style. + * @param typography - The typography style to apply. + * + * @example + * ```js + * textRange.applyTypography(typography); + * ``` + */ + applyTypography(typography: LibraryTypography): void; +} + +/** + * This type specifies the possible themes: 'light' or 'dark'. + */ +export type Theme = 'light' | 'dark'; + +/** + * It opens an overlay if it is not already opened or closes it if it is already opened. + */ +export interface ToggleOverlay extends OverlayAction { + /** + * The action type + */ + readonly type: 'toggle-overlay'; +} + +/** + * Represents a track configuration in Penpot. + * This interface includes properties for defining the type and value of a track used in layout configurations. + */ +export interface Track { + /** + * The type of the track. + * This can be one of the following values: + * - 'flex': A flexible track type. + * - 'fixed': A fixed track type. + * - 'percent': A track type defined by a percentage. + * - 'auto': An automatic track type. + */ + type: TrackType; + /** + * The value of the track. + * This can be a number representing the size of the track, or null if not applicable. + */ + value: number | null; +} + +/** + * Represents the type of track in Penpot. + * This type defines various track types that can be used in layout configurations. + */ +export type TrackType = 'flex' | 'fixed' | 'percent' | 'auto'; + +/** + * Types of triggers defined: + * - `click` triggers when the user uses the mouse to click on a shape + * - `mouse-enter` triggers when the user moves the mouse inside the shape (even if no mouse button is pressed) + * - `mouse-leave` triggers when the user moves the mouse outside the shape. + * - `after-delay` triggers after the `delay` time has passed even if no interaction from the user happens. + */ +export type Trigger = 'click' | 'mouse-enter' | 'mouse-leave' | 'after-delay'; + +/** + * Represents a user in Penpot. + */ +export interface User { + /** + * The unique identifier of the user. + * + * @example + * ```js + * const userId = user.id; + * console.log(userId); + * ``` + */ + readonly id: string; + + /** + * The name of the user. + * + * @example + * ```js + * const userName = user.name; + * console.log(userName); + * ``` + */ + readonly name?: string; + + /** + * The URL of the user's avatar image. + * + * @example + * ```js + * const avatarUrl = user.avatarUrl; + * console.log(avatarUrl); + * ``` + */ + readonly avatarUrl?: string; + + /** + * The color associated with the user. + * + * @example + * ```js + * const userColor = user.color; + * console.log(userColor); + * ``` + */ + readonly color: string; + + /** + * The session ID of the user. + * + * @example + * ```js + * const sessionId = user.sessionId; + * console.log(sessionId); + * ``` + */ + readonly sessionId?: string; +} + +/** + * TODO + */ +export interface Variants { + /** + * The unique identifier of the variant element. It is the id of the VariantContainer, and all the VariantComponents + * that belong to this variant have an attribute variantId which this is as value. + */ + readonly id: string; + + /** + * The unique identifier of the library to which the variant belongs. + */ + readonly libraryId: string; + + /** + * A list with the names of the properties of the Variant + */ + properties: string[]; + + /** + * A list of all the values of a property along all the variantComponents of this Variant + * @param property The name of the property + */ + currentValues(property: string): string[]; + + /** + * Remove a property of the Variant + * @param pos The position of the property to remove + */ + removeProperty(pos: number): void; + + /** + * Rename a property of the Variant + * @param pos The position of the property to rename + * @param name The new name of the property + */ + renameProperty(pos: number, name: string): void; + + /** + * List all the VariantComponents on this Variant. + */ + variantComponents(): LibraryComponent[]; + + /** + * Creates a duplicate of the main VariantComponent of this Variant + */ + addVariant(): void; + + /** + * Adds a new property to this Variant + */ + addProperty(): void; +} + +/** + * Viewport represents the viewport in the Penpot application. + * It includes the center point, zoom level, and the bounds of the viewport. + */ +export interface Viewport { + /** + * the `center` point of the current viewport. If changed will change the + * viewport position. + */ + center: Point; + + /** + * the `zoom` level as a number where `1` represents 100%. + */ + zoom: number; + + /** + * the `bounds` are the current coordinates of the viewport. + */ + readonly bounds: Bounds; + + /** + * Resets the zoom level. + */ + zoomReset(): void; + + /** + * Changes the viewport and zoom so can fit all the current shapes in the page. + */ + zoomToFitAll(): void; + + /** + * Changes the viewport and zoom so all the `shapes` in the argument are + * visible. + */ + zoomIntoView(shapes: Shape[]): void; +} + +declare global { + const penpot: Penpot; +} diff --git a/plugins/libs/plugin-types/package.json b/plugins/libs/plugin-types/package.json new file mode 100644 index 0000000000..c9dfa6bdc7 --- /dev/null +++ b/plugins/libs/plugin-types/package.json @@ -0,0 +1,6 @@ +{ + "name": "@penpot/plugin-types", + "version": "1.3.2", + "typings": "./index.d.ts", + "type": "module" +} diff --git a/plugins/libs/plugin-types/project.json b/plugins/libs/plugin-types/project.json new file mode 100644 index 0000000000..68512fd9d1 --- /dev/null +++ b/plugins/libs/plugin-types/project.json @@ -0,0 +1,18 @@ +{ + "name": "plugin-types", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/plugin-types", + "projectType": "library", + "targets": { + "lint": { + "command": "tsc -p {projectRoot} --noEmit" + }, + "build": { + "command": "node tools/scripts/build-types.mjs", + "options": { + "outputPath": "dist/plugin-types" + } + } + }, + "tags": ["type:ui"] +} diff --git a/plugins/libs/plugin-types/tsconfig.json b/plugins/libs/plugin-types/tsconfig.json new file mode 100644 index 0000000000..90e3f9dac6 --- /dev/null +++ b/plugins/libs/plugin-types/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "module": "node16", + "lib": ["es6", "dom"], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": ["index.d.ts"] +} diff --git a/plugins/libs/plugins-runtime/README.md b/plugins/libs/plugins-runtime/README.md new file mode 100644 index 0000000000..e7ea4b762e --- /dev/null +++ b/plugins/libs/plugins-runtime/README.md @@ -0,0 +1,3 @@ +# Plugins runtime + +The plugins-runtime is responsible for generating the API and loading Penpot's plugins. diff --git a/plugins/libs/plugins-runtime/eslint.config.js b/plugins/libs/plugins-runtime/eslint.config.js new file mode 100644 index 0000000000..7a4d0ba136 --- /dev/null +++ b/plugins/libs/plugins-runtime/eslint.config.js @@ -0,0 +1,47 @@ +import baseConfig from '../../eslint.config.js'; +import jsoncParser from 'jsonc-eslint-parser'; +import globals from 'globals'; + +export default [ + ...baseConfig, + { + files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], + rules: {}, + languageOptions: { + parserOptions: { + project: './tsconfig.*?.json', + tsconfigRootDir: import.meta.dirname, + }, + globals: { + ...globals.browser, + PluginConfig: 'readonly', + }, + }, + }, + { + files: ['**/*.ts', '**/*.tsx'], + rules: {}, + }, + { + files: ['**/*.js', '**/*.jsx'], + rules: {}, + }, + { + files: ['*.json'], + languageOptions: { + parser: jsoncParser, + }, + rules: { + '@nx/dependency-checks': [ + 'error', + { + ignoredFiles: [ + 'libs/plugins-runtime/vite.config.ts', + 'libs/plugins-runtime/eslint.config.js', + 'libs/plugins-runtime/**/*.spec.ts', + ], + }, + ], + }, + }, +]; diff --git a/plugins/libs/plugins-runtime/package-lock.json b/plugins/libs/plugins-runtime/package-lock.json new file mode 100644 index 0000000000..b484be67cd --- /dev/null +++ b/plugins/libs/plugins-runtime/package-lock.json @@ -0,0 +1,43 @@ +{ + "name": "@penpot/plugins-runtime", + "version": "0.12.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@penpot/plugins-runtime", + "version": "0.12.0", + "dependencies": { + "@penpot/plugin-types": "^0.12.0", + "ses": "^1.1.0", + "zod": "^3.22.4" + } + }, + "node_modules/@endo/env-options": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@endo/env-options/-/env-options-1.1.6.tgz", + "integrity": "sha512-Uqy94PwLTco90Yfign43muvDtjsYTbL6Ck4W5sSWQUqJiFOL+YP8kiBOoGyQynDsGTY0MCQvMxEPfphaJKnzlQ==" + }, + "node_modules/@penpot/plugin-types": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@penpot/plugin-types/-/plugin-types-0.12.0.tgz", + "integrity": "sha512-rtSJ8memBAWxRBEx+S47NFDJN5VIvY0J7QzwTBer45Ls3BjLCaWXCnfFEcRn4SzY+Th01tmop0pwdvN5YDxkBw==" + }, + "node_modules/ses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ses/-/ses-1.8.0.tgz", + "integrity": "sha512-pis9agyAy7s9lDApaYY9OSktkzc10gkBggSbhHXwTf3cWL9H8xA7oKiXIfT/uVNf8dzZN3o2TtPYjer9/axIhw==", + "dependencies": { + "@endo/env-options": "^1.1.6" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/plugins/libs/plugins-runtime/package.json b/plugins/libs/plugins-runtime/package.json new file mode 100644 index 0000000000..2cc3ae3055 --- /dev/null +++ b/plugins/libs/plugins-runtime/package.json @@ -0,0 +1,12 @@ +{ + "name": "@penpot/plugins-runtime", + "version": "1.3.2", + "dependencies": { + "@penpot/plugin-types": "^1.3.2", + "ses": "^1.1.0", + "zod": "^3.22.4" + }, + "module": "./index.mjs", + "typings": "./index.d.ts", + "type": "module" +} diff --git a/plugins/libs/plugins-runtime/project.json b/plugins/libs/plugins-runtime/project.json new file mode 100644 index 0000000000..9a40b4b8af --- /dev/null +++ b/plugins/libs/plugins-runtime/project.json @@ -0,0 +1,14 @@ +{ + "name": "plugins-runtime", + "$schema": "../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "plugins-runtime/src", + "projectType": "library", + "targets": { + "preview": { + "command": "vite preview", + "options": { "cwd": "libs/plugins-runtime" }, + "_": "Delete this targets:preview when https://github.com/nrwl/nx/issues/26800 is fixed" + } + }, + "tags": ["type:feature"] +} diff --git a/plugins/libs/plugins-runtime/src/index.ts b/plugins/libs/plugins-runtime/src/index.ts new file mode 100644 index 0000000000..7810e0fded --- /dev/null +++ b/plugins/libs/plugins-runtime/src/index.ts @@ -0,0 +1,37 @@ +import 'ses'; +import './lib/modal/plugin-modal'; + +import { + ɵloadPlugin, + setContextBuilder, + ɵloadPluginByUrl, + ɵunloadPlugin, +} from './lib/load-plugin.js'; + +import type { Context } from '@penpot/plugin-types'; + +console.log('%c[PLUGINS] Loading plugin system', 'color: #008d7c'); + +repairIntrinsics({ + evalTaming: 'unsafeEval', + stackFiltering: 'verbose', + errorTaming: 'unsafe', + consoleTaming: 'unsafe', + errorTrapping: 'none', + unhandledRejectionTrapping: 'none', +}); + +const globalThisAny$ = globalThis as any; + +export const initPluginsRuntime = (contextBuilder: (id: string) => Context) => { + try { + console.log('%c[PLUGINS] Initialize runtime', 'color: #008d7c'); + setContextBuilder(contextBuilder); + globalThisAny$.ɵcontext = contextBuilder('TEST'); + globalThis.ɵloadPlugin = ɵloadPlugin; + globalThis.ɵloadPluginByUrl = ɵloadPluginByUrl; + globalThis.ɵunloadPlugin = ɵunloadPlugin; + } catch (err) { + console.error(err); + } +}; diff --git a/plugins/libs/plugins-runtime/src/lib/api/index.ts b/plugins/libs/plugins-runtime/src/lib/api/index.ts new file mode 100644 index 0000000000..7ee49458f4 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/api/index.ts @@ -0,0 +1,360 @@ +import type { + Penpot, + EventsMap, + Page, + Shape, + Rectangle, + Board, + Group, + Viewport, + Text, + File, + Theme, + LibraryContext, + Ellipse, + Path, + BooleanType, + Boolean, + User, + ActiveUser, + FontsContext, + SvgRaw, + Color, + ColorShapeInfo, + HistoryContext, + LocalStorage, + VariantContainer, + LibraryComponent, + LibraryVariantComponent, +} from '@penpot/plugin-types'; + +import { Permissions } from '../models/manifest.model.js'; +import { OpenUIOptions } from '../models/open-ui-options.model.js'; +import { z } from 'zod'; +import { createPluginManager } from '../plugin-manager.js'; + +export const validEvents = [ + 'finish', + 'pagechange', + 'filechange', + 'selectionchange', + 'themechange', + 'shapechange', + 'contentsave', +] as const; + +export function createApi( + plugin: Awaited>, +) { + const checkPermission = (permission: Permissions) => { + if (!plugin.manifest.permissions.includes(permission)) { + throw new Error(`Permission ${permission} is not granted`); + } + }; + + const penpot: Penpot = { + ui: { + open: (name: string, url: string, options?: OpenUIOptions) => { + plugin.openModal(name, url, options); + }, + + get size() { + return plugin.getModal()?.size() || null; + }, + + resize: (width: number, height: number) => { + return plugin.resizeModal(width, height); + }, + + sendMessage(message: unknown) { + const event = new CustomEvent('message', { + detail: message, + }); + + plugin.getModal()?.dispatchEvent(event); + }, + + onMessage: (callback: (message: T) => void) => { + z.function().parse(callback); + + plugin.registerMessageCallback(callback as (message: unknown) => void); + }, + }, + + utils: { + geometry: { + center(shapes: Shape[]) { + return (window as any).app.plugins.public_utils.centerShapes(shapes); + }, + }, + types: { + isBoard(shape: Shape): shape is Board { + return shape.type === 'board'; + }, + isGroup(shape: Shape): shape is Group { + return shape.type === 'group'; + }, + isMask(shape: Shape): shape is Group { + return shape.type === 'group' && shape.isMask(); + }, + isBool(shape: Shape): shape is Boolean { + return shape.type === 'boolean'; + }, + isRectangle(shape: Shape): shape is Rectangle { + return shape.type === 'rectangle'; + }, + isPath(shape: Shape): shape is Path { + return shape.type === 'path'; + }, + isText(shape: Shape): shape is Text { + return shape.type === 'text'; + }, + isEllipse(shape: Shape): shape is Ellipse { + return shape.type === 'ellipse'; + }, + isSVG(shape: Shape): shape is SvgRaw { + return shape.type === 'svg-raw'; + }, + isVariantContainer(shape: Shape): shape is VariantContainer { + return shape.type === 'board' && shape.isVariantContainer(); + }, + isVariantComponent( + component: LibraryComponent, + ): component is LibraryVariantComponent { + return component.isVariant(); + }, + }, + }, + + closePlugin: () => { + plugin.close(); + }, + on( + type: T, + callback: (event: EventsMap[T]) => void, + props?: { [key: string]: unknown }, + ): symbol { + // z.function alter fn, so can't use it here + z.enum(validEvents).parse(type); + z.function().parse(callback); + + // To suscribe to events needs the read permission + checkPermission('content:read'); + + return plugin.registerListener(type, callback, props); + }, + + off(eventId: symbol): void { + plugin.destroyListener(eventId); + }, + + // Penpot State API + + get root(): Shape | null { + checkPermission('content:read'); + return plugin.context.root; + }, + + get currentFile(): File | null { + checkPermission('content:read'); + return plugin.context.currentFile; + }, + + get currentPage(): Page | null { + checkPermission('content:read'); + return plugin.context.currentPage; + }, + + get selection(): Shape[] { + checkPermission('content:read'); + return plugin.context.selection; + }, + + set selection(value: Shape[]) { + checkPermission('content:read'); + plugin.context.selection = value; + }, + + get viewport(): Viewport { + return plugin.context.viewport; + }, + + get history(): HistoryContext { + return plugin.context.history; + }, + + get library(): LibraryContext { + checkPermission('library:read'); + return plugin.context.library; + }, + + get fonts(): FontsContext { + checkPermission('content:read'); + return plugin.context.fonts; + }, + + get currentUser(): User { + checkPermission('user:read'); + return plugin.context.currentUser; + }, + + get activeUsers(): ActiveUser[] { + checkPermission('user:read'); + return plugin.context.activeUsers; + }, + + shapesColors(shapes: Shape[]): (Color & ColorShapeInfo)[] { + checkPermission('content:read'); + return plugin.context.shapesColors(shapes); + }, + + replaceColor(shapes: Shape[], oldColor: Color, newColor: Color) { + checkPermission('content:write'); + return plugin.context.replaceColor(shapes, oldColor, newColor); + }, + + get theme(): Theme { + return plugin.context.theme; + }, + + get localStorage(): LocalStorage { + checkPermission('allow:localstorage'); + return plugin.context.localStorage; + }, + + createBoard(): Board { + checkPermission('content:write'); + return plugin.context.createBoard(); + }, + + createRectangle(): Rectangle { + checkPermission('content:write'); + return plugin.context.createRectangle(); + }, + + createEllipse(): Ellipse { + checkPermission('content:write'); + return plugin.context.createEllipse(); + }, + + createText(text: string): Text | null { + checkPermission('content:write'); + return plugin.context.createText(text); + }, + + createPath(): Path { + checkPermission('content:write'); + return plugin.context.createPath(); + }, + + createBoolean(boolType: BooleanType, shapes: Shape[]): Boolean | null { + checkPermission('content:write'); + return plugin.context.createBoolean(boolType, shapes); + }, + + createShapeFromSvg(svgString: string): Group | null { + checkPermission('content:write'); + return plugin.context.createShapeFromSvg(svgString); + }, + + createShapeFromSvgWithImages(svgString: string): Promise { + checkPermission('content:write'); + return plugin.context.createShapeFromSvgWithImages(svgString); + }, + + group(shapes: Shape[]): Group | null { + checkPermission('content:write'); + return plugin.context.group(shapes); + }, + + ungroup(group: Group, ...other: Group[]): void { + checkPermission('content:write'); + plugin.context.ungroup(group, ...other); + }, + + uploadMediaUrl(name: string, url: string) { + checkPermission('content:write'); + return plugin.context.uploadMediaUrl(name, url); + }, + + uploadMediaData(name: string, data: Uint8Array, mimeType: string) { + checkPermission('content:write'); + return plugin.context.uploadMediaData(name, data, mimeType); + }, + + generateMarkup( + shapes: Shape[], + options?: { type?: 'html' | 'svg' }, + ): string { + checkPermission('content:read'); + return plugin.context.generateMarkup(shapes, options); + }, + + generateStyle( + shapes: Shape[], + options?: { + type?: 'css'; + withPrelude?: boolean; + includeChildren?: boolean; + }, + ): string { + checkPermission('content:read'); + return plugin.context.generateStyle(shapes, options); + }, + + generateFontFaces(shapes: Shape[]): Promise { + checkPermission('content:read'); + return plugin.context.generateFontFaces(shapes); + }, + + openViewer(): void { + checkPermission('content:read'); + plugin.context.openViewer(); + }, + + createPage(): Page { + checkPermission('content:write'); + return plugin.context.createPage(); + }, + + openPage(page: Page, newWindow?: boolean): void { + checkPermission('content:read'); + plugin.context.openPage(page, newWindow ?? true); + }, + + alignHorizontal( + shapes: Shape[], + direction: 'left' | 'center' | 'right', + ): void { + checkPermission('content:write'); + plugin.context.alignHorizontal(shapes, direction); + }, + + alignVertical( + shapes: Shape[], + direction: 'top' | 'center' | 'bottom', + ): void { + checkPermission('content:write'); + plugin.context.alignVertical(shapes, direction); + }, + + distributeHorizontal(shapes: Shape[]): void { + checkPermission('content:write'); + plugin.context.distributeHorizontal(shapes); + }, + + distributeVertical(shapes: Shape[]): void { + checkPermission('content:write'); + plugin.context.distributeVertical(shapes); + }, + + flatten(shapes: Shape[]): Path[] { + checkPermission('content:write'); + return plugin.context.flatten(shapes); + }, + }; + + return { + penpot, + }; +} diff --git a/plugins/libs/plugins-runtime/src/lib/api/openUI.api.ts b/plugins/libs/plugins-runtime/src/lib/api/openUI.api.ts new file mode 100644 index 0000000000..dbbeba184c --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/api/openUI.api.ts @@ -0,0 +1,16 @@ +import { z } from 'zod'; +import { openUISchema } from '../models/open-ui-options.schema.js'; +import { createModal } from '../create-modal.js'; + +export const openUIApi = z + .function() + .args( + z.string(), + z.string(), + z.enum(['dark', 'light']), + openUISchema.optional(), + z.boolean().optional(), + ) + .implement((title, url, theme, options, allowDownloads) => { + return createModal(title, url, theme, options, allowDownloads); + }); diff --git a/plugins/libs/plugins-runtime/src/lib/api/plugin-api.spec.ts b/plugins/libs/plugins-runtime/src/lib/api/plugin-api.spec.ts new file mode 100644 index 0000000000..308fb81245 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/api/plugin-api.spec.ts @@ -0,0 +1,121 @@ +import { expect, describe, vi } from 'vitest'; +import { createApi } from './index.js'; +import type { File, Page, Shape } from '@penpot/plugin-types'; + +const mockUrl = 'http://fake.fake/'; + +describe('Plugin api', () => { + function generateMockPluginManager() { + return { + manifest: { + pluginId: 'test', + name: 'test', + code: '', + host: mockUrl, + permissions: [ + 'content:read', + 'content:write', + 'library:read', + 'library:write', + 'user:read', + 'comment:read', + 'comment:write', + 'allow:downloads', + 'allow:localstorage', + ], + }, + openModal: vi.fn(), + getModal: vi.fn(), + registerMessageCallback: vi.fn(), + close: vi.fn(), + registerListener: vi.fn(), + destroyListener: vi.fn(), + context: { + currentFile: null as File | null, + currentPage: null as Page | null, + selection: [] as Shape[], + theme: 'dark', + addListener: vi.fn().mockReturnValueOnce(Symbol()), + removeListener: vi.fn(), + }, + }; + } + + let api: ReturnType; + let pluginManager: ReturnType; + + beforeEach(() => { + pluginManager = generateMockPluginManager(); + + api = createApi(pluginManager as any); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + describe('ui', () => { + describe.concurrent('permissions', () => { + const api = createApi({ + ...pluginManager, + permissions: [], + } as any); + + it('on', () => { + const callback = vi.fn(); + + expect(() => { + api.penpot.on('filechange', callback); + }).toThrow(); + + expect(() => { + api.penpot.on('pagechange', callback); + }).toThrow(); + + expect(() => { + api.penpot.on('selectionchange', callback); + }).toThrow(); + }); + }); + + it('get file state', () => { + const examplePage = { + name: 'test', + id: '123', + } as Page; + + pluginManager.context.currentPage = examplePage; + + const pageState = api.penpot.currentPage; + + expect(pageState).toEqual(examplePage); + }); + + it('get page state', () => { + const exampleFile = { + name: 'test', + id: '123', + revn: 0, + } as File; + + pluginManager.context.currentFile = exampleFile; + + const fileState = api.penpot.currentFile; + + expect(fileState).toEqual(exampleFile); + }); + + it('get selection', () => { + const selection = [ + { id: '123', name: 'test' }, + { id: 'abc', name: 'test2' }, + ] as Shape[]; + + pluginManager.context.selection = selection; + + const currentSelection = api.penpot.selection; + + expect(currentSelection).toEqual(selection); + }); + }); +}); diff --git a/plugins/libs/plugins-runtime/src/lib/assets/resize.svg b/plugins/libs/plugins-runtime/src/lib/assets/resize.svg new file mode 100644 index 0000000000..bfcebe5f85 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/assets/resize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/libs/plugins-runtime/src/lib/create-modal.spec.ts b/plugins/libs/plugins-runtime/src/lib/create-modal.spec.ts new file mode 100644 index 0000000000..80d28fe56c --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/create-modal.spec.ts @@ -0,0 +1,107 @@ +import { describe, it, expect, vi } from 'vitest'; +import { createModal } from './create-modal.js'; +import type { Theme } from '@penpot/plugin-types'; +import type { OpenUIOptions } from './models/open-ui-options.model'; +import type { PluginModalElement } from './modal/plugin-modal'; + +describe('createModal', () => { + const modalMock = { + setTheme: vi.fn(), + style: { + setProperty: vi.fn(), + getPropertyValue: vi.fn(), + }, + wrapper: { + style: {}, + }, + setAttribute: vi.fn(), + } as unknown as PluginModalElement; + + const appendChildSpy = vi + .spyOn(document.body, 'appendChild') + .mockReturnValue(modalMock); + + const createElementSpy = vi + .spyOn(document, 'createElement') + .mockReturnValue(modalMock); + + afterEach(() => { + document.body.innerHTML = ''; + vi.clearAllMocks(); + }); + + it('should create and configure a modal element', () => { + const theme: Theme = 'light'; + const options: OpenUIOptions = { width: 400, height: 600 }; + + const modal = createModal( + 'Test Modal', + 'https://example.com', + theme, + options, + ); + + expect(createElementSpy).toHaveBeenCalledWith('plugin-modal'); + expect(modal.setTheme).toHaveBeenCalledWith(theme); + + expect(modal.style.setProperty).toHaveBeenCalledWith( + '--modal-block-start', + '40px', + ); + + expect(modal.setAttribute).toHaveBeenCalledWith('title', 'Test Modal'); + expect(modal.setAttribute).toHaveBeenCalledWith( + 'iframe-src', + 'https://example.com', + ); + expect(modal.wrapper.style.width).toEqual('400px'); + expect(modal.wrapper.style.height).toEqual('600px'); + + expect(appendChildSpy).toHaveBeenCalledWith(modal); + }); + + it('should apply default dimensions if options are not provided', () => { + const theme: Theme = 'light'; + + const modal = createModal('Test Modal', 'https://example.com', theme); + + expect(modal.wrapper.style.width).toEqual('335px'); + expect(modal.wrapper.style.height).toEqual('590px'); + }); + + it('should limit modal dimensions to the window size', () => { + const theme: Theme = 'light'; + const options: OpenUIOptions = { width: 2000, height: 2000 }; + + window.innerWidth = 1000; + window.innerHeight = 800; + + const modal = createModal( + 'Test Modal', + 'https://example.com', + theme, + options, + ); + + const expectedWidth = 960; + const expectedHeight = 760; + + expect(modal.wrapper.style.width).toEqual(`${expectedWidth}px`); + expect(modal.wrapper.style.height).toEqual(`${expectedHeight}px`); + }); + + it('should apply minimum dimensions to the modal', () => { + const theme: Theme = 'light'; + const options: OpenUIOptions = { width: 100, height: 100 }; + + const modal = createModal( + 'Test Modal', + 'https://example.com', + theme, + options, + ); + + expect(modal.wrapper.style.width).toEqual('200px'); + expect(modal.wrapper.style.height).toEqual('200px'); + }); +}); diff --git a/plugins/libs/plugins-runtime/src/lib/create-modal.ts b/plugins/libs/plugins-runtime/src/lib/create-modal.ts new file mode 100644 index 0000000000..fc82165934 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/create-modal.ts @@ -0,0 +1,92 @@ +import type { OpenUIOptions } from './models/open-ui-options.model.js'; +import type { Theme } from '@penpot/plugin-types'; +import type { PluginModalElement } from './modal/plugin-modal.js'; + +import { parseTranslate } from './parse-translate'; + +export function createModal( + name: string, + url: string, + theme: Theme, + options?: OpenUIOptions, + allowDownloads?: boolean, +) { + const modal = document.createElement('plugin-modal') as PluginModalElement; + + modal.setTheme(theme); + + const { width } = resizeModal(modal, options?.width, options?.height); + + const initialPosition = { + blockStart: 40, + // To be able to resize the element as expected the position must be absolute from the right. + // This value is the length of the window minus the width of the element plus the width of the design tab. + inlineStart: window.innerWidth - width - 290, + }; + + modal.style.setProperty( + '--modal-block-start', + `${initialPosition.blockStart}px`, + ); + modal.style.setProperty( + '--modal-inline-start', + `${initialPosition.inlineStart}px`, + ); + + modal.setAttribute('title', name); + modal.setAttribute('iframe-src', url); + + if (allowDownloads) { + modal.setAttribute('allow-downloads', 'true'); + } + + document.body.appendChild(modal); + + return modal; +} + +export function resizeModal( + modal: PluginModalElement, + width: number = 335, + height: number = 590, +) { + const minPluginWidth = 200; + const minPluginHeight = 200; + + let wrapper = modal.shadowRoot?.querySelector('.wrapper'); + let curX = 0; + let curY = 0; + if (wrapper) { + let rect = wrapper.getBoundingClientRect(); + curX = rect.x; + curY = rect.y; + } + + const maxWidth = window.innerWidth - 40; + const maxHeight = window.innerHeight - 40; + width = Math.min(width, maxWidth); + height = Math.min(height, maxHeight); + + width = Math.max(width, minPluginWidth); + height = Math.max(height, minPluginHeight); + + let deltax = 0; + if (curX + width > maxWidth) { + deltax = maxWidth - (curX + width); + } + + let deltay = 0; + if (curY + height > maxHeight) { + deltay = maxHeight - (curY + height); + } + + let { x, y } = parseTranslate(modal.wrapper); + x = x + deltax; + y = y + deltay; + + modal.wrapper.style.transform = `translate(${x}px, ${y}px)`; + modal.wrapper.style.width = `${width}px`; + modal.wrapper.style.height = `${height}px`; + + return { width, height }; +} diff --git a/plugins/libs/plugins-runtime/src/lib/create-plugin.spec.ts b/plugins/libs/plugins-runtime/src/lib/create-plugin.spec.ts new file mode 100644 index 0000000000..8f3088bbea --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/create-plugin.spec.ts @@ -0,0 +1,123 @@ +import { describe, it, vi, expect, beforeEach, afterEach } from 'vitest'; +import { createPlugin } from './create-plugin'; +import { createPluginManager } from './plugin-manager.js'; +import { createSandbox } from './create-sandbox.js'; +import type { Context } from '@penpot/plugin-types'; +import type { Manifest } from './models/manifest.model.js'; + +vi.mock('./plugin-manager.js', () => ({ + createPluginManager: vi.fn(), +})); + +vi.mock('./create-sandbox.js', () => ({ + createSandbox: vi.fn(), +})); + +describe('createPlugin', () => { + let mockContext: Context; + let manifest: Manifest; + let onCloseCallback: ReturnType; + let mockPluginManager: Awaited>; + let mockSandbox: ReturnType; + + beforeEach(() => { + manifest = { + pluginId: 'test-plugin', + name: 'Test Plugin', + host: 'https://example.com', + code: '', + permissions: [ + 'content:read', + 'content:write', + 'library:read', + 'library:write', + 'user:read', + 'comment:read', + 'comment:write', + 'allow:downloads', + 'allow:localstorage', + ], + }; + + mockPluginManager = { + close: vi.fn(), + openModal: vi.fn(), + getModal: vi.fn(), + registerListener: vi.fn(), + registerMessageCallback: vi.fn(), + sendMessage: vi.fn(), + destroyListener: vi.fn(), + context: mockContext, + manifest, + timeouts: new Set(), + code: 'console.log("Plugin running");', + } as unknown as Awaited>; + + mockSandbox = { + evaluate: vi.fn(), + cleanGlobalThis: vi.fn(), + compartment: {}, + } as unknown as ReturnType; + + mockContext = { + addListener: vi.fn(), + removeListener: vi.fn(), + } as unknown as Context; + + onCloseCallback = vi.fn(); + + vi.mocked(createPluginManager).mockResolvedValue(mockPluginManager); + vi.mocked(createSandbox).mockReturnValue(mockSandbox); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + it('should create the plugin manager and sandbox, then evaluate the plugin code', async () => { + const result = await createPlugin(mockContext, manifest, onCloseCallback); + + expect(createPluginManager).toHaveBeenCalledWith( + mockContext, + manifest, + expect.any(Function), + expect.any(Function), + ); + expect(createSandbox).toHaveBeenCalledWith(mockPluginManager); + expect(mockSandbox.evaluate).toHaveBeenCalled(); + expect(result).toEqual({ + plugin: mockPluginManager, + compartment: mockSandbox, + manifest, + }); + }); + + it('should clean globalThis and call onCloseCallback when plugin is closed', async () => { + await createPlugin(mockContext, manifest, onCloseCallback); + + const onClose = vi.mocked(createPluginManager).mock.calls[0][2]; + onClose(); + + expect(mockSandbox.cleanGlobalThis).toHaveBeenCalled(); + expect(onCloseCallback).toHaveBeenCalled(); + }); + + it('should re-evaluate the plugin code when the modal is reloaded', async () => { + await createPlugin(mockContext, manifest, onCloseCallback); + + const onReloadModal = vi.mocked(createPluginManager).mock.calls[0][3]; + onReloadModal(''); + + expect(mockSandbox.evaluate).toHaveBeenCalled(); + }); + + it('should call plugin.close when there is an exception during sandbox evaluation', async () => { + vi.mocked(mockSandbox.evaluate).mockImplementation(() => { + throw new Error('Evaluation error'); + }); + + await createPlugin(mockContext, manifest, onCloseCallback); + + expect(mockPluginManager.close).toHaveBeenCalled(); + }); +}); diff --git a/plugins/libs/plugins-runtime/src/lib/create-plugin.ts b/plugins/libs/plugins-runtime/src/lib/create-plugin.ts new file mode 100644 index 0000000000..a9dc469d77 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/create-plugin.ts @@ -0,0 +1,42 @@ +import type { Context } from '@penpot/plugin-types'; +import type { Manifest } from './models/manifest.model.js'; +import { createPluginManager } from './plugin-manager.js'; +import { createSandbox } from './create-sandbox.js'; + +export async function createPlugin( + context: Context, + manifest: Manifest, + onCloseCallback: () => void, +) { + const evaluateSandbox = async () => { + try { + sandbox.evaluate(); + } catch (error) { + console.error(error); + + plugin.close(); + } + }; + + const plugin = await createPluginManager( + context, + manifest, + function onClose() { + sandbox.cleanGlobalThis(); + onCloseCallback(); + }, + function onReloadModal() { + evaluateSandbox(); + }, + ); + + const sandbox = createSandbox(plugin); + + evaluateSandbox(); + + return { + plugin, + manifest, + compartment: sandbox, + }; +} diff --git a/plugins/libs/plugins-runtime/src/lib/create-sandbox.spec.ts b/plugins/libs/plugins-runtime/src/lib/create-sandbox.spec.ts new file mode 100644 index 0000000000..97cc4bb123 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/create-sandbox.spec.ts @@ -0,0 +1,163 @@ +import { describe, it, vi, expect, beforeEach, afterEach } from 'vitest'; +import { createSandbox } from './create-sandbox.js'; +import { createApi } from './api'; +import { ses } from './ses.js'; +import type { createPluginManager } from './plugin-manager'; + +vi.mock('./api', () => ({ + createApi: vi.fn(), +})); + +vi.mock('./ses.js', () => ({ + ses: { + hardenIntrinsics: vi.fn(), + createCompartment: vi.fn().mockImplementation((publicApi) => { + return { + evaluate: vi.fn(), + globalThis: publicApi, + }; + }), + harden: vi.fn().mockImplementation((obj) => obj), + safeReturn: vi.fn().mockImplementation((obj) => obj), + }, +})); + +describe('createSandbox', () => { + let mockPlugin: Awaited>; + const compartmentMock = vi.mocked(ses.createCompartment); + + function getLastCompartment() { + return compartmentMock.mock.results[compartmentMock.mock.results.length - 1] + .value; + } + + beforeEach(() => { + mockPlugin = { + code: 'console.log("Plugin running");', + timeouts: new Set>(), + } as unknown as Awaited>; + + vi.mocked(createApi).mockReturnValue({ + penpot: { + closePlugin: vi.fn(), + }, + } as unknown as ReturnType); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + it('should harden intrinsics and create the plugin API', () => { + createSandbox(mockPlugin); + + expect(ses.hardenIntrinsics).toHaveBeenCalled(); + expect(createApi).toHaveBeenCalledWith(mockPlugin); + expect(ses.harden).toHaveBeenCalledWith(expect.any(Object)); + }); + + it('should evaluate the plugin code in the compartment', () => { + const sandbox = createSandbox(mockPlugin); + const compartment = getLastCompartment(); + + sandbox.evaluate(); + + expect(compartment.evaluate).toHaveBeenCalledWith(mockPlugin.code); + }); + + it('should add timeouts to the plugin and clean them on clearTimeout', () => { + const sandbox = createSandbox(mockPlugin); + const handler = vi.fn(); + + const timeoutId = sandbox.compartment.globalThis['setTimeout']( + handler, + 1000, + ); + + expect(timeoutId).toBeDefined(); + expect(mockPlugin.timeouts.has(timeoutId)).toBe(true); + + sandbox.compartment.globalThis['clearTimeout'](timeoutId); + + expect(mockPlugin.timeouts.has(timeoutId)).toBe(false); + }); + + it('should clean the globalThis on cleanGlobalThis', () => { + const sandbox = createSandbox(mockPlugin); + const compartment = getLastCompartment(); + + sandbox.cleanGlobalThis(); + + expect(Object.keys(compartment.globalThis).length).toBe(0); + }); + + it('should ensure fetch requests omit credentials and return a harden response', async () => { + const mockResponse = { + ok: true, + status: 200, + statusText: 'OK', + url: 'https://example.com/api', + text: vi.fn().mockResolvedValue('response text'), + json: vi.fn().mockResolvedValue({ key: 'value' }), + }; + + const sandbox = createSandbox(mockPlugin); + const fetchSpy = vi + .spyOn(window, 'fetch') + .mockResolvedValue(mockResponse as unknown as Response); + + await sandbox.compartment.globalThis['fetch']('https://example.com/api', { + method: 'GET', + credentials: 'include', + headers: { + Authorization: 'Bearer token', + }, + }); + + expect(fetchSpy).toHaveBeenCalledWith('https://example.com/api', { + method: 'GET', + credentials: 'omit', + headers: expect.objectContaining({ + Authorization: '', + }), + }); + + expect(ses.safeReturn).toHaveBeenCalledWith( + expect.objectContaining({ + ok: true, + status: 200, + statusText: 'OK', + url: 'https://example.com/api', + text: expect.any(Function), + json: expect.any(Function), + }), + ); + + fetchSpy.mockRestore(); + }); + + it('should prevent using the api after closing the plugin', async () => { + const sandbox = createSandbox(mockPlugin); + + expect( + Object.keys(sandbox.compartment.globalThis).filter((it) => !!it).length, + ).toBeGreaterThan(0); + + sandbox.cleanGlobalThis(); + + expect( + Object.keys(sandbox.compartment.globalThis).filter((it) => !!it).length, + ).toBe(0); + }); + + it('should return safe values for penpot methods via proxy', () => { + const sandbox = createSandbox(mockPlugin); + const mockPenpotMethod = vi.fn().mockReturnValue('penpot result'); + sandbox.compartment.globalThis['penpot'].mockMethod = mockPenpotMethod; + + const result = sandbox.compartment.globalThis['penpot'].mockMethod(); + + expect(ses.safeReturn).toHaveBeenCalledWith('penpot result'); + expect(result).toBe('penpot result'); + }); +}); diff --git a/plugins/libs/plugins-runtime/src/lib/create-sandbox.ts b/plugins/libs/plugins-runtime/src/lib/create-sandbox.ts new file mode 100644 index 0000000000..9d03f9da95 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/create-sandbox.ts @@ -0,0 +1,139 @@ +import type { Penpot } from '@penpot/plugin-types'; +import type { createPluginManager } from './plugin-manager'; +import { createApi } from './api'; +import { ses } from './ses.js'; +export function createSandbox( + plugin: Awaited>, +) { + ses.hardenIntrinsics(); + + const pluginApi = createApi(plugin); + + const safeHandler = { + get(target: Penpot, prop: string, receiver: unknown) { + const originalValue = Reflect.get(target, prop, receiver); + + if (typeof originalValue === 'function') { + return function (...args: unknown[]) { + const result = originalValue.apply(target, args); + + return ses.safeReturn(result); + }; + } + + return ses.safeReturn(originalValue); + }, + }; + + const proxyApi = new Proxy(pluginApi.penpot, safeHandler); + + const safeFetch = (url: string, options: RequestInit) => { + const sanitizedOptions: RequestInit = { + ...options, + credentials: 'omit', + headers: { + ...options?.headers, + Authorization: '', + }, + }; + + return fetch(url, sanitizedOptions).then((response) => { + const safeResponse = { + ok: response.ok, + status: response.status, + statusText: response.statusText, + url: response.url, + text: response.text.bind(response), + json: response.json.bind(response), + }; + + return ses.safeReturn(safeResponse); + }); + }; + + const publicPluginApi = { + penpot: proxyApi, + fetch: ses.harden(safeFetch), + setTimeout: ses.harden( + (...[handler, timeout]: Parameters) => { + const timeoutId = setTimeout(() => { + handler(); + }, timeout); + + plugin.timeouts.add(timeoutId); + + return ses.safeReturn(timeoutId); + }, + ) as typeof setTimeout, + clearTimeout: ses.harden((id: ReturnType) => { + clearTimeout(id); + + plugin.timeouts.delete(id); + }), + + /** + * GLOBAL FUNCTIONS ACCESIBLE TO PLUGINS + **/ + isFinite: ses.harden(isFinite), + isNaN: ses.harden(isNaN), + parseFloat: ses.harden(parseFloat), + parseInt: ses.harden(parseInt), + decodeURI: ses.harden(decodeURI), + decodeURIComponent: ses.harden(decodeURIComponent), + encodeURI: ses.harden(encodeURI), + encodeURIComponent: ses.harden(encodeURIComponent), + Object: ses.harden(Object), + Boolean: ses.harden(Boolean), + Symbol: ses.harden(Symbol), + Number: ses.harden(Number), + BigInt: ses.harden(BigInt), + Math: ses.harden(Math), + Date: ses.harden(Date), + String: ses.harden(String), + RegExp: ses.harden(RegExp), + Array: ses.harden(Array), + Int8Array: ses.harden(Int8Array), + Uint8Array: ses.harden(Uint8Array), + Uint8ClampedArray: ses.harden(Uint8ClampedArray), + Int16Array: ses.harden(Int16Array), + Uint16Array: ses.harden(Uint16Array), + Int32Array: ses.harden(Int32Array), + Uint32Array: ses.harden(Uint32Array), + BigInt64Array: ses.harden(BigInt64Array), + BigUint64Array: ses.harden(BigUint64Array), + Float32Array: ses.harden(Float32Array), + Float64Array: ses.harden(Float64Array), + Map: ses.harden(Map), + Set: ses.harden(Set), + WeakMap: ses.harden(WeakMap), + WeakSet: ses.harden(WeakSet), + ArrayBuffer: ses.harden(ArrayBuffer), + DataView: ses.harden(DataView), + Atomics: ses.harden(Atomics), + JSON: ses.harden(JSON), + Promise: ses.harden(Promise), + Proxy: ses.harden(Proxy), + Intl: ses.harden(Intl), + + // Window properties + console: ses.harden(window.console), + devicePixelRatio: ses.harden(window.devicePixelRatio), + atob: ses.harden(window.atob), + btoa: ses.harden(window.btoa), + structuredClone: ses.harden(window.structuredClone), + }; + + const compartment = ses.createCompartment(publicPluginApi); + + return { + evaluate: () => { + compartment.evaluate(plugin.code); + }, + cleanGlobalThis: () => { + Object.keys(publicPluginApi).forEach((key) => { + delete compartment.globalThis[key]; + }); + }, + compartment, + }; +} diff --git a/plugins/libs/plugins-runtime/src/lib/drag-handler.spec.ts b/plugins/libs/plugins-runtime/src/lib/drag-handler.spec.ts new file mode 100644 index 0000000000..18ec9ef75c --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/drag-handler.spec.ts @@ -0,0 +1,79 @@ +import { expect, describe, vi } from 'vitest'; +import { dragHandler } from './drag-handler.js'; + +describe('dragHandler', () => { + let element: HTMLElement; + + beforeEach(() => { + element = document.createElement('div'); + document.body.appendChild(element); + }); + + afterEach(() => { + document.body.removeChild(element); + vi.clearAllMocks(); + }); + + it('should attach mousedown event listener to the element', () => { + const addEventListenerMock = vi.spyOn(element, 'addEventListener'); + + dragHandler(element); + + expect(addEventListenerMock).toHaveBeenCalledWith( + 'mousedown', + expect.any(Function), + ); + }); + + it('should update element transform on mousemove', () => { + const mouseDownEvent = new MouseEvent('mousedown', { + clientX: 100, + clientY: 100, + }); + + dragHandler(element); + + element.dispatchEvent(mouseDownEvent); + + const mouseMoveEvent = new MouseEvent('mousemove', { + clientX: 150, + clientY: 150, + }); + document.dispatchEvent(mouseMoveEvent); + + expect(element.style.transform).toBe('translate(50px, 50px)'); + + const mouseMoveEvent2 = new MouseEvent('mousemove', { + clientX: 200, + clientY: 200, + }); + document.dispatchEvent(mouseMoveEvent2); + + expect(element.style.transform).toBe('translate(100px, 100px)'); + }); + + it('should remove event listeners on mouseup', () => { + const removeEventListenerMock = vi.spyOn(document, 'removeEventListener'); + + const mouseDownEvent = new MouseEvent('mousedown', { + clientX: 100, + clientY: 100, + }); + + dragHandler(element); + + element.dispatchEvent(mouseDownEvent); + + const mouseUpEvent = new MouseEvent('mouseup'); + document.dispatchEvent(mouseUpEvent); + + expect(removeEventListenerMock).toHaveBeenCalledWith( + 'mousemove', + expect.any(Function), + ); + expect(removeEventListenerMock).toHaveBeenCalledWith( + 'mouseup', + expect.any(Function), + ); + }); +}); diff --git a/plugins/libs/plugins-runtime/src/lib/drag-handler.ts b/plugins/libs/plugins-runtime/src/lib/drag-handler.ts new file mode 100644 index 0000000000..9ee5c83c93 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/drag-handler.ts @@ -0,0 +1,36 @@ +import { parseTranslate } from './parse-translate'; + +export const dragHandler = ( + el: HTMLElement, + target: HTMLElement = el, + move?: () => void, +) => { + let initialTranslate = { x: 0, y: 0 }; + let initialClientPosition = { x: 0, y: 0 }; + + const handleMouseMove = (moveEvent: MouseEvent) => { + const { clientX: moveX, clientY: moveY } = moveEvent; + const deltaX = moveX - initialClientPosition.x + initialTranslate.x; + const deltaY = moveY - initialClientPosition.y + initialTranslate.y; + + target.style.transform = `translate(${deltaX}px, ${deltaY}px)`; + + move?.(); + }; + + const handleMouseUp = () => { + document.removeEventListener('mousemove', handleMouseMove); + document.removeEventListener('mouseup', handleMouseUp); + }; + + const handleMouseDown = (e: MouseEvent) => { + initialClientPosition = { x: e.clientX, y: e.clientY }; + initialTranslate = parseTranslate(target); + document.addEventListener('mousemove', handleMouseMove); + document.addEventListener('mouseup', handleMouseUp); + }; + + el.addEventListener('mousedown', handleMouseDown); + + return handleMouseUp; +}; diff --git a/plugins/libs/plugins-runtime/src/lib/global.d.ts b/plugins/libs/plugins-runtime/src/lib/global.d.ts new file mode 100644 index 0000000000..4371d65118 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/global.d.ts @@ -0,0 +1,9 @@ +import type { Manifest } from './lib/models/manifest.model'; + +export declare global { + declare namespace globalThis { + function ɵloadPlugin(cofig: Manifest): Promise; + function ɵloadPluginByUrl(url: string): Promise; + function ɵunloadPlugin(id: Manifest['pluginId']): void; + } +} diff --git a/plugins/libs/plugins-runtime/src/lib/load-plugin.spec.ts b/plugins/libs/plugins-runtime/src/lib/load-plugin.spec.ts new file mode 100644 index 0000000000..14be8af026 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/load-plugin.spec.ts @@ -0,0 +1,149 @@ +import { describe, it, vi, expect, beforeEach, afterEach } from 'vitest'; +import { + loadPlugin, + ɵloadPlugin, + ɵloadPluginByUrl, + setContextBuilder, + getPlugins, +} from './load-plugin'; +import { loadManifest } from './parse-manifest'; +import { createPlugin } from './create-plugin'; +import type { Context } from '@penpot/plugin-types'; +import type { Manifest } from './models/manifest.model.js'; + +vi.mock('./parse-manifest', () => ({ + loadManifest: vi.fn(), +})); + +vi.mock('./create-plugin', () => ({ + createPlugin: vi.fn(), +})); + +vi.mock('./ses.js', () => ({ + ses: { + harden: vi.fn().mockImplementation((obj) => obj), + }, +})); + +describe('plugin-loader', () => { + let mockContext: Context; + let manifest: Manifest; + let mockPluginApi: Awaited>; + let mockClose: ReturnType; + + beforeEach(() => { + manifest = { + pluginId: 'test-plugin', + name: 'Test Plugin', + host: '', + code: '', + permissions: [ + 'content:read', + 'content:write', + 'library:read', + 'library:write', + 'user:read', + 'comment:read', + 'comment:write', + 'allow:downloads', + 'allow:localstorage', + ], + }; + + mockClose = vi.fn(); + mockPluginApi = { + plugin: { + close: mockClose, + sendMessage: vi.fn(), + }, + } as unknown as Awaited>; + + mockContext = { + addListener: vi.fn(), + removeListener: vi.fn(), + } as unknown as Context; + + vi.mocked(createPlugin).mockResolvedValue(mockPluginApi); + setContextBuilder(() => mockContext); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + it('should load and initialize a plugin', async () => { + await loadPlugin(manifest); + + expect(createPlugin).toHaveBeenCalledWith( + mockContext, + manifest, + expect.any(Function), + ); + expect(mockPluginApi.plugin.close).not.toHaveBeenCalled(); + expect(getPlugins()).toHaveLength(1); + }); + + it('should close all plugins before loading a new one', async () => { + await loadPlugin(manifest); + await loadPlugin(manifest); + + expect(mockClose).toHaveBeenCalledTimes(1); + expect(createPlugin).toHaveBeenCalledTimes(2); + }); + + it('should remove the plugin from the list on close', async () => { + await loadPlugin(manifest); + + const closeCallback = vi.mocked(createPlugin).mock.calls[0][2]; + closeCallback(); + + expect(getPlugins()).toHaveLength(0); + }); + + it('should handle errors and close all plugins', async () => { + const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + + vi.mocked(createPlugin).mockRejectedValue( + new Error('Plugin creation failed'), + ); + + await loadPlugin(manifest); + + expect(getPlugins()).toHaveLength(0); + expect(consoleSpy).toHaveBeenCalled(); + }); + + it('should handle messages sent to plugins', async () => { + await loadPlugin(manifest); + + window.dispatchEvent(new MessageEvent('message', { data: 'test-message' })); + + expect(mockPluginApi.plugin.sendMessage).toHaveBeenCalledWith( + 'test-message', + ); + }); + + it('should load plugin using ɵloadPlugin', async () => { + await ɵloadPlugin(manifest); + + expect(createPlugin).toHaveBeenCalledWith( + mockContext, + manifest, + expect.any(Function), + ); + }); + + it('should load plugin by URL using ɵloadPluginByUrl', async () => { + const manifestUrl = 'https://example.com/manifest.json'; + vi.mocked(loadManifest).mockResolvedValue(manifest); + + await ɵloadPluginByUrl(manifestUrl); + + expect(loadManifest).toHaveBeenCalledWith(manifestUrl); + expect(createPlugin).toHaveBeenCalledWith( + mockContext, + manifest, + expect.any(Function), + ); + }); +}); diff --git a/plugins/libs/plugins-runtime/src/lib/load-plugin.ts b/plugins/libs/plugins-runtime/src/lib/load-plugin.ts new file mode 100644 index 0000000000..00a56f3b1a --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/load-plugin.ts @@ -0,0 +1,85 @@ +import type { Context } from '@penpot/plugin-types'; + +import { loadManifest } from './parse-manifest.js'; +import { Manifest } from './models/manifest.model.js'; +import { createPlugin } from './create-plugin.js'; +import { ses } from './ses.js'; + +let plugins: Awaited>[] = []; + +export type ContextBuilder = (id: string) => Context; + +let contextBuilder: ContextBuilder | null = null; + +export function setContextBuilder(builder: ContextBuilder) { + contextBuilder = builder; +} + +export const getPlugins = () => plugins; + +const closeAllPlugins = () => { + plugins.forEach((pluginApi) => { + pluginApi.plugin.close(); + }); + + plugins = []; +}; + +window.addEventListener('message', (event) => { + try { + for (const it of plugins) { + it.plugin.sendMessage(event.data); + } + } catch (err) { + console.error(err); + } +}); + +export const loadPlugin = async function ( + manifest: Manifest, + closeCallback?: () => void, +) { + try { + const context = contextBuilder && contextBuilder(manifest.pluginId); + + if (!context) { + return; + } + + closeAllPlugins(); + + const plugin = await createPlugin( + ses.harden(context) as Context, + manifest, + () => { + plugins = plugins.filter((api) => api !== plugin); + closeCallback && closeCallback(); + }, + ); + + plugins.push(plugin); + } catch (error) { + closeAllPlugins(); + console.error(error); + } +}; + +export const ɵloadPlugin = async function ( + manifest: Manifest, + closeCallback?: () => void, +) { + loadPlugin(manifest, closeCallback); +}; + +export const ɵloadPluginByUrl = async function (manifestUrl: string) { + const manifest = await loadManifest(manifestUrl); + ɵloadPlugin(manifest); +}; + +export const ɵunloadPlugin = function (id: Manifest['pluginId']) { + const plugin = plugins.find((plugin) => plugin.manifest.pluginId === id); + + if (plugin) { + plugin.plugin.close(); + } +}; diff --git a/plugins/libs/plugins-runtime/src/lib/modal/plugin-modal.ts b/plugins/libs/plugins-runtime/src/lib/modal/plugin-modal.ts new file mode 100644 index 0000000000..b9a9183c8b --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/modal/plugin-modal.ts @@ -0,0 +1,157 @@ +const closeSvg = ` +`; + +import type { Theme } from '@penpot/plugin-types'; +import { dragHandler } from '../drag-handler.js'; +import modalCss from './plugin.modal.css?inline'; +import { resizeModal } from '../create-modal.js'; + +const MIN_Z_INDEX = 3; + +export class PluginModalElement extends HTMLElement { + constructor() { + super(); + this.attachShadow({ mode: 'open' }); + } + + wrapper = document.createElement('div'); + #inner = document.createElement('div'); + #dragEvents: ReturnType | null = null; + + setTheme(theme: Theme) { + if (this.wrapper) { + this.wrapper.setAttribute('data-theme', theme); + } + } + + resize(width: number, height: number) { + if (this.wrapper) { + resizeModal(this, width, height); + } + } + + disconnectedCallback() { + this.#dragEvents?.(); + } + + calculateZIndex() { + const modals = document.querySelectorAll('plugin-modal'); + + const zIndexModals = Array.from(modals) + .filter((modal) => modal !== this) + .map((modal) => { + return Number(modal.style.zIndex); + }); + + const maxZIndex = Math.max(...zIndexModals, MIN_Z_INDEX); + + this.style.zIndex = (maxZIndex + 1).toString(); + } + + connectedCallback() { + const title = this.getAttribute('title'); + const iframeSrc = this.getAttribute('iframe-src'); + const allowDownloads = this.getAttribute('allow-downloads') || false; + + if (!title || !iframeSrc) { + throw new Error('title and iframe-src attributes are required'); + } + + if (!this.shadowRoot) { + throw new Error('Error creating shadow root'); + } + + this.#inner.classList.add('inner'); + + this.wrapper.classList.add('wrapper'); + this.wrapper.style.maxInlineSize = '90vw'; + this.wrapper.style.maxBlockSize = '90vh'; + + // move modal to the top + this.#dragEvents = dragHandler(this.#inner, this.wrapper, () => { + this.calculateZIndex(); + }); + + const header = document.createElement('div'); + header.classList.add('header'); + + const h1 = document.createElement('h1'); + h1.textContent = title; + + header.appendChild(h1); + + const closeButton = document.createElement('button'); + closeButton.setAttribute('type', 'button'); + closeButton.innerHTML = `
${closeSvg}
`; + closeButton.addEventListener('click', () => { + if (!this.shadowRoot) { + return; + } + + this.shadowRoot.dispatchEvent( + new CustomEvent('close', { + composed: true, + bubbles: true, + }), + ); + }); + + header.appendChild(closeButton); + + const iframe = document.createElement('iframe'); + iframe.src = iframeSrc; + iframe.allow = ''; + iframe.sandbox.add( + 'allow-scripts', + 'allow-forms', + 'allow-modals', + 'allow-popups', + 'allow-popups-to-escape-sandbox', + 'allow-storage-access-by-user-activation', + 'allow-same-origin', + ); + + if (allowDownloads) { + iframe.sandbox.add('allow-downloads'); + } + + iframe.addEventListener('load', () => { + this.shadowRoot?.dispatchEvent( + new CustomEvent('load', { + composed: true, + bubbles: true, + }), + ); + }); + + this.addEventListener('message', (e: Event) => { + if (!iframe.contentWindow) { + return; + } + + iframe.contentWindow.postMessage((e as CustomEvent).detail, '*'); + }); + + this.shadowRoot.appendChild(this.wrapper); + + this.wrapper.appendChild(this.#inner); + this.#inner.appendChild(header); + this.#inner.appendChild(iframe); + + const style = document.createElement('style'); + style.textContent = modalCss; + + this.shadowRoot.appendChild(style); + + this.calculateZIndex(); + } + + size() { + const width = Number(this.wrapper.style.width.replace('px', '') || '300'); + const height = Number(this.wrapper.style.height.replace('px', '') || '400'); + + return { width, height }; + } +} + +customElements.define('plugin-modal', PluginModalElement); diff --git a/plugins/libs/plugins-runtime/src/lib/modal/plugin.modal.css b/plugins/libs/plugins-runtime/src/lib/modal/plugin.modal.css new file mode 100644 index 0000000000..4ac13c45d9 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/modal/plugin.modal.css @@ -0,0 +1,102 @@ +:host { + --spacing-4: 0.25rem; + --spacing-8: calc(var(--spacing-4) * 2); + --spacing-12: calc(var(--spacing-4) * 3); + --spacing-16: calc(var(--spacing-4) * 4); + --spacing-20: calc(var(--spacing-4) * 5); + --spacing-24: calc(var(--spacing-4) * 6); + --spacing-28: calc(var(--spacing-4) * 7); + --spacing-32: calc(var(--spacing-4) * 8); + --spacing-36: calc(var(--spacing-4) * 9); + --spacing-40: calc(var(--spacing-4) * 10); + + --font-weight-regular: 400; + --font-weight-bold: 500; + --font-line-height-s: 1.2; + --font-line-height-m: 1.4; + --font-line-height-l: 1.5; + --font-size-s: 12px; + --font-size-m: 14px; + --font-size-l: 16px; +} + +[data-theme] { + background-color: var(--color-background-primary); + color: var(--color-foreground-secondary); +} + +::-webkit-resizer { + display: none; +} + +.wrapper { + position: absolute; + inset-block-start: var(--modal-block-start); + inset-inline-start: var(--modal-inline-start); + z-index: 1000; + padding: 10px; + border-radius: 15px; + border: 2px solid var(--color-background-quaternary); + box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.3); + overflow: hidden; + min-inline-size: 25px; + min-block-size: 200px; + resize: both; + &:after { + content: ''; + cursor: se-resize; + inline-size: 1rem; + block-size: 1rem; + background-image: url('../assets/resize.svg'); + background-position: center; + right: 5px; + bottom: 5px; + pointer-events: none; + position: absolute; + } +} + +.inner { + padding: 10px; + cursor: grab; + box-sizing: border-box; + display: flex; + flex-direction: column; + overflow: hidden; + block-size: 100%; + & > * { + flex: 1; + } + & > .header { + flex: 0; + } +} + +.header { + align-items: center; + display: flex; + justify-content: space-between; + border-block-end: 2px solid var(--color-background-quaternary); + padding-block-end: var(--spacing-4); +} + +button { + background: transparent; + border: 0; + cursor: pointer; + padding: 0; +} + +h1 { + font-size: var(--font-size-s); + font-weight: var(--font-weight-bold); + margin: 0; + margin-inline-end: var(--spacing-4); + user-select: none; +} + +iframe { + border: none; + inline-size: 100%; + block-size: 100%; +} diff --git a/plugins/libs/plugins-runtime/src/lib/models/manifest.model.ts b/plugins/libs/plugins-runtime/src/lib/models/manifest.model.ts new file mode 100644 index 0000000000..db676e1cca --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/models/manifest.model.ts @@ -0,0 +1,5 @@ +import { z } from 'zod'; +import { manifestSchema } from './manifest.schema.js'; + +export type Manifest = z.infer; +export type Permissions = Manifest['permissions'][number]; diff --git a/plugins/libs/plugins-runtime/src/lib/models/manifest.schema.ts b/plugins/libs/plugins-runtime/src/lib/models/manifest.schema.ts new file mode 100644 index 0000000000..54f12e7044 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/models/manifest.schema.ts @@ -0,0 +1,23 @@ +import { z } from 'zod'; + +export const manifestSchema = z.object({ + pluginId: z.string(), + name: z.string(), + host: z.string().url(), + code: z.string(), + icon: z.string().optional(), + description: z.string().max(200).optional(), + permissions: z.array( + z.enum([ + 'content:read', + 'content:write', + 'library:read', + 'library:write', + 'user:read', + 'comment:read', + 'comment:write', + 'allow:downloads', + 'allow:localstorage', + ]), + ), +}); diff --git a/plugins/libs/plugins-runtime/src/lib/models/open-ui-options.model.ts b/plugins/libs/plugins-runtime/src/lib/models/open-ui-options.model.ts new file mode 100644 index 0000000000..6c5fdf4ca8 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/models/open-ui-options.model.ts @@ -0,0 +1,4 @@ +import { z } from 'zod'; +import { openUISchema } from './open-ui-options.schema.js'; + +export type OpenUIOptions = z.infer; diff --git a/plugins/libs/plugins-runtime/src/lib/models/open-ui-options.schema.ts b/plugins/libs/plugins-runtime/src/lib/models/open-ui-options.schema.ts new file mode 100644 index 0000000000..f008033237 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/models/open-ui-options.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; + +export const openUISchema = z.object({ + width: z.number().positive(), + height: z.number().positive(), +}); diff --git a/plugins/libs/plugins-runtime/src/lib/models/plugin-config.model.ts b/plugins/libs/plugins-runtime/src/lib/models/plugin-config.model.ts new file mode 100644 index 0000000000..d85eb02810 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/models/plugin-config.model.ts @@ -0,0 +1,3 @@ +export interface PluginConfig { + manifest: string; +} diff --git a/plugins/libs/plugins-runtime/src/lib/models/plugin.model.ts b/plugins/libs/plugins-runtime/src/lib/models/plugin.model.ts new file mode 100644 index 0000000000..6366cdc6e7 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/models/plugin.model.ts @@ -0,0 +1,7 @@ +import { EventsMap } from '@penpot/plugin-types'; + +export type RegisterListener = ( + type: K, + event: (arg: EventsMap[K]) => void, + props?: { [key: string]: unknown }, +) => symbol; diff --git a/plugins/libs/plugins-runtime/src/lib/parse-manifest.ts b/plugins/libs/plugins-runtime/src/lib/parse-manifest.ts new file mode 100644 index 0000000000..c5323dd30a --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/parse-manifest.ts @@ -0,0 +1,38 @@ +import { Manifest } from './models/manifest.model.js'; +import { manifestSchema } from './models/manifest.schema.js'; + +export function getValidUrl(host: string, path: string): string { + return new URL(path, host).toString(); +} + +export function loadManifest(url: string): Promise { + return fetch(url) + .then((response) => response.json()) + .then((manifest: Manifest): Manifest => { + const parseResult = manifestSchema.safeParse(manifest); + + if (!parseResult.success) { + throw new Error('Invalid plugin manifest'); + } + + return manifest; + }) + .catch((error) => { + console.error(error); + throw error; + }); +} + +export function loadManifestCode(manifest: Manifest): Promise { + if (!manifest.host && !manifest.code.startsWith('http')) { + return Promise.resolve(manifest.code); + } + + return fetch(getValidUrl(manifest.host, manifest.code)).then((response) => { + if (response.ok) { + return response.text(); + } + + throw new Error('Failed to load plugin code'); + }); +} diff --git a/plugins/libs/plugins-runtime/src/lib/parse-translate.ts b/plugins/libs/plugins-runtime/src/lib/parse-translate.ts new file mode 100644 index 0000000000..1f0081e3c3 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/parse-translate.ts @@ -0,0 +1,11 @@ +export const parseTranslate = (el: HTMLElement | null) => { + let x = 0; + let y = 0; + if (el && window['DOMMatrixReadOnly']) { + const cs = window.getComputedStyle(el); + const matrix = new DOMMatrixReadOnly(cs.transform); + x = matrix.m41; + y = matrix.m42; + } + return { x, y }; +}; diff --git a/plugins/libs/plugins-runtime/src/lib/plugin-manager.spec.ts b/plugins/libs/plugins-runtime/src/lib/plugin-manager.spec.ts new file mode 100644 index 0000000000..564ebe558c --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/plugin-manager.spec.ts @@ -0,0 +1,289 @@ +import { describe, it, vi, expect, beforeEach, afterEach } from 'vitest'; +import { createPluginManager } from './plugin-manager'; +import { loadManifestCode, getValidUrl } from './parse-manifest.js'; +import { PluginModalElement } from './modal/plugin-modal.js'; +import { openUIApi } from './api/openUI.api.js'; +import type { Context, Theme } from '@penpot/plugin-types'; +import type { Manifest } from './models/manifest.model.js'; + +vi.mock('./parse-manifest.js', () => ({ + loadManifestCode: vi.fn(), + getValidUrl: vi.fn(), +})); + +vi.mock('./api/openUI.api.js', () => ({ + openUIApi: vi.fn(), +})); + +describe('createPluginManager', () => { + let mockContext: Context; + let manifest: Manifest; + let onCloseCallback: ReturnType; + let onReloadModal: ReturnType; + let mockModal: { + setTheme: ReturnType; + remove: ReturnType; + addEventListener: ReturnType; + removeEventListener: ReturnType; + getAttribute: ReturnType; + }; + + beforeEach(() => { + manifest = { + pluginId: 'test-plugin', + name: 'Test Plugin', + host: 'https://example.com', + code: '', + permissions: [ + 'content:read', + 'content:write', + 'library:read', + 'library:write', + 'user:read', + 'comment:read', + 'comment:write', + 'allow:downloads', + 'allow:localstorage', + ], + }; + + mockModal = { + setTheme: vi.fn(), + remove: vi.fn(), + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + getAttribute: vi.fn(), + }; + + vi.mocked(openUIApi).mockReturnValue( + mockModal as unknown as PluginModalElement, + ); + + mockContext = { + theme: 'light', + addListener: vi.fn().mockReturnValue(Symbol()), + removeListener: vi.fn(), + } as unknown as Context; + + onCloseCallback = vi.fn(); + onReloadModal = vi.fn(); + + vi.mocked(loadManifestCode).mockResolvedValue( + 'console.log("Plugin loaded");', + ); + vi.mocked(getValidUrl).mockReturnValue('https://example.com/plugin'); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + it('should load the plugin and set up listeners', async () => { + await createPluginManager( + mockContext, + manifest, + onCloseCallback, + onReloadModal, + ); + + expect(loadManifestCode).toHaveBeenCalledWith(manifest); + expect(mockContext.addListener).toHaveBeenCalledWith( + 'themechange', + expect.any(Function), + ); + expect(mockContext.addListener).toHaveBeenCalledWith( + 'finish', + expect.any(Function), + ); + }); + + it('should open a modal with the correct URL and theme', async () => { + const pluginManager = await createPluginManager( + mockContext, + manifest, + onCloseCallback, + onReloadModal, + ); + + pluginManager.openModal('Test Modal', '/test-url', { + width: 400, + height: 300, + }); + + expect(getValidUrl).toHaveBeenCalledWith(manifest.host, '/test-url'); + expect(openUIApi).toHaveBeenCalledWith( + 'Test Modal', + 'https://example.com/plugin', + 'light', + { width: 400, height: 300 }, + true, + ); + expect(mockModal.setTheme).toHaveBeenCalledWith('light'); + expect(mockModal.addEventListener).toHaveBeenCalledWith( + 'close', + expect.any(Function), + { once: true }, + ); + expect(mockModal.addEventListener).toHaveBeenCalledWith( + 'load', + expect.any(Function), + ); + }); + + it('should not open a new modal if the URL has not changed', async () => { + mockModal.getAttribute.mockReturnValue('https://example.com/plugin'); + + const pluginManager = await createPluginManager( + mockContext, + manifest, + onCloseCallback, + onReloadModal, + ); + + pluginManager.openModal('Test Modal', '/test-url'); + pluginManager.openModal('Test Modal', '/test-url'); + + expect(openUIApi).toHaveBeenCalledTimes(1); + }); + + it('should handle theme changes and update the modal theme', async () => { + const pluginManager = await createPluginManager( + mockContext, + manifest, + onCloseCallback, + onReloadModal, + ); + + pluginManager.openModal('Test Modal', '/test-url'); + + const themeChangeCallback = vi + .mocked(mockContext.addListener) + .mock.calls.find((call) => call[0] === 'themechange')?.[1]; + + if (!themeChangeCallback) { + throw new Error('Theme change callback not found'); + } + + themeChangeCallback('dark' as Theme); + + expect(mockModal.setTheme).toHaveBeenCalledWith('dark'); + }); + + it('should remove all event listeners and close the plugin', async () => { + const pluginManager = await createPluginManager( + mockContext, + manifest, + onCloseCallback, + onReloadModal, + ); + + pluginManager.openModal('Test Modal', '/test-url'); + + pluginManager.close(); + + expect(mockContext.removeListener).toHaveBeenCalled(); + expect(mockModal.removeEventListener).toHaveBeenCalledWith( + 'close', + expect.any(Function), + ); + expect(mockModal.remove).toHaveBeenCalled(); + expect(onCloseCallback).toHaveBeenCalled(); + }); + + it('shoud clean setTimeout when plugin is closed', async () => { + const pluginManager = await createPluginManager( + mockContext, + manifest, + onCloseCallback, + onReloadModal, + ); + + pluginManager.timeouts.add(setTimeout(() => {}, 1000)); + pluginManager.timeouts.add(setTimeout(() => {}, 1000)); + + expect(pluginManager.timeouts.size).toBe(2); + + pluginManager.close(); + + expect(pluginManager.timeouts.size).toBe(0); + }); + + it('should reload the modal when reloaded', async () => { + const pluginManager = await createPluginManager( + mockContext, + manifest, + onCloseCallback, + onReloadModal, + ); + + await pluginManager.openModal('Test Modal', '/test-url'); + + const loadCallback = mockModal.addEventListener.mock.calls.find((call) => { + return call[0] === 'load'; + }); + + if (loadCallback) { + // initial load + await loadCallback[1](); + + // reload + await loadCallback[1](); + + expect(onReloadModal).toHaveBeenCalledWith( + 'console.log("Plugin loaded");', + ); + } + }); + + it('should register and trigger message callbacks', async () => { + const pluginManager = await createPluginManager( + mockContext, + manifest, + onCloseCallback, + onReloadModal, + ); + + const callback = vi.fn(); + pluginManager.registerMessageCallback(callback); + + pluginManager.sendMessage('Test Message'); + + expect(callback).toHaveBeenCalledWith('Test Message'); + }); + + it('should register and remove listeners', async () => { + const pluginManager = await createPluginManager( + mockContext, + manifest, + onCloseCallback, + onReloadModal, + ); + + const callback = vi.fn(); + const listenerId = pluginManager.registerListener('themechange', callback); + + expect(mockContext.addListener).toHaveBeenCalledWith( + 'themechange', + expect.any(Function), + undefined, + ); + + pluginManager.destroyListener(listenerId); + + expect(mockContext.removeListener).toHaveBeenCalledWith(listenerId); + }); + + it('should clean up all event listeners on close', async () => { + const pluginManager = await createPluginManager( + mockContext, + manifest, + onCloseCallback, + onReloadModal, + ); + + pluginManager.close(); + + expect(mockContext.removeListener).toHaveBeenCalled(); + expect(onCloseCallback).toHaveBeenCalled(); + }); +}); diff --git a/plugins/libs/plugins-runtime/src/lib/plugin-manager.ts b/plugins/libs/plugins-runtime/src/lib/plugin-manager.ts new file mode 100644 index 0000000000..d6af48fc07 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/plugin-manager.ts @@ -0,0 +1,159 @@ +import type { Context, Theme } from '@penpot/plugin-types'; + +import { getValidUrl, loadManifestCode } from './parse-manifest.js'; +import { Manifest } from './models/manifest.model.js'; +import { PluginModalElement } from './modal/plugin-modal.js'; +import { openUIApi } from './api/openUI.api.js'; +import { OpenUIOptions } from './models/open-ui-options.model.js'; +import { RegisterListener } from './models/plugin.model.js'; +import { openUISchema } from './models/open-ui-options.schema.js'; + +export async function createPluginManager( + context: Context, + manifest: Manifest, + onCloseCallback: () => void, + onReloadModal: (code: string) => void, +) { + let code = await loadManifestCode(manifest); + + let loaded = false; + let destroyed = false; + let modal: PluginModalElement | null = null; + let uiMessagesCallbacks: ((message: unknown) => void)[] = []; + const timeouts = new Set>(); + + const allowDownloads = !!manifest.permissions.find( + (s) => s === 'allow:downloads', + ); + + const themeChangeId = context.addListener('themechange', (theme: Theme) => { + modal?.setTheme(theme); + }); + + const listenerId: symbol = context.addListener('finish', () => { + closePlugin(); + + context?.removeListener(listenerId); + }); + + let listeners: symbol[] = []; + + const removeAllEventListeners = () => { + destroyListener(themeChangeId); + + listeners.forEach((id) => { + destroyListener(id); + }); + + uiMessagesCallbacks = []; + listeners = []; + }; + + const closePlugin = () => { + removeAllEventListeners(); + + timeouts.forEach(clearTimeout); + timeouts.clear(); + + if (modal) { + modal.removeEventListener('close', closePlugin); + modal.remove(); + modal = null; + } + + destroyed = true; + + onCloseCallback(); + }; + + const onLoadModal = async () => { + if (!loaded) { + loaded = true; + return; + } + + removeAllEventListeners(); + + code = await loadManifestCode(manifest); + + onReloadModal(code); + }; + + const openModal = (name: string, url: string, options?: OpenUIOptions) => { + const theme = context.theme as 'light' | 'dark'; + + const modalUrl = getValidUrl(manifest.host, url); + + if (modal?.getAttribute('iframe-src') === modalUrl) { + return; + } + + modal = openUIApi(name, modalUrl, theme, options, allowDownloads); + + modal.setTheme(theme); + + modal.addEventListener('close', closePlugin, { + once: true, + }); + + modal.addEventListener('load', onLoadModal); + }; + + const registerMessageCallback = (callback: (message: unknown) => void) => { + uiMessagesCallbacks.push(callback); + }; + + const registerListener: RegisterListener = (type, callback, props) => { + const id = context.addListener( + type, + (...params) => { + // penpot has a debounce to run the events, so some events can be triggered after the plugin is closed + if (destroyed) { + return; + } + + callback(...params); + }, + props, + ); + + listeners.push(id); + + return id; + }; + + const destroyListener = (listenerId: symbol) => { + context.removeListener(listenerId); + }; + + return { + close: closePlugin, + destroyListener, + openModal, + resizeModal: (width: number, height: number) => { + openUISchema.parse({ width, height }); + + if (modal) { + modal.resize(width, height); + } + }, + getModal: () => modal, + registerListener, + registerMessageCallback, + sendMessage: (message: unknown) => { + uiMessagesCallbacks.forEach((callback) => callback(message)); + }, + get manifest() { + return manifest; + }, + get context() { + return context; + }, + get timeouts() { + return timeouts; + }, + get code() { + return code; + }, + }; +} diff --git a/plugins/libs/plugins-runtime/src/lib/ses.ts b/plugins/libs/plugins-runtime/src/lib/ses.ts new file mode 100644 index 0000000000..6c505ccbe6 --- /dev/null +++ b/plugins/libs/plugins-runtime/src/lib/ses.ts @@ -0,0 +1,23 @@ +let isLockedDown = false; + +export const ses = { + hardenIntrinsics: () => { + if (!isLockedDown) { + isLockedDown = true; + hardenIntrinsics(); + } + }, + createCompartment: (globals?: Object) => { + return new Compartment(globals); + }, + harden: (obj: Object) => { + return harden(obj); + }, + safeReturn(value: T): T { + if (value === null || value === undefined) { + return value; + } + + return harden(value) as T; + }, +}; diff --git a/plugins/libs/plugins-runtime/tsconfig.json b/plugins/libs/plugins-runtime/tsconfig.json new file mode 100644 index 0000000000..73dfecf2d5 --- /dev/null +++ b/plugins/libs/plugins-runtime/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "ESNext", + "lib": ["ESNext", "DOM"], + "forceConsistentCasingInFileNames": true, + "strict": true, + "alwaysStrict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/plugins/libs/plugins-runtime/tsconfig.lib.json b/plugins/libs/plugins-runtime/tsconfig.lib.json new file mode 100644 index 0000000000..21a818da45 --- /dev/null +++ b/plugins/libs/plugins-runtime/tsconfig.lib.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../dist/out-tsc", + "module": "ESNext", + "moduleResolution": "Bundler", + "declaration": true, + "types": ["node", "vite/client"] + }, + "include": ["src/**/*.ts"], + "exclude": ["vite.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/plugins/libs/plugins-runtime/tsconfig.spec.json b/plugins/libs/plugins-runtime/tsconfig.spec.json new file mode 100644 index 0000000000..6901d3759b --- /dev/null +++ b/plugins/libs/plugins-runtime/tsconfig.spec.json @@ -0,0 +1,27 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../dist/out-tsc", + "types": [ + "vitest/globals", + "vitest/importMeta", + "vite/client", + "node", + "vitest", + "ses" + ] + }, + "include": [ + "vite.config.ts", + "vitest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx", + "src/**/*.d.ts" + ] +} diff --git a/plugins/libs/plugins-runtime/vite.config.ts b/plugins/libs/plugins-runtime/vite.config.ts new file mode 100644 index 0000000000..5a588dbf08 --- /dev/null +++ b/plugins/libs/plugins-runtime/vite.config.ts @@ -0,0 +1,82 @@ +/// +import { defineConfig } from 'vite'; +import dts from 'vite-plugin-dts'; +import { viteStaticCopy } from 'vite-plugin-static-copy'; +import * as path from 'path'; +import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'; +import checker from 'vite-plugin-checker'; + +export default defineConfig({ + root: __dirname, + cacheDir: '../node_modules/.vite/plugins-runtime', + + plugins: [ + nxViteTsPaths(), + dts({ + entryRoot: 'src', + tsConfigFilePath: path.join(__dirname, 'tsconfig.lib.json'), + skipDiagnostics: true, + }), + checker({ + typescript: { + buildMode: true, + }, + }), + viteStaticCopy({ + targets: [ + { + src: 'README.md', + dest: '.', + }, + ], + }), + ], + + // Uncomment this if you are using workers. + // worker: { + // plugins: [ nxViteTsPaths() ], + // }, + + // Configuration for building your library. + // See: https://vitejs.dev/guide/build.html#library-mode + build: { + outDir: '../../dist/plugins-runtime', + reportCompressedSize: true, + commonjsOptions: { + transformMixedEsModules: true, + }, + lib: { + // Could also be a dictionary or array of multiple entry points. + entry: 'src/index.ts', + name: 'plugins-runtime', + fileName: 'index', + // Change this to the formats you want to support. + // Don't forget to update your package.json as well. + formats: ['es'], + }, + rollupOptions: { + // External packages that should not be bundled into your library. + external: [], + }, + sourcemap: true, + }, + preview: { + host: '0.0.0.0', + port: 4200, + }, + test: { + watch: false, + globals: true, + cache: { + dir: '../node_modules/.vitest', + }, + environment: 'happy-dom', + include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + + reporters: ['default'], + coverage: { + reportsDirectory: '../coverage/plugins-runtime', + provider: 'v8', + }, + }, +}); diff --git a/plugins/libs/plugins-styles/README.md b/plugins/libs/plugins-styles/README.md new file mode 100644 index 0000000000..6739a9c393 --- /dev/null +++ b/plugins/libs/plugins-styles/README.md @@ -0,0 +1,29 @@ +# Penpot plugin-styles + +This plugin contains a CSS file to help build the UI for Penpot plugins. + +### Getting started + +Install the package: + +```bash +npm install @penpot/plugin-styles +``` + +Import the CSS file into your project: + +```css +@import '@penpot/plugin-styles/styles.css'; +``` + +### Usage + +For detailed examples and to see how to use the styles and components, visit the documentation at: + +[Penpot Plugin Styles Documentation](https://penpot-plugins-styles.pages.dev) + +#### Icons + +We recommend using Feather icons for Penpot plugins to ensure consistency with Penpot's design. + +You can find Feather icons at: [Feather Icons](https://feathericons.com/) diff --git a/plugins/libs/plugins-styles/package.json b/plugins/libs/plugins-styles/package.json new file mode 100644 index 0000000000..511c3f7f86 --- /dev/null +++ b/plugins/libs/plugins-styles/package.json @@ -0,0 +1,5 @@ +{ + "name": "@penpot/plugin-styles", + "version": "1.3.2", + "dependencies": {} +} diff --git a/plugins/libs/plugins-styles/project.json b/plugins/libs/plugins-styles/project.json new file mode 100644 index 0000000000..bddd83f7ab --- /dev/null +++ b/plugins/libs/plugins-styles/project.json @@ -0,0 +1,18 @@ +{ + "name": "plugins-styles", + "$schema": "../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "plugins-styles/src", + "projectType": "library", + "targets": { + "build": { + "command": "node tools/scripts/build-css.mjs", + "options": { + "outputPath": "dist/plugins-styles" + } + }, + "lint": { + "command": "echo 0" + } + }, + "tags": ["type:ui"] +} diff --git a/plugins/libs/plugins-styles/src/lib/components/button.css b/plugins/libs/plugins-styles/src/lib/components/button.css new file mode 100644 index 0000000000..ec1cbbd394 --- /dev/null +++ b/plugins/libs/plugins-styles/src/lib/components/button.css @@ -0,0 +1,185 @@ +:where([data-appearance]:is(button), [role='tab']:is(button)) { + border: 2px solid transparent; + font-weight: 500; + font-size: 12px; + border-radius: 8px; + line-height: 1.2; + padding: 8px 24px 8px 24px; + text-transform: uppercase; + font-family: inherit; + + &:hover:not(:disabled) { + cursor: pointer; + } + + &:focus-visible { + outline: none; + } +} + +[data-theme='dark'] { + [data-appearance='primary']:is(button) { + background-color: var(--da-primary); + border: 2px solid transparent; + color: var(--db-secondary); + + &:hover:not(:disabled) { + background-color: var(--da-tertiary); + border: 2px solid var(--da-tertiary); + } + + &:focus:not(:disabled), + &:focus-visible:not(:disabled) { + border: 2px solid var(--da-primary); + background-color: var(--db-tertiary); + color: var(--df-secondary); + } + + &:active:not(:disabled) { + border: 2px solid var(--da-tertiary); + } + + &:disabled { + background-color: transparent; + border: 2px solid var(--db-quaternary); + color: var(--df-secondary); + } + + &[data-variant='destructive'] { + background-color: var(--error-500); + border: 2px solid transparent; + + &:hover:not(:disabled) { + background-color: var(--error-700); + border: 2px solid var(--error-700); + } + + &:focus:not(:disabled), + &:focus-visible:not(:disabled) { + border: 2px solid var(--error-500); + } + + &:active:not(:disabled) { + background-color: var(--app-red); + border: 2px solid var(--error-700); + } + + &:disabled { + background-color: transparent; + border: var(--df-secondary); + } + } + } + + [data-appearance='secondary']:is(button) { + background-color: var(--db-tertiary); + color: var(--df-secondary); + + &:hover:not(:disabled) { + background-color: var(--db-quaternary); + color: var(--da-primary); + } + + &:focus:not(:disabled), + &:focus-visible:not(:disabled) { + border: 2px solid var(--da-primary); + } + + &:active:not(:disabled) { + color: var(--da-primary); + border: 2px solid var(--db-quaternary); + } + + &:disabled { + background-color: transparent; + border: 2px solid var(--db-quaternary); + } + } +} + +[data-theme='light'] { + [data-appearance='primary']:is(button) { + background-color: var(--la-primary); + color: var(--lb-primary); + + &:hover:not(:disabled) { + background-color: var(--la-tertiary); + } + + &:focus:not(:disabled), + &:focus-visible:not(:disabled) { + color: var(--lf-secondary); + background-color: var(--lb-tertiary); + border: 2px solid var(--la-primary); + } + + &:active:not(:disabled) { + border: 2px solid var(--la-tertiary); + } + + &:disabled { + background-color: transparent; + border: 2px solid var(--lb-quaternary); + color: var(--lf-secondary); + } + + &[data-variant='destructive'] { + background-color: transparent; + border: 2px solid var(--error-200); + color: var(--lf-secondary); + + &:hover:not(:disabled) { + background-color: var(--error-500); + color: var(--lb-secondary); + border: 2px solid var(--error-500); + } + + &:focus:not(:disabled), + &:focus-visible:not(:disabled) { + background-color: var(--error-700); + border: 2px solid var(--error-700); + color: var(--lb-secondary); + border: 2px solid var(--error-700); + } + + &:active:not(:disabled) { + background-color: var(--app-red); + color: var(--lb-primary); + border: 2px solid var(--error-700); + } + + &:disabled { + background-color: var(--error-500); + color: var(--lb-secondary); + } + } + } + + [data-appearance='secondary']:is(button) { + background-color: var(--lb-tertiary); + color: var(--lf-secondary); + + &:hover:not(:disabled) { + background-color: var(--lb-quaternary); + color: var(--la-primary); + } + + &:focus:not(:disabled), + &:focus-visible:not(:disabled) { + background-color: var(--lb-tertiary); + border: 2px solid var(--la-primary); + color: var(--lf-secondary); + } + + &:active:not(:disabled) { + background-color: var(--lb-tertiary); + color: var(--la-primary); + outline: 2px solid var(--lb-quaternary); + } + + &:disabled { + background-color: transparent; + border: 2px solid var(--lb-quaternary); + } + } +} diff --git a/plugins/libs/plugins-styles/src/lib/components/checkbox.css b/plugins/libs/plugins-styles/src/lib/components/checkbox.css new file mode 100644 index 0000000000..20fd3b8d1e --- /dev/null +++ b/plugins/libs/plugins-styles/src/lib/components/checkbox.css @@ -0,0 +1,120 @@ +.checkbox-container { + align-items: center; + color: var(--foreground-secondary); + display: flex; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + & .checkbox-input[type='checkbox'] { + appearance: none; + block-size: var(--spacing-16); + border-radius: var(--spacing-4); + box-sizing: border-box; + cursor: pointer; + inline-size: var(--spacing-16); + margin: 0; + position: relative; + transition: 120ms all ease-in-out; + + &::after { + block-size: 8px; + border-style: solid; + border-width: 0; + content: ''; + display: flex; + inline-size: 5px; + margin-block-start: 2px; + margin-inline-start: 5px; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + } + + &:focus-visible, + &:focus-within { + outline: none; + } + } + + & label { + cursor: pointer; + margin-inline-start: var(--spacing-8); + } +} + +.checkbox-hidden { + block-size: 1px; + border: 0; + clip: rect(1px 1px 1px 1px); + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(50%); + inline-size: 1px; + margin: 0; + overflow: hidden; + padding: 0; + position: absolute; + white-space: nowrap; +} + +[data-theme='dark'] { + .checkbox-input[type='checkbox'] { + background-color: var(--db-quaternary); + border: 1px solid var(--df-secondary); + + &::after { + border-color: var(--db-primary); + } + + &:hover { + background-color: var(--db-quaternary); + border: 1px solid var(--da-primary-muted); + } + + &:focus { + background-color: var(--db-quaternary); + border: 1px solid var(--da-primary); + } + + &:checked { + background-color: var(--da-primary); + border: 1px solid var(--da-primary); + } + + &:checked::after { + border-color: var(--db-primary); + border-width: 0 2px 2px 0; + } + } +} + +[data-theme='light'] { + .checkbox-input[type='checkbox'] { + background-color: var(--lb-quaternary); + border: 1px solid var(--la-primary); + + &::after { + border-color: var(--db-primary); + } + + &:hover { + background-color: var(--lf-secondary); + border: 1px solid var(--lf-secondary); + } + + &:focus { + border: 1px solid var(--lf-secondary); + } + + &:checked { + background-color: var(--la-primary); + border: 1px solid var(--la-primary); + } + + &:checked::after { + border-color: var(--lb-primary); + border-width: 0 2px 2px 0; + } + } +} diff --git a/plugins/libs/plugins-styles/src/lib/components/icon.css b/plugins/libs/plugins-styles/src/lib/components/icon.css new file mode 100644 index 0000000000..41216ace92 --- /dev/null +++ b/plugins/libs/plugins-styles/src/lib/components/icon.css @@ -0,0 +1,11 @@ +.icon { + display: flex; + align-items: center; + block-size: var(--spacing-16); + cursor: default; + font-family: var(--font-size-m); + font-size: var(--font-size-m); + inline-size: var(--spacing-16); + justify-content: center; + user-select: none; +} diff --git a/plugins/libs/plugins-styles/src/lib/components/input.css b/plugins/libs/plugins-styles/src/lib/components/input.css new file mode 100644 index 0000000000..a3f9cdf13c --- /dev/null +++ b/plugins/libs/plugins-styles/src/lib/components/input.css @@ -0,0 +1,125 @@ +.input-label-hidden { + block-size: 1px; + border: 0; + clip: rect(1px 1px 1px 1px); + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(50%); + inline-size: 1px; + margin: 0; + overflow: hidden; + padding: 0; + position: absolute; + white-space: nowrap; +} + +[data-theme='dark'] { + & .input { + background-color: var(--db-tertiary); + border-color: var(--db-tertiary); + color: var(--df-primary); + + &:focus { + border-color: var(--da-primary); + } + + &:hover { + background-color: var(--db-quaternary); + border-color: var(--db-quaternary); + } + + &:focus { + background-color: var(--db-primary); + border-color: var(--da-primary); + } + + &:disabled { + background-color: var(--db-primary); + border-color: var(--db-quaternary); + cursor: not-allowed; + } + + &::placeholder { + color: var(--df-secondary); + } + + &:invalid { + background-color: var(--db-primary); + } + + &.success { + background-color: var(--db-primary); + border-color: var(--da-tertiary); + } + + &.error { + background-color: var(--db-primary); + } + } +} + +[data-theme='light'] { + & .input { + background-color: var(--lb-tertiary); + border-color: var(--lb-tertiary); + color: var(--lf-primary); + + &:focus { + background-color: var(--lb-secondary); + border-color: var(--la-primary); + } + + &:hover { + background-color: var(--lb-quaternary); + border-color: var(--lb-quaternary); + } + + &:focus { + background-color: var(--lb-primary); + border-color: var(--la-primary); + } + + &:disabled { + background-color: var(--lb-primary); + border-color: var(--lb-quaternary); + cursor: not-allowed; + } + + &::placeholder { + color: var(--lf-secondary); + } + + &:invalid { + background-color: var(--lb-primary); + } + + &.success { + background-color: var(--lb-primary); + border-color: var(--la-tertiary); + } + + &.error { + background-color: var(--lb-primary); + } + } +} + +.input { + display: flex; + border: 1px solid; + border-radius: var(--spacing-8); + font-family: inherit; + font-size: var(--font-size-s); + font-weight: var(--font-weight-regular); + line-height: var(--font-line-height-m); + outline: none; + padding-block: var(--spacing-8); + padding-inline: var(--spacing-8); + + &:invalid { + border-color: var(--error-500); + } + + &.error { + border-color: var(--error-500); + } +} diff --git a/plugins/libs/plugins-styles/src/lib/components/radio-button.css b/plugins/libs/plugins-styles/src/lib/components/radio-button.css new file mode 100644 index 0000000000..817b8c0ba6 --- /dev/null +++ b/plugins/libs/plugins-styles/src/lib/components/radio-button.css @@ -0,0 +1,90 @@ +.radio-container { + align-items: center; + display: flex; + + &:not(:last-child) { + margin-block-end: var(--spacing-8); + } + + .radio-input { + align-items: center; + appearance: none; + block-size: var(--spacing-16); + border-radius: 50%; + display: grid; + inline-size: var(--spacing-16); + justify-content: center; + margin: 0; + margin-block-start: 2px; + transform: translateY(-0.075em); + } + + .radio-input::before { + border-radius: 50%; + content: ''; + transform: scale(0); + transition: 120ms transform ease-in-out; + } + + .radio-input:checked::before { + transform: scale(1); + } + + .radio-input:focus-within { + outline: none; + } + + .radio-label { + color: var(--df-secondary); + cursor: pointer; + margin-inline-start: var(--spacing-8); + } +} + +[data-theme='dark'] { + .radio-input { + background-color: var(--db-quaternary); + border: 1px solid var(--df-secondary); + } + + .radio-input::before { + border: 5px solid var(--db-primary); + } + + .radio-input:checked { + background-color: var(--da-primary); + border: 1px solid var(--da-primary); + } + + .radio-input:hover { + border: 1px solid var(--da-primary-muted); + } + + .radio-input:focus { + border: 1px solid var(--da-primary); + } +} + +[data-theme='light'] { + .radio-input { + background-color: var(--lb-quaternary); + border: 1px solid var(--lf-secondary); + } + + .radio-input::before { + border: 5px solid var(--lb-primary); + } + + .radio-input:checked { + background-color: var(--la-primary); + border: 1px solid var(--la-primary); + } + + .radio-input:hover { + border: 1px solid var(--la-primary-muted); + } + + .radio-input:focus { + border: 1px solid var(--la-primary); + } +} diff --git a/plugins/libs/plugins-styles/src/lib/components/select.css b/plugins/libs/plugins-styles/src/lib/components/select.css new file mode 100644 index 0000000000..1142c8c6f7 --- /dev/null +++ b/plugins/libs/plugins-styles/src/lib/components/select.css @@ -0,0 +1,84 @@ +.select { + appearance: none; + background-position: right 7px center; + background-image: url('../icons/chevron-bottom.svg'); + background-repeat: no-repeat; + block-size: 32px; + border: 1px solid; + border-radius: var(--spacing-8); + box-sizing: border-box; + cursor: pointer; + inline-size: 100%; + font-family: inherit; + font-size: var(--font-size-s); + font-weight: var(--font-weight-regular); + line-height: var(--font-line-height-m); + outline: none; + padding-inline: var(--spacing-8); + text-overflow: ellipsis; + white-space: nowrap; + + &:disabled { + cursor: not-allowed; + } +} + +.select-label-hidden { + block-size: 1px; + border: 0; + clip: rect(1px 1px 1px 1px); + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(50%); + inline-size: 1px; + margin: 0; + overflow: hidden; + padding: 0; + position: absolute; + white-space: nowrap; +} + +[data-theme='dark'] { + .select { + background-color: var(--db-tertiary); + border-color: var(--db-tertiary); + color: var(--df-primary); + + &:hover { + background-color: var(--db-quaternary); + border-color: var(--db-quaternary); + } + + &:focus { + background-color: var(--db-tertiary); + border-color: var(--da-primary); + } + + &:disabled { + background-color: var(--db-primary); + border-color: var(--db-quaternary); + } + } +} + +[data-theme='light'] { + .select { + background-color: var(--lb-tertiary); + border-color: var(--lb-tertiary); + color: var(--lf-primary); + + &:hover { + background-color: var(--lb-quaternary); + border-color: var(--lb-quaternary); + } + + &:focus { + background-color: var(--lb-tertiary); + border-color: var(--la-primary); + } + + &:disabled { + background-color: var(--lb-primary); + border-color: var(--lb-quaternary); + } + } +} diff --git a/plugins/libs/plugins-styles/src/lib/components/switch.css b/plugins/libs/plugins-styles/src/lib/components/switch.css new file mode 100644 index 0000000000..87436138e2 --- /dev/null +++ b/plugins/libs/plugins-styles/src/lib/components/switch.css @@ -0,0 +1,49 @@ +.switch-container { + position: relative; + display: inline-block; + width: 46px; + height: 26px; + outline: none; + + input:focus + .switch-slider, + input:active + .switch-slider { + background-color: var(--background-primary); + border-color: var(--accent-primary); + } + + input:checked + .switch-slider:before { + background-color: var(--accent-primary); + transform: translateX(20px); + } + + .switch-slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + border: 1px solid; + border-color: var(--background-tertiary); + background-color: var(--background-tertiary); + transition: 0.4s; + border-radius: 12px; + + &:hover { + background-color: var(--background-quaternary); + border-color: var(--background-quaternary); + } + + &::before { + position: absolute; + content: ''; + height: 16px; + width: 16px; + left: 4px; + bottom: 4px; + background-color: var(--foreground-secondary); + transition: 0.4s; + border-radius: 50%; + } + } +} diff --git a/plugins/libs/plugins-styles/src/lib/core/fonts.css b/plugins/libs/plugins-styles/src/lib/core/fonts.css new file mode 100644 index 0000000000..496ce3de84 --- /dev/null +++ b/plugins/libs/plugins-styles/src/lib/core/fonts.css @@ -0,0 +1,100 @@ +@import url('https://fonts.bunny.net/css?family=work-sans:400,500&display=swap'); + +:root { + /* Font weight */ + --font-weight-regular: 400; + --font-weight-bold: 500; + --font-line-height-s: 1.2; + --font-line-height-m: 1.4; + --font-line-height-l: 1.5; + --font-size-xs: 10px; + --font-size-s: 12px; + --font-size-m: 14px; + --font-size-l: 16px; +} + +code { + font-family: 'Work Sans', sans-serif; +} + +.display { + font-weight: var(--font-weight-regular); + font-size: 36px; + line-height: var(--font-line-height-s); +} + +.title-s { + font-weight: var(--font-weight-regular); + font-size: var(--font-size-m); + line-height: var(--font-line-height-s); +} + +.title-m { + font-weight: var(--font-weight-regular); + font-size: 20px; + line-height: var(--font-line-height-s); +} + +.title-l { + font-weight: var(--font-weight-regular); + font-size: 24px; + line-height: 1.1; +} + +.headline-s { + font-weight: var(--font-weight-bold); + font-size: var(--font-size-s); + line-height: var(--font-line-height-s); + text-transform: uppercase; +} + +.headline-m { + font-weight: var(--font-weight-regular); + font-size: var(--font-size-l); + line-height: var(--font-line-height-m); + text-transform: uppercase; +} + +.headline-l { + font-weight: var(--font-weight-regular); + font-size: 18px; + line-height: var(--font-line-height-s); + text-transform: uppercase; +} + +.body-xs { + font-weight: var(--font-weight-regular); + font-size: var(--font-size-xs); + line-height: var(--font-line-height-s); +} + +.body-s { + font-weight: var(--font-weight-regular); + font-size: var(--font-size-s); + line-height: var(--font-line-height-m); +} + +.body-m { + font-weight: var(--font-weight-regular); + font-size: var(--font-size-m); + line-height: var(--font-line-height-l); +} + +.body-l { + font-weight: var(--font-weight-regular); + font-size: var(--font-size-l); + line-height: var(--font-line-height-l); +} + +.caption { + font-weight: var(--font-weight-regular); + font-size: var(--font-size-s); + line-height: var(--font-line-height-s); +} + +code, +.code-font { + font-weight: var(--font-weight-regular); + font-size: var(--font-size-s); + line-height: var(--font-line-height-l); +} diff --git a/plugins/libs/plugins-styles/src/lib/core/generic.css b/plugins/libs/plugins-styles/src/lib/core/generic.css new file mode 100644 index 0000000000..1aab0a7f50 --- /dev/null +++ b/plugins/libs/plugins-styles/src/lib/core/generic.css @@ -0,0 +1,90 @@ +html, +body { + font-family: 'Work Sans', sans-serif; + font-optical-sizing: auto; + font-style: normal; + margin: 0; + padding: 0; +} + +body, +h1, +h2, +h3, +h4, +h5, +p, +pre { + margin: 0; +} + +*, +::before, +::after { + box-sizing: border-box; + border-width: 0; + border-style: solid; +} + +ul { + list-style: none; + margin: 0; + padding: 0; +} + +[data-theme='dark'] { + color-scheme: dark; + + --background-primary: var(--db-primary); + --background-secondary: var(--db-secondary); + --background-tertiary: var(--db-tertiary); + --background-quaternary: var(--db-quaternary); + + --foreground-primary: var(--df-primary); + --foreground-secondary: var(--df-secondary); + + --accent-primary: var(--da-primary); + --accent-primary-muted: var(--da-primary-muted); + --accent-secondary: var(--da-secondary); + --accent-tertiary: var(--da-tertiary); + --accent-quaternary: var(--da-quaternary); +} + +[data-theme='light'] { + color-scheme: light; + + --background-primary: var(--lb-primary); + --background-secondary: var(--lb-secondary); + --background-tertiary: var(--lb-tertiary); + --background-quaternary: var(--lb-quaternary); + + --foreground-primary: var(--lf-primary); + --foreground-secondary: var(--lf-secondary); + + --accent-primary: var(--la-primary); + --accent-primary-muted: var(--la-primary-muted); + --accent-secondary: var(--la-secondary); + --accent-tertiary: var(--la-tertiary); + --accent-quaternary: var(--la-quaternary); +} + +[data-theme] { + background-color: var(--background-primary); + color: var(--foreground-secondary); +} + +/* ===== Scrollbar CSS ===== */ +::-webkit-scrollbar { + width: 5px; + height: 5px; +} + +::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px transparent; + border-radius: var(--spacing-8); +} + +::-webkit-scrollbar-thumb { + border-radius: var(--spacing-8); + -webkit-box-shadow: inset 0 0 6px #aab5ba; +} diff --git a/plugins/libs/plugins-styles/src/lib/core/spacing.css b/plugins/libs/plugins-styles/src/lib/core/spacing.css new file mode 100644 index 0000000000..bc20f345be --- /dev/null +++ b/plugins/libs/plugins-styles/src/lib/core/spacing.css @@ -0,0 +1,12 @@ +:root { + --spacing-4: 0.25rem; + --spacing-8: calc(var(--spacing-4) * 2); + --spacing-12: calc(var(--spacing-4) * 3); + --spacing-16: calc(var(--spacing-4) * 4); + --spacing-20: calc(var(--spacing-4) * 5); + --spacing-24: calc(var(--spacing-4) * 6); + --spacing-28: calc(var(--spacing-4) * 7); + --spacing-32: calc(var(--spacing-4) * 8); + --spacing-36: calc(var(--spacing-4) * 9); + --spacing-40: calc(var(--spacing-4) * 10); +} diff --git a/plugins/libs/plugins-styles/src/lib/core/swatches.css b/plugins/libs/plugins-styles/src/lib/core/swatches.css new file mode 100644 index 0000000000..80ee5b9234 --- /dev/null +++ b/plugins/libs/plugins-styles/src/lib/core/swatches.css @@ -0,0 +1,71 @@ +:root { + /*BACKGROUND*/ + + /*dark*/ + --db-primary: #18181a; + --db-secondary: #000000; + --db-tertiary: #212426; + --db-quaternary: #2e3434; + + /*light*/ + --lb-primary: #ffffff; + --lb-secondary: #e8eaee; + --lb-tertiary: #f3f4f6; + --lb-quaternary: #eef0f2; + + /*FOREGROUND*/ + + /*dark*/ + + --df-primary: #ffffff; + --df-secondary: #8f9da3; + + /*light*/ + --lf-primary: #000000; + --lf-secondary: #495e74; + + /*ACCENT*/ + + /*dark*/ + --da-primary: #7efff5; + --da-primary-muted: #426158; + --da-secondary: #bb97d8; + --da-tertiary: #00d1b8; + --da-quaternary: #ff6fe0; + + /*light*/ + --la-primary: #6911d4; + --la-primary-muted: #e1d2f5; + --la-secondary: #1345aa; + --la-tertiary: #8c33eb; + --la-quaternary: #ff6fe0; + + /*STATUS COLOR*/ + --success-50: #f0f8ff; + --success-500: #2d9f8f; + --success-950: #0a2927; + --warning-50: #fff4ed; + --warning-500: #fe4811; + --warning-950: #440806; + --error-50: #fff0f3; + --error-200: #ffcada; + --error-500: #ff3277; + --error-700: #c80857; + --error-950: #500124; + --info-50: #f0f8ff; + --info-500: #0e9be9; + --info-950: #082c49; + + /*APP COLOR*/ + --app-white: #ffffff; + --app-black: #000000; + --app-pink: #f49ef7; + --app-blue: #75cafc; + --app-gold: #fdcd79; + --app-indigo: #a9bdfa; + --app-red: #faa6b7; + --app-yellow: #dee563; + --app-purple: #cbaaff; + --app-lemon: #b1e96f; + --app-orange: #f9b489; +} diff --git a/plugins/libs/plugins-styles/src/lib/icons/chevron-bottom.svg b/plugins/libs/plugins-styles/src/lib/icons/chevron-bottom.svg new file mode 100644 index 0000000000..b64d26f413 --- /dev/null +++ b/plugins/libs/plugins-styles/src/lib/icons/chevron-bottom.svg @@ -0,0 +1,11 @@ + + + diff --git a/plugins/libs/plugins-styles/src/lib/styles.css b/plugins/libs/plugins-styles/src/lib/styles.css new file mode 100644 index 0000000000..ba97d2576c --- /dev/null +++ b/plugins/libs/plugins-styles/src/lib/styles.css @@ -0,0 +1,14 @@ +/*core*/ +@import url('core/generic.css'); +@import url('core/swatches.css'); +@import url('core/fonts.css'); +@import url('core/spacing.css'); + +/*components*/ +@import url('components/button.css'); +@import url('components/checkbox.css'); +@import url('components/radio-button.css'); +@import url('components/icon.css'); +@import url('components/select.css'); +@import url('components/input.css'); +@import url('components/switch.css'); diff --git a/plugins/nx.json b/plugins/nx.json new file mode 100644 index 0000000000..8b47f263e3 --- /dev/null +++ b/plugins/nx.json @@ -0,0 +1,82 @@ +{ + "pluginsConfig": { + "@nx/js": { + "analyzeSourceFiles": true + } + }, + "release": { + "projects": [ + "libs/plugins-styles", + "libs/plugin-types", + "libs/plugins-runtime" + ] + }, + "extends": "nx/presets/npm.json", + "$schema": "./node_modules/nx/schemas/nx-schema.json", + "targetDefaults": { + "nx-release-publish": { + "options": { + "packageRoot": "dist/{projectName}" + } + }, + "@nx/vite:build": { + "cache": true, + "dependsOn": ["^build"], + "inputs": ["default", "^default"] + }, + "@nx/esbuild:esbuild": { + "cache": true, + "dependsOn": ["^build"], + "inputs": ["default", "^default"] + }, + "@nx/js:tsc": { + "cache": true, + "dependsOn": ["^build"], + "inputs": ["default", "^default"] + }, + "@angular-devkit/build-angular:application": { + "cache": true, + "dependsOn": ["^build"], + "inputs": ["default", "^default"] + } + }, + "plugins": [ + { + "plugin": "./tools/plugins/plugin-tasks.ts" + }, + { + "plugin": "@nx/vite/plugin", + "options": { + "buildTargetName": "build", + "previewTargetName": "preview", + "testTargetName": "test", + "serveTargetName": "serve", + "serveStaticTargetName": "serve-static" + } + }, + { + "plugin": "@nx/eslint/plugin", + "options": { + "targetName": "lint" + } + } + ], + "generators": { + "@nx/web:application": { + "style": "css", + "linter": "eslint", + "unitTestRunner": "vitest", + "e2eTestRunner": "none", + "projectNameAndRootFormat": "as-provided", + "bundler": "vite" + }, + "@nx/angular:application": { + "e2eTestRunner": "none", + "linter": "eslint", + "style": "css", + "unitTestRunner": "none", + "projectNameAndRootFormat": "as-provided" + } + }, + "useLegacyCache": true +} diff --git a/plugins/package-lock.json b/plugins/package-lock.json new file mode 100644 index 0000000000..f96d167d63 --- /dev/null +++ b/plugins/package-lock.json @@ -0,0 +1,27170 @@ +{ + "name": "penpot-plugins", + "version": "0.6.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "penpot-plugins", + "version": "0.6.0", + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@angular/animations": "19.1.3", + "@angular/common": "19.1.3", + "@angular/compiler": "19.1.3", + "@angular/core": "19.1.3", + "@angular/forms": "19.1.3", + "@angular/platform-browser": "19.1.3", + "@angular/platform-browser-dynamic": "19.1.3", + "@angular/router": "19.1.3", + "axios": "^1.6.0", + "feather-icons": "^4.29.2", + "puppeteer": "^22.11.0", + "rxjs": "~7.8.0", + "ses": "^1.13.1", + "tslib": "^2.3.0", + "uuid": "^9.0.1", + "zod": "^3.22.4", + "zone.js": "0.15.0" + }, + "devDependencies": { + "@angular-devkit/build-angular": "19.1.4", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.0.7", + "@angular-eslint/eslint-plugin": "19.0.2", + "@angular-eslint/eslint-plugin-template": "19.0.2", + "@angular-eslint/template-parser": "19.0.2", + "@angular/cli": "~19.0.0", + "@angular/compiler-cli": "19.1.3", + "@angular/language-service": "19.1.3", + "@commitlint/cli": "^18.6.0", + "@commitlint/config-conventional": "^18.6.0", + "@eslint/eslintrc": "^2.1.1", + "@nx/angular": "20.3.2", + "@nx/esbuild": "20.3.2", + "@nx/eslint": "20.3.2", + "@nx/eslint-plugin": "20.3.2", + "@nx/js": "20.3.2", + "@nx/node": "20.3.2", + "@nx/vite": "20.3.2", + "@nx/web": "20.3.2", + "@schematics/angular": "19.0.7", + "@swc-node/register": "1.9.2", + "@swc/core": "1.5.7", + "@swc/helpers": "0.5.12", + "@types/feather-icons": "^4.29.4", + "@types/node": "20.11.16", + "@types/uuid": "^9.0.8", + "@typescript-eslint/eslint-plugin": "7.18.0", + "@typescript-eslint/parser": "7.18.0", + "@typescript-eslint/utils": "^7.16.0", + "@vitest/coverage-v8": "1.6.0", + "@vitest/ui": "1.6.0", + "concurrently": "^8.2.2", + "esbuild": "^0.19.2", + "eslint": "8.57.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-deprecation": "^2.0.0", + "fs-extra": "^11.2.0", + "globals": "^15.1.0", + "happy-dom": "^13.6.2", + "husky": "^9.0.10", + "jsdom": "~22.1.0", + "jsonc-eslint-parser": "^2.1.0", + "nx": "20.3.2", + "prettier": "^3.4.2", + "swc-loader": "0.1.15", + "tsx": "^4.16.2", + "typedoc": "^0.26.5", + "typescript": "5.6.3", + "vite": "^5.0.0", + "vite-plugin-checker": "^0.6.4", + "vite-plugin-dts": "~2.3.0", + "vite-plugin-static-copy": "^3.1.0", + "vitest": "1.6.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", + "dev": true + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1901.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.4.tgz", + "integrity": "sha512-EoRTN8p7z0YnqOEIJKKu/NwSsCJxFkyGuZOobz7btnUWwlDqG8CNAhJgtlsOXPihwEkHEkzRIm1feDkWEjCYsA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "19.1.4", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular": { + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.1.4.tgz", + "integrity": "sha512-t8qC26Boz1aAMt2xVKthwEXRqMI4ZVwelxRNfHryLdLTujTaehFt3qbjxukMmRGCWmQObauH0UOvDh3pAA24dQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/build-webpack": "0.1901.4", + "@angular-devkit/core": "19.1.4", + "@angular/build": "19.1.4", + "@babel/core": "7.26.0", + "@babel/generator": "7.26.3", + "@babel/helper-annotate-as-pure": "7.25.9", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-transform-async-generator-functions": "7.25.9", + "@babel/plugin-transform-async-to-generator": "7.25.9", + "@babel/plugin-transform-runtime": "7.25.9", + "@babel/preset-env": "7.26.0", + "@babel/runtime": "7.26.0", + "@discoveryjs/json-ext": "0.6.3", + "@ngtools/webpack": "19.1.4", + "@vitejs/plugin-basic-ssl": "1.2.0", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.20", + "babel-loader": "9.2.1", + "browserslist": "^4.21.5", + "copy-webpack-plugin": "12.0.2", + "css-loader": "7.1.2", + "esbuild-wasm": "0.24.2", + "fast-glob": "3.3.3", + "http-proxy-middleware": "3.0.3", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "karma-source-map-support": "1.4.0", + "less": "4.2.1", + "less-loader": "12.2.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.3.1", + "mini-css-extract-plugin": "2.9.2", + "open": "10.1.0", + "ora": "5.4.1", + "picomatch": "4.0.2", + "piscina": "4.8.0", + "postcss": "8.4.49", + "postcss-loader": "8.1.1", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.1", + "sass": "1.83.1", + "sass-loader": "16.0.4", + "semver": "7.6.3", + "source-map-loader": "5.0.0", + "source-map-support": "0.5.21", + "terser": "5.37.0", + "tree-kill": "1.2.2", + "tslib": "2.8.1", + "webpack": "5.97.1", + "webpack-dev-middleware": "7.4.2", + "webpack-dev-server": "5.2.0", + "webpack-merge": "6.0.1", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.24.2" + }, + "peerDependencies": { + "@angular/compiler-cli": "^19.0.0", + "@angular/localize": "^19.0.0", + "@angular/platform-server": "^19.0.0", + "@angular/service-worker": "^19.0.0", + "@angular/ssr": "^19.1.4", + "@web/test-runner": "^0.19.0", + "browser-sync": "^3.0.2", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "karma": "^6.3.0", + "ng-packagr": "^19.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=5.5 <5.8" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "@web/test-runner": { + "optional": true + }, + "browser-sync": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1901.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1901.4.tgz", + "integrity": "sha512-C/Cd1JeRTy2P/powIldc5UZObw92TDGATD/LFlfPfi94celLa2DlEL1ybPTpnGs/R5/q5R26F6fbhmAVSeTJ8g==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1901.4", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" + } + }, + "node_modules/@angular-devkit/core": { + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.4.tgz", + "integrity": "sha512-IDvSSiQgaixH2RtZtIpq1+XaHeuzMiTWfDyNF9DuYcU+S8CdG1SWrc8d59tmOrM/q+IRGyFgbBhTU1un52hNHw==", + "dev": true, + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.7.tgz", + "integrity": "sha512-BHXQv6kMc9xo4TH9lhwMv8nrZXHkLioQvLun2qYjwvOsyzt3qd+sUM9wpHwbG6t+01+FIQ05iNN9ox+Cvpndgg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "19.0.7", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.12", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.7.tgz", + "integrity": "sha512-VyuORSitT6LIaGUEF0KEnv2TwNaeWl6L3/4L4stok0BJ23B4joVca2DYVcrLC1hSzz8V4dwVgSlbNIgjgGdVpg==", + "dev": true, + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.0.2.tgz", + "integrity": "sha512-HPmp92r70SNO/0NdIaIhxrgVSpomqryuUk7jszvNRtu+OzYCJGcbLhQD38T3dbBWT/AV0QXzyzExn6/2ai9fEw==", + "dev": true + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.0.2.tgz", + "integrity": "sha512-DLuNVVGGFicSThOcMSJyNje+FZSPdG0B3lCBRiqcgKH/16kfM4pV8MobPM7RGK2NhaOmmZ4zzJNwpwWPSgi+Lw==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "19.0.2", + "@angular-eslint/utils": "19.0.2" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.0.2.tgz", + "integrity": "sha512-f/OCF9ThnxQ8m0eNYPwnCrySQPhYfCOF6STL7F9LnS8Bs3ZeW3/oT1yLaMIZ1Eg0ogIkgxksMAJZjrJPUPBD1Q==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "19.0.2", + "@angular-eslint/utils": "19.0.2", + "aria-query": "5.3.2", + "axobject-query": "4.1.0" + }, + "peerDependencies": { + "@typescript-eslint/types": "^7.11.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/template-parser": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.0.2.tgz", + "integrity": "sha512-z3rZd2sBfuYcFf9rGDsB2zz2fbGX8kkF+0ftg9eocyQmzWrlZHFmuw9ha7oP/Mz8gpblyCS/aa1U/Srs6gz0UQ==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "19.0.2", + "eslint-scope": "^8.0.2" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/utils": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.0.2.tgz", + "integrity": "sha512-HotBT8OKr7zCaX1S9k27JuhRiTVIbbYVl6whlb3uwdMIPIWY8iOcEh1tjI4qDPUafpLfR72Dhwi5bO1E17F3/Q==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "19.0.2" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular/animations": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.3.tgz", + "integrity": "sha512-MI+Tbp9OOisrQtTQH7o+xiQCODXicCs8WHNpGzdCpnXdRkQuVSOb6xAjD9OXJqcQGotLgeyennnkIJGXdz4RTA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "19.1.3" + } + }, + "node_modules/@angular/build": { + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.4.tgz", + "integrity": "sha512-yfvLeUT2a8JTuVBY259vsSv0uLyhikHHgQcWa3VSr0TvCKrwCsBIFDq7vqmhLqIVWi/Z4D7n3J5JQAbDrl38Sg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1901.4", + "@babel/core": "7.26.0", + "@babel/helper-annotate-as-pure": "7.25.9", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-syntax-import-attributes": "7.26.0", + "@inquirer/confirm": "5.1.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", + "browserslist": "^4.23.0", + "esbuild": "0.24.2", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "listr2": "8.2.5", + "magic-string": "0.30.17", + "mrmime": "2.0.0", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.2", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", + "semver": "7.6.3", + "vite": "6.0.7", + "watchpack": "2.4.2" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.2.2" + }, + "peerDependencies": { + "@angular/compiler": "^19.0.0", + "@angular/compiler-cli": "^19.0.0", + "@angular/localize": "^19.0.0", + "@angular/platform-server": "^19.0.0", + "@angular/service-worker": "^19.0.0", + "@angular/ssr": "^19.1.4", + "less": "^4.2.0", + "ng-packagr": "^19.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=5.5 <5.8" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular/build/node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular/build/node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "node_modules/@angular/build/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/@angular/build/node_modules/vite": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", + "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/@angular/cli": { + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.7.tgz", + "integrity": "sha512-y6C4B4XdiZwe2+OADLWXyKqUVvW/XDzTuJ2mZ5PhTnSiiXDN4zRWId1F5wA8ve8vlbUKApPHXRQuaqiQJmA24g==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1900.7", + "@angular-devkit/core": "19.0.7", + "@angular-devkit/schematics": "19.0.7", + "@inquirer/prompts": "7.1.0", + "@listr2/prompt-adapter-inquirer": "2.0.18", + "@schematics/angular": "19.0.7", + "@yarnpkg/lockfile": "1.1.0", + "ini": "5.0.0", + "jsonc-parser": "3.3.1", + "listr2": "8.2.5", + "npm-package-arg": "12.0.0", + "npm-pick-manifest": "10.0.0", + "pacote": "20.0.0", + "resolve": "1.22.8", + "semver": "7.6.3", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { + "version": "0.1900.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.7.tgz", + "integrity": "sha512-3dRV0IB+MbNYbAGbYEFMcABkMphqcTvn5MG79dQkwcf2a9QZxCq2slwf/rIleWoDUcFm9r1NnVPYrTYNYJaqQg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "19.0.7", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.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": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.7.tgz", + "integrity": "sha512-VyuORSitT6LIaGUEF0KEnv2TwNaeWl6L3/4L4stok0BJ23B4joVca2DYVcrLC1hSzz8V4dwVgSlbNIgjgGdVpg==", + "dev": true, + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular/cli/node_modules/npm-package-arg": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", + "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", + "dev": true, + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@angular/cli/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "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/@angular/common": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.3.tgz", + "integrity": "sha512-r1P0W6FKrON83szIJboF8z6UNCVL4HIxyD+nhmHMMT/iJpu4kDHVugaN/+w2jYLb4oelAJK5xzkzA+1IaHpzLg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "19.1.3", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.3.tgz", + "integrity": "sha512-omX5Gyt3zlJVTUteO2YxsqYWtAIpkvs8kRYSUsLTi79V1gbGo+J1TawFuyBTrWxj4UtTGvwmDgZxiCIwMtP5KQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "19.1.3" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.3.tgz", + "integrity": "sha512-nDBvZenQECcr9CClmTp3iJNilRQ6oDKFgBkhlWffEFBx0Z6kBA36MXKKLuCkf31D+NGmt5VJlAkl8Ax8BJ9qJw==", + "dev": true, + "dependencies": { + "@babel/core": "7.26.0", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^4.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "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/index.js" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/compiler": "19.1.3", + "typescript": ">=5.5 <5.8" + } + }, + "node_modules/@angular/core": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.3.tgz", + "integrity": "sha512-Hh1eHvi+y+gsTRODiEEEWnRj5zqv9WNoou1KmQ1mv1NTOf0Pv61Hg9P2rBWDr0mPIXFSzqUKjyzW30BgdQ+AEA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0" + } + }, + "node_modules/@angular/forms": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.3.tgz", + "integrity": "sha512-M6eEJBysJm9zSUhm8ggljZCsgHLccZl70P34tyddb8erh9it2uoOXW0aVaZgDt1UAiF5a1EzjdVdN4TZTT/OGA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/language-service": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-19.1.3.tgz", + "integrity": "sha512-6A1Y2j7Qz85GzxKy0C+JFIQaUNoURNR3L6FNvJIfI73ADl74NBy+M+MzZTBlhlfyB3TEGyExZmuV6wHtB/hU+w==", + "dev": true, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.3.tgz", + "integrity": "sha512-bLgnM2hRyzUdoWRoUhe+IMenlr74EvrgwyG7anJ27bjg5PcvhQPXrGqU0hri5yPDb9SHVJZminr7OjNCN8QJkQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/animations": "19.1.3", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.1.3.tgz", + "integrity": "sha512-rfsHu/+wB8YLPjsHKd/Go0SI8zP2gjMkebUHM9SbvVLXEAkxFubcF2htVKbKu8eTncfEJEXD6+3gRAjh5SLrKw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "19.1.3", + "@angular/compiler": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3" + } + }, + "node_modules/@angular/router": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.3.tgz", + "integrity": "sha512-DJ9BgvtxJV6xohaPQXPdBsFCZoQIEq2OPDyKcoW4L0ST4kIIFpHyI6wJ+AlPnLkhSwmOOoHciH0oxZ2xPVxmiQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "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/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "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/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "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/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.26.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", + "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-decorators": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "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-decorators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", + "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "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.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", + "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "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", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.5.tgz", + "integrity": "sha512-GJhPO0y8SD5EYVCy2Zr+9dSZcEgaSmq5BLR0Oc25TOEhC+ba49vUAGZFjy8v79z9E1mdldq4x9d1xgh4L1d5dQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@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-typescript": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", + "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.5", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@commitlint/cli": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-18.6.1.tgz", + "integrity": "sha512-5IDE0a+lWGdkOvKH892HHAZgbAjcj1mT5QrfA/SVbLJV/BbBMGyKN0W5mhgjekPJJwEQdVNvhl9PwUacY58Usw==", + "dev": true, + "dependencies": { + "@commitlint/format": "^18.6.1", + "@commitlint/lint": "^18.6.1", + "@commitlint/load": "^18.6.1", + "@commitlint/read": "^18.6.1", + "@commitlint/types": "^18.6.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": ">=v18" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "18.6.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-18.6.3.tgz", + "integrity": "sha512-8ZrRHqF6je+TRaFoJVwszwnOXb/VeYrPmTwPhf0WxpzpGTcYy1p0SPyZ2eRn/sRi/obnWAcobtDAq6+gJQQNhQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^18.6.1", + "conventional-changelog-conventionalcommits": "^7.0.2" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-18.6.1.tgz", + "integrity": "sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^18.6.1", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/ensure": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-18.6.1.tgz", + "integrity": "sha512-BPm6+SspyxQ7ZTsZwXc7TRQL5kh5YWt3euKmEIBZnocMFkJevqs3fbLRb8+8I/cfbVcAo4mxRlpTPfz8zX7SnQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^18.6.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": ">=v18" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-18.6.1.tgz", + "integrity": "sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-18.6.1.tgz", + "integrity": "sha512-K8mNcfU/JEFCharj2xVjxGSF+My+FbUHoqR+4GqPGrHNqXOGNio47ziiR4HQUPKtiNs05o8/WyLBoIpMVOP7wg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^18.6.1", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-18.6.1.tgz", + "integrity": "sha512-MOfJjkEJj/wOaPBw5jFjTtfnx72RGwqYIROABudOtJKW7isVjFe9j0t8xhceA02QebtYf4P/zea4HIwnXg8rvA==", + "dev": true, + "dependencies": { + "@commitlint/types": "^18.6.1", + "semver": "7.6.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@commitlint/lint": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-18.6.1.tgz", + "integrity": "sha512-8WwIFo3jAuU+h1PkYe5SfnIOzp+TtBHpFr4S8oJWhu44IWKuVx6GOPux3+9H1iHOan/rGBaiacicZkMZuluhfQ==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^18.6.1", + "@commitlint/parse": "^18.6.1", + "@commitlint/rules": "^18.6.1", + "@commitlint/types": "^18.6.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-18.6.1.tgz", + "integrity": "sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^18.6.1", + "@commitlint/execute-rule": "^18.6.1", + "@commitlint/resolve-extends": "^18.6.1", + "@commitlint/types": "^18.6.1", + "chalk": "^4.1.0", + "cosmiconfig": "^8.3.6", + "cosmiconfig-typescript-loader": "^5.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/message": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-18.6.1.tgz", + "integrity": "sha512-VKC10UTMLcpVjMIaHHsY1KwhuTQtdIKPkIdVEwWV+YuzKkzhlI3aNy6oo1eAN6b/D2LTtZkJe2enHmX0corYRw==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/parse": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-18.6.1.tgz", + "integrity": "sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^18.6.1", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-18.6.1.tgz", + "integrity": "sha512-ia6ODaQFzXrVul07ffSgbZGFajpe8xhnDeLIprLeyfz3ivQU1dIoHp7yz0QIorZ6yuf4nlzg4ZUkluDrGN/J/w==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^18.6.1", + "@commitlint/types": "^18.6.1", + "git-raw-commits": "^2.0.11", + "minimist": "^1.2.6" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-18.6.1.tgz", + "integrity": "sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^18.6.1", + "@commitlint/types": "^18.6.1", + "import-fresh": "^3.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/rules": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-18.6.1.tgz", + "integrity": "sha512-kguM6HxZDtz60v/zQYOe0voAtTdGybWXefA1iidjWYmyUUspO1zBPQEmJZ05/plIAqCVyNUTAiRPWIBKLCrGew==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^18.6.1", + "@commitlint/message": "^18.6.1", + "@commitlint/to-lines": "^18.6.1", + "@commitlint/types": "^18.6.1", + "execa": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-18.6.1.tgz", + "integrity": "sha512-Gl+orGBxYSNphx1+83GYeNy5N0dQsHBQ9PJMriaLQDB51UQHCVLBT/HBdOx5VaYksivSf5Os55TLePbRLlW50Q==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-18.6.1.tgz", + "integrity": "sha512-HyiHQZUTf0+r0goTCDs/bbVv/LiiQ7AVtz6KIar+8ZrseB9+YJAIo8HQ2IC2QT1y3N1lbW6OqVEsTHjbT6hGSw==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/types": { + "version": "18.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-18.6.1.tgz", + "integrity": "sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", + "dev": true, + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.1.tgz", + "integrity": "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==", + "dev": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", + "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@endo/env-options": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@endo/env-options/-/env-options-1.1.10.tgz", + "integrity": "sha512-dnb9nAY+g8w7Rcfl+C1m1PMy88O/HnFNYb+d7eSepB+bxilFtiRcaUDHk6Rn/fJZKa0K0JEhgUqv7p/H4x81Kw==" + }, + "node_modules/@endo/immutable-arraybuffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@endo/immutable-arraybuffer/-/immutable-arraybuffer-1.1.1.tgz", + "integrity": "sha512-v57HL0airAsQi278qAxf7UM788EE1U/8D1JoALtWsDjz+bZ2C84NKy9uwVi7G1YmzesbQMB2nrvWRXavL6LftA==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@inquirer/checkbox": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.6.tgz", + "integrity": "sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==", + "dev": true, + "dependencies": { + "@inquirer/core": "^10.1.4", + "@inquirer/figures": "^1.0.9", + "@inquirer/type": "^3.0.2", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz", + "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", + "dev": true, + "dependencies": { + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.4.tgz", + "integrity": "sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.9", + "@inquirer/type": "^3.0.2", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.3.tgz", + "integrity": "sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg==", + "dev": true, + "dependencies": { + "@inquirer/core": "^10.1.4", + "@inquirer/type": "^3.0.2", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.6.tgz", + "integrity": "sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg==", + "dev": true, + "dependencies": { + "@inquirer/core": "^10.1.4", + "@inquirer/type": "^3.0.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", + "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.3.tgz", + "integrity": "sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ==", + "dev": true, + "dependencies": { + "@inquirer/core": "^10.1.4", + "@inquirer/type": "^3.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.6.tgz", + "integrity": "sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg==", + "dev": true, + "dependencies": { + "@inquirer/core": "^10.1.4", + "@inquirer/type": "^3.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.6.tgz", + "integrity": "sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w==", + "dev": true, + "dependencies": { + "@inquirer/core": "^10.1.4", + "@inquirer/type": "^3.0.2", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", + "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "dev": true, + "dependencies": { + "@inquirer/checkbox": "^4.0.2", + "@inquirer/confirm": "^5.0.2", + "@inquirer/editor": "^4.1.0", + "@inquirer/expand": "^4.0.2", + "@inquirer/input": "^4.0.2", + "@inquirer/number": "^3.0.2", + "@inquirer/password": "^4.0.2", + "@inquirer/rawlist": "^4.0.2", + "@inquirer/search": "^3.0.2", + "@inquirer/select": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.6.tgz", + "integrity": "sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg==", + "dev": true, + "dependencies": { + "@inquirer/core": "^10.1.4", + "@inquirer/type": "^3.0.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/search": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.6.tgz", + "integrity": "sha512-eFZ2hiAq0bZcFPuFFBmZEtXU1EarHLigE+ENCtpO+37NHCl4+Yokq1P/d09kUblObaikwfo97w+0FtG/EXl5Ng==", + "dev": true, + "dependencies": { + "@inquirer/core": "^10.1.4", + "@inquirer/figures": "^1.0.9", + "@inquirer/type": "^3.0.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.6.tgz", + "integrity": "sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ==", + "dev": true, + "dependencies": { + "@inquirer/core": "^10.1.4", + "@inquirer/figures": "^1.0.9", + "@inquirer/type": "^3.0.2", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", + "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", + "dev": true, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "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.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "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/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "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/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "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/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "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/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.1.tgz", + "integrity": "sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==", + "dev": true, + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", + "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz", + "integrity": "sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==", + "dev": true, + "dependencies": { + "@inquirer/type": "^1.5.5" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 8" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "dev": true, + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz", + "integrity": "sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz", + "integrity": "sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz", + "integrity": "sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz", + "integrity": "sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz", + "integrity": "sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz", + "integrity": "sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.49.1", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.49.1.tgz", + "integrity": "sha512-jRTR/XbQF2kb+dYn8hfYSicOGA99+Fo00GrsdMwdfE3eIgLtKdH6Qa2M3wZV9S2XmbgCaGX1OdPtYctbfu5jQg==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor-model": "7.30.2", + "@microsoft/tsdoc": "~0.15.1", + "@microsoft/tsdoc-config": "~0.17.1", + "@rushstack/node-core-library": "5.10.2", + "@rushstack/rig-package": "0.5.3", + "@rushstack/terminal": "0.14.5", + "@rushstack/ts-command-line": "4.23.3", + "lodash": "~4.17.15", + "minimatch": "~3.0.3", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "5.7.2" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.30.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.2.tgz", + "integrity": "sha512-3/t2F+WhkJgBzSNwlkTIL0tBgUoBqDqL66pT+nh2mPbM0NIDGVGtpqbGWPgHIzn/mn7kGS/Ep8D8po58e8UUIw==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "~0.15.1", + "@microsoft/tsdoc-config": "~0.17.1", + "@rushstack/node-core-library": "5.10.2" + } + }, + "node_modules/@microsoft/api-extractor-model/node_modules/@rushstack/node-core-library": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.10.2.tgz", + "integrity": "sha512-xOF/2gVJZTfjTxbo4BDj9RtQq/HFnrrKdtem4JkyRLnwsRz2UDTg8gA1/et10fBx5RxmZD9bYVGST69W8ME5OQ==", + "dev": true, + "dependencies": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@microsoft/api-extractor-model/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@microsoft/api-extractor-model/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@microsoft/api-extractor-model/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@microsoft/api-extractor-model/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor-model/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor-model/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@microsoft/api-extractor-model/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@microsoft/api-extractor/node_modules/@rushstack/node-core-library": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.10.2.tgz", + "integrity": "sha512-xOF/2gVJZTfjTxbo4BDj9RtQq/HFnrrKdtem4JkyRLnwsRz2UDTg8gA1/et10fBx5RxmZD9bYVGST69W8ME5OQ==", + "dev": true, + "dependencies": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@microsoft/api-extractor/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", + "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", + "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.15.1", + "ajv": "~8.12.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "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/@module-federation/bridge-react-webpack-plugin": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.8.9.tgz", + "integrity": "sha512-gM5fnWvFfTEfh5UjSmNod1H/np/pUUjvJnnN31ucKcZ21mL6wJo0A+Vfj8a5gv34S+1n5lWR1b6eVv9CofwgDQ==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.8.9", + "@types/semver": "7.5.8", + "semver": "7.6.3" + } + }, + "node_modules/@module-federation/data-prefetch": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.8.9.tgz", + "integrity": "sha512-doUzJ5uuLPrN5e/NMvKuyUE/lqiZFgGzFITwBF90/KKqOq7R2ZWh43R4RJgkUYfs/F119AYXZ9jxrSphIh+cjg==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.8.9", + "@module-federation/sdk": "0.8.9", + "fs-extra": "9.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@module-federation/data-prefetch/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "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/@module-federation/dts-plugin": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.8.9.tgz", + "integrity": "sha512-Q40yqdQvTV8QRoegjUquTejhLl2gZoPv623hc8MWmGuP2vXLBIJJ9iV849LkFLeE8xaUgtwmn2uCQeBh2aJNjg==", + "dev": true, + "dependencies": { + "@module-federation/error-codes": "0.8.9", + "@module-federation/managers": "0.8.9", + "@module-federation/sdk": "0.8.9", + "@module-federation/third-party-dts-extractor": "0.8.9", + "adm-zip": "^0.5.10", + "ansi-colors": "^4.1.3", + "axios": "^1.7.4", + "chalk": "3.0.0", + "fs-extra": "9.1.0", + "isomorphic-ws": "5.0.0", + "koa": "2.15.3", + "lodash.clonedeepwith": "4.5.0", + "log4js": "6.9.1", + "node-schedule": "2.1.1", + "rambda": "^9.1.0", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/dts-plugin/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/dts-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "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/@module-federation/enhanced": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.8.9.tgz", + "integrity": "sha512-feZUhznCyFkyivWNSFPN+FHMZmyrxlKBhWW8ldWsp/LlKIzWI75vMLimpiydBWnWTZgnOhQDBZGZVxSlfnfKHQ==", + "dev": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.8.9", + "@module-federation/data-prefetch": "0.8.9", + "@module-federation/dts-plugin": "0.8.9", + "@module-federation/error-codes": "0.8.9", + "@module-federation/inject-external-runtime-core-plugin": "0.8.9", + "@module-federation/managers": "0.8.9", + "@module-federation/manifest": "0.8.9", + "@module-federation/rspack": "0.8.9", + "@module-federation/runtime-tools": "0.8.9", + "@module-federation/sdk": "0.8.9", + "btoa": "^1.2.1", + "upath": "2.0.1" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@module-federation/error-codes": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.8.9.tgz", + "integrity": "sha512-yUA3GZjOy8Ll6l193faXir2veexDaUiLdmptbzC9tIee/iSQiSwIlibdTafCfqaJ62cLZaytOUdmAFAKLv8QQw==", + "dev": true + }, + "node_modules/@module-federation/inject-external-runtime-core-plugin": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.8.9.tgz", + "integrity": "sha512-F3s/3Iny20c0Y0CaXgOZdgl7PzgXj6ftCiT5FO6QWmyhzfl2R0o3KFuv54BmwtoimSFky1ShuC/jPluz4EGG1g==", + "dev": true, + "peerDependencies": { + "@module-federation/runtime-tools": "0.8.9" + } + }, + "node_modules/@module-federation/managers": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.8.9.tgz", + "integrity": "sha512-Fb28sa2iAqwSSSgiPBoL5Kp0RB9ZKJvdwLAEwZBV2c2LyZUqJCdTjmYuB5Q2sWB9wsudd/ijV6WWNK/nVoJxdA==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.8.9", + "find-pkg": "2.0.0", + "fs-extra": "9.1.0" + } + }, + "node_modules/@module-federation/managers/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "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/@module-federation/manifest": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.8.9.tgz", + "integrity": "sha512-48jIv50l0tTx+CVzs2JKMlTO0mcUvFRDxqO79nJaL1DLfpRQoCRQjCA8sXUp5PPIyJ8MHQqkHK/dnaal4NlR/A==", + "dev": true, + "dependencies": { + "@module-federation/dts-plugin": "0.8.9", + "@module-federation/managers": "0.8.9", + "@module-federation/sdk": "0.8.9", + "chalk": "3.0.0", + "find-pkg": "2.0.0" + } + }, + "node_modules/@module-federation/manifest/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/node": { + "version": "2.6.22", + "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.6.22.tgz", + "integrity": "sha512-KlBJXakBO0KMCLTv7622aQNQk3JLfUqXJtd28nUt7xJNV9OZclHvRmKS83zHGEV/6hBKuLtYlP/+S4LMoMKiOw==", + "dev": true, + "dependencies": { + "@module-federation/enhanced": "0.8.9", + "@module-federation/runtime": "0.8.9", + "@module-federation/sdk": "0.8.9", + "@module-federation/utilities": "3.1.40", + "btoa": "1.2.1", + "encoding": "^0.1.13", + "node-fetch": "2.7.0" + }, + "peerDependencies": { + "react": "^16||^17||^18", + "react-dom": "^16||^17||^18", + "webpack": "^5.40.0" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@module-federation/rspack": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.8.9.tgz", + "integrity": "sha512-wuHRx+aUYhsrAQzU5yKQksaOJ8pwhuQJDl8I86xmzkEsnxcWsZcn49xIR4t7v1HcYAqjBXLNXSoQwkIMH9zu2w==", + "dev": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.8.9", + "@module-federation/dts-plugin": "0.8.9", + "@module-federation/inject-external-runtime-core-plugin": "0.8.9", + "@module-federation/managers": "0.8.9", + "@module-federation/manifest": "0.8.9", + "@module-federation/runtime-tools": "0.8.9", + "@module-federation/sdk": "0.8.9" + }, + "peerDependencies": { + "@rspack/core": ">=0.7", + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/runtime": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.8.9.tgz", + "integrity": "sha512-i+a+/hoT/c+EE52mT+gJrbA6DhL86PY9cd/dIv/oKpLz9i+yYBlG+RA+puc7YsUEO4irbFLvnIMq6AGDUKVzYA==", + "dev": true, + "dependencies": { + "@module-federation/error-codes": "0.8.9", + "@module-federation/runtime-core": "0.6.17", + "@module-federation/sdk": "0.8.9" + } + }, + "node_modules/@module-federation/runtime-core": { + "version": "0.6.17", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.6.17.tgz", + "integrity": "sha512-PXFN/TT9f64Un6NQYqH1Z0QLhpytW15jkZvTEOV8W7Ed319BECFI0Rv4xAsAGa8zJGFoaM/c7QOQfdFXtKj5Og==", + "dev": true, + "dependencies": { + "@module-federation/error-codes": "0.8.9", + "@module-federation/sdk": "0.8.9" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.8.9.tgz", + "integrity": "sha512-xBUGx1oOZNuxXjPGdTMrLtAIDrbrN6jE2Mgb9w1qr2mQ4AW9b5TOlxbARBoX4q98xt9oFCGU6Q0eW5XJpsl8AQ==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.8.9", + "@module-federation/webpack-bundler-runtime": "0.8.9" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.8.9.tgz", + "integrity": "sha512-QJ60itWC/SPjqduT7wDiF8UGwVU/yJ/Sz+QbnoxB9b7gNLzvI//swAXTo9eOtKsCy/V2BMwjt0F3eOcfnaqllA==", + "dev": true, + "dependencies": { + "isomorphic-rslog": "0.0.7" + } + }, + "node_modules/@module-federation/third-party-dts-extractor": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.8.9.tgz", + "integrity": "sha512-53v6B5zfhGlAPpH0SrlJDp9B6kcOcZaUPi6J4L/7ie5F0YVe0vq/mJGOOzAStN9ggJjSrjBZLFT3gFmBYM3Z9A==", + "dev": true, + "dependencies": { + "find-pkg": "2.0.0", + "fs-extra": "9.1.0", + "resolve": "1.22.8" + } + }, + "node_modules/@module-federation/third-party-dts-extractor/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "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/@module-federation/third-party-dts-extractor/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "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/@module-federation/utilities": { + "version": "3.1.40", + "resolved": "https://registry.npmjs.org/@module-federation/utilities/-/utilities-3.1.40.tgz", + "integrity": "sha512-/Oa0jtNCEEfQhXIV0/H/pm+PEfYy4QUfCIcgTr5TJ1QB3OR1D+tBYRFGYYJaTeMRzS4PI4Rh1vv/egzQ9pbgSg==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.8.9" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18", + "webpack": "^5.40.0" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.8.9.tgz", + "integrity": "sha512-DYLvVi4b2MUYu/B4g5wIC5SHxiODboKHkYGHYapOhCcqOchca/N16gtiAI8eSNjJPc+fgUXUGIyGiB18IlFEeQ==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.8.9", + "@module-federation/sdk": "0.8.9" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/nice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", + "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.0.1", + "@napi-rs/nice-android-arm64": "1.0.1", + "@napi-rs/nice-darwin-arm64": "1.0.1", + "@napi-rs/nice-darwin-x64": "1.0.1", + "@napi-rs/nice-freebsd-x64": "1.0.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", + "@napi-rs/nice-linux-arm64-gnu": "1.0.1", + "@napi-rs/nice-linux-arm64-musl": "1.0.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", + "@napi-rs/nice-linux-s390x-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-musl": "1.0.1", + "@napi-rs/nice-win32-arm64-msvc": "1.0.1", + "@napi-rs/nice-win32-ia32-msvc": "1.0.1", + "@napi-rs/nice-win32-x64-msvc": "1.0.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", + "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", + "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", + "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz", + "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz", + "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz", + "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz", + "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz", + "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz", + "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz", + "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz", + "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz", + "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz", + "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz", + "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", + "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", + "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "dev": true, + "dependencies": { + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@ngtools/webpack": { + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.1.4.tgz", + "integrity": "sha512-ZmUlbVqu/pz8abxVxNCKgKeY5g2MX1NsKxhM8rRV5tVV/MaAtSYNHgmFSYcKWA178v7k6BUuhnoNNxl5qqc1kw==", + "dev": true, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^19.0.0", + "typescript": ">=5.5 <5.8", + "webpack": "^5.54.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.1.tgz", + "integrity": "sha512-BBWMMxeQzalmKadyimwb2/VVQyJB01PH0HhVSNLHNBDZN/M/h/02P6f8fxedIiFhpMj11SO9Ep5tKTBE7zL2nw==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", + "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", + "dev": true, + "dependencies": { + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", + "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.1.tgz", + "integrity": "sha512-d5qimadRAUCO4A/Txw71VM7UrRZzV+NPclxz/dc+M6B2oYwjWTjqh8HA/sGQgs9VZuJ6I/P7XIAlJvgrl27ZOw==", + "dev": true, + "dependencies": { + "@npmcli/git": "^6.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz", + "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==", + "dev": true, + "dependencies": { + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz", + "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.0.2.tgz", + "integrity": "sha512-cJXiUlycdizQwvqE1iaAb4VRUM3RX09/8q46zjvy+ct9GhfZRWd7jXYVc1tn/CfRlGPVkX/u4sstRlepsm7hfw==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^11.0.0", + "proc-log": "^5.0.0", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@nx/angular": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-20.3.2.tgz", + "integrity": "sha512-8waa4ZSu94us116+7e/qnRBzF8FcwXx91NLbWCz2YBidfuJ54hbs/nPABfJv6zcoWVNW2/j+kD1AZK5fXlObRA==", + "dev": true, + "dependencies": { + "@nx/devkit": "20.3.2", + "@nx/eslint": "20.3.2", + "@nx/js": "20.3.2", + "@nx/module-federation": "20.3.2", + "@nx/web": "20.3.2", + "@nx/webpack": "20.3.2", + "@nx/workspace": "20.3.2", + "@phenomnomnominal/tsquery": "~5.0.1", + "@typescript-eslint/type-utils": "^8.0.0", + "magic-string": "~0.30.2", + "minimatch": "9.0.3", + "picocolors": "^1.1.0", + "piscina": "^4.4.0", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "webpack-merge": "^5.8.0" + }, + "peerDependencies": { + "@angular-devkit/build-angular": ">= 17.0.0 < 20.0.0", + "@angular-devkit/core": ">= 17.0.0 < 20.0.0", + "@angular-devkit/schematics": ">= 17.0.0 < 20.0.0", + "@schematics/angular": ">= 17.0.0 < 20.0.0", + "rxjs": "^6.5.3 || ^7.5.0" + } + }, + "node_modules/@nx/angular/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@nx/angular/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/angular/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@nx/devkit": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.3.2.tgz", + "integrity": "sha512-VhbxEsSTCZlOVgjuQC+6HQmb9Oz9VoHUeo4001Pw6BFBcSXZUi5q37C/lxbAgQPnMKLkFcLva3WKZ+fOLwhGIg==", + "dev": true, + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 19 <= 21" + } + }, + "node_modules/@nx/devkit/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@nx/devkit/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/esbuild": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/esbuild/-/esbuild-20.3.2.tgz", + "integrity": "sha512-MOiDyLh4GcWjae0nIrFSTJg7djc/BjxvF1jv06GyT3JznhvXGa6ht5/BRy3aoBbznux4oH7aAwtbGqtRrrFLyg==", + "dev": true, + "dependencies": { + "@nx/devkit": "20.3.2", + "@nx/js": "20.3.2", + "picocolors": "^1.1.0", + "tinyglobby": "^0.2.10", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "esbuild": "~0.19.2" + }, + "peerDependenciesMeta": { + "esbuild": { + "optional": true + } + } + }, + "node_modules/@nx/eslint": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-20.3.2.tgz", + "integrity": "sha512-vWvMmJ4aU/CjqomTVLuMlmhxKj/Q2wlhu9tQhZlDexDGfGF4QMidrbb25Rqog9NSeeI5hhBp57TQjfDyEF8HhQ==", + "dev": true, + "dependencies": { + "@nx/devkit": "20.3.2", + "@nx/js": "20.3.2", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "typescript": "~5.6.2" + }, + "peerDependencies": { + "@zkochan/js-yaml": "0.0.7", + "eslint": "^8.0.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "@zkochan/js-yaml": { + "optional": true + } + } + }, + "node_modules/@nx/eslint-plugin": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-20.3.2.tgz", + "integrity": "sha512-m3gWjOY9Cn4lujMZITfxuD+T7iPf0MOqfiTU8gnlybGpqxOL2F6roHtVRX3aas2cKtSTY/Kk+fIalIJVSxfSoQ==", + "dev": true, + "dependencies": { + "@nx/devkit": "20.3.2", + "@nx/js": "20.3.2", + "@typescript-eslint/type-utils": "^8.0.0", + "@typescript-eslint/utils": "^8.0.0", + "chalk": "^4.1.0", + "confusing-browser-globals": "^1.0.9", + "globals": "^15.9.0", + "jsonc-eslint-parser": "^2.1.0", + "semver": "^7.5.3", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.13.2 || ^7.0.0 || ^8.0.0", + "eslint-config-prettier": "^9.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", + "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", + "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", + "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.21.0", + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/typescript-estree": "8.21.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", + "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/ts-api-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", + "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", + "dev": true, + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/@nx/jest": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-20.3.2.tgz", + "integrity": "sha512-YW+KVoQEZi1Otm1wBAu0Bf3uq1Kp7ighPW73e8bL0SQPTdp6Afdn/52HZfrOGvBjdHLrZ50N817IJLUpApJ82g==", + "dev": true, + "dependencies": { + "@jest/reporters": "^29.4.1", + "@jest/test-result": "^29.4.1", + "@nx/devkit": "20.3.2", + "@nx/js": "20.3.2", + "@phenomnomnominal/tsquery": "~5.0.1", + "identity-obj-proxy": "3.0.0", + "jest-config": "^29.4.1", + "jest-resolve": "^29.4.1", + "jest-util": "^29.4.1", + "minimatch": "9.0.3", + "picocolors": "^1.1.0", + "resolve.exports": "2.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/jest/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@nx/jest/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/js": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.3.2.tgz", + "integrity": "sha512-t2mLCogVc/DWpkJ1SW4pFgeyWAmuy7EI4IPyShtF4s9mhqyIDfd29fGYsocuv84skX6y4JMOw3O+c+LXdQ9QWw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "20.3.2", + "@nx/workspace": "20.3.2", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^2.8.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "minimatch": "9.0.3", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.10", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^5.0.4" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/js/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@nx/js/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/js/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@nx/js/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/@nx/js/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/@nx/js/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/js/node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@nx/js/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/js/node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nx/js/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/js/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/@nx/js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/js/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/js/node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nx/module-federation": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-20.3.2.tgz", + "integrity": "sha512-i7Ze1Sjk68eE5qgsvMPXZlJuLHvwp3s/nWlDmJzcEdbiq2szRGgZ/NOLrZJYvSTkIe0YosCQ0PtY6wfGXwWjbQ==", + "dev": true, + "dependencies": { + "@module-federation/enhanced": "^0.8.8", + "@module-federation/node": "^2.6.21", + "@module-federation/sdk": "^0.8.8", + "@nx/devkit": "20.3.2", + "@nx/js": "20.3.2", + "@nx/web": "20.3.2", + "@rspack/core": "^1.1.5", + "express": "^4.19.2", + "http-proxy-middleware": "^3.0.3", + "picocolors": "^1.1.0", + "tslib": "^2.3.0", + "webpack": "5.88.0" + } + }, + "node_modules/@nx/module-federation/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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/@nx/module-federation/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/@nx/module-federation/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nx/module-federation/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@nx/module-federation/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/@nx/module-federation/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@nx/module-federation/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "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/@nx/module-federation/node_modules/webpack": { + "version": "5.88.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.0.tgz", + "integrity": "sha512-O3jDhG5e44qIBSi/P6KpcCcH7HD+nYIHVBhdWFxcLOcIGN8zGo5nqF3BjyNCxIh4p1vFdNnreZv2h2KkoAw3lw==", + "dev": true, + "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/@nx/node": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/node/-/node-20.3.2.tgz", + "integrity": "sha512-JvYXPjoPho+RJKXgg2b0/hQ2SivccfGG+vkoQ4XcwBLW7qUjKUjxmkgSHD4XaAgf9Fe9L9Pqni58CriwzNfaFg==", + "dev": true, + "dependencies": { + "@nx/devkit": "20.3.2", + "@nx/eslint": "20.3.2", + "@nx/jest": "20.3.2", + "@nx/js": "20.3.2", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.3.2.tgz", + "integrity": "sha512-lQOXMIPmE9o36TuZ+SX6iq7PPWa3s1fjNRqCujlviExX69245NNCMxd754gXlLrsxC1onrx/zmJciKmmEWDIiw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.3.2.tgz", + "integrity": "sha512-RvvSz4QYVOYOfC8sUE63b6dy8iHk2AEI0r1FF5FCQuqE1DdTeTjPETY2sY35tRqF+mO/6oLGp2+m9ti/ysRoTg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.3.2.tgz", + "integrity": "sha512-KBDTyGn1evlZ17pupwRUDh2wrCMuHhP2j8cOCdgF5cl7vRki8BOK9yyL6jD11d/d/6DgXzy1jmQEX4Xx+AGCug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.3.2.tgz", + "integrity": "sha512-mW+OcOnJEMvs7zD3aSwEG3z5M9bI4CuUU5Q/ePmnNzWIucRHpoAMNt/Sd+yu6L4+QttvoUf967uwcMsX8l4nrw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.3.2.tgz", + "integrity": "sha512-hbXpZqUvGY5aeEWvh0SNsiYjP1ytSM30XOT6qN6faLO2CL/7j9D2UB69SKOqF3TJOvuNU6cweFgZCxyGfXBYIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.3.2.tgz", + "integrity": "sha512-HXthtN7adXCNVWs2F4wIqq2f7BcKTjsEnqg2LWV5lm4hRYvMfEvPftb0tECsEhcSQQYcvIJnLfv3vtu9HZSfVA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.3.2.tgz", + "integrity": "sha512-HhgHqOUT05H45zuQL+XPywQbRNFttd7Rkkr7dZnpCRdp4W8GDjfyKCoCS5qVyowAyNh9Vc7VEq9qmiLMlvf6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.3.2.tgz", + "integrity": "sha512-NrZ8L9of2GmYEM8GMJX6QRrLJlAwM+ds2rhdY1bxwpiyCNcD3IO/gzJlBs+kG4ly05F1u/X4k/FI5dXPpjUSgw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.3.2.tgz", + "integrity": "sha512-yLjacZND7C1XmsC0jfRLSgeLWZUw2Oz+u3nXNvj5JX6YHtYTVLFnRbTAcI+pG2Y6v0Otf2GKb3VT5d1mQb8JvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.3.2.tgz", + "integrity": "sha512-oDhcctfk0UB1V+Otp1161VKNMobzkFQxGyiEIjp0CjCBa2eRHC1r35L695F1Hj0bvLQPSni9XIe9evh2taeAkg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/vite": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/vite/-/vite-20.3.2.tgz", + "integrity": "sha512-6e/D5Alk3nppTmxsaEIWQ+jeasbSLZx6PPzeymWyzlW8KvXcC/uVYd4Fla7uHN1TkUC8x4wf/bXonZl9ugyNZg==", + "dev": true, + "dependencies": { + "@nx/devkit": "20.3.2", + "@nx/js": "20.3.2", + "@phenomnomnominal/tsquery": "~5.0.1", + "@swc/helpers": "~0.5.0", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "tsconfig-paths": "^4.1.2" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vitest": "^1.3.1 || ^2.0.0" + } + }, + "node_modules/@nx/vite/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@nx/vite/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/web": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/web/-/web-20.3.2.tgz", + "integrity": "sha512-Kw8is78c3zo4M2bPCVgF2XJev3oCPyl9wyTuexzc5y3praF/r0Dc1jlGiHqwdeGBKpNNDaZns4WZe5KUaIc/Qg==", + "dev": true, + "dependencies": { + "@nx/devkit": "20.3.2", + "@nx/js": "20.3.2", + "detect-port": "^1.5.1", + "http-server": "^14.1.0", + "picocolors": "^1.1.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/webpack": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-20.3.2.tgz", + "integrity": "sha512-/3N4cRCbwHSZsJDHukV0QrIBZxFJpGjZFEPLswkAn8B+9AQVkp8ZieZYgu08XixXVj/9oTK4sbOh143/eu+93g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@nx/devkit": "20.3.2", + "@nx/js": "20.3.2", + "@phenomnomnominal/tsquery": "~5.0.1", + "ajv": "^8.12.0", + "autoprefixer": "^10.4.9", + "babel-loader": "^9.1.2", + "browserslist": "^4.21.4", + "copy-webpack-plugin": "^10.2.4", + "css-loader": "^6.4.0", + "css-minimizer-webpack-plugin": "^5.0.0", + "fork-ts-checker-webpack-plugin": "7.2.13", + "less": "4.1.3", + "less-loader": "11.1.0", + "license-webpack-plugin": "^4.0.2", + "loader-utils": "^2.0.3", + "mini-css-extract-plugin": "~2.4.7", + "parse5": "4.0.0", + "picocolors": "^1.1.0", + "postcss": "^8.4.38", + "postcss-import": "~14.1.0", + "postcss-loader": "^6.1.1", + "rxjs": "^7.8.0", + "sass": "^1.42.1", + "sass-loader": "^12.2.0", + "source-map-loader": "^5.0.0", + "style-loader": "^3.3.0", + "stylus": "^0.64.0", + "stylus-loader": "^7.1.0", + "terser-webpack-plugin": "^5.3.3", + "ts-loader": "^9.3.1", + "tsconfig-paths-webpack-plugin": "4.0.0", + "tslib": "^2.3.0", + "webpack": "^5.80.0", + "webpack-dev-server": "^5.0.4", + "webpack-node-externals": "^3.0.0", + "webpack-subresource-integrity": "^5.1.0" + } + }, + "node_modules/@nx/webpack/node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/webpack/node_modules/copy-webpack-plugin": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", + "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.20.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/@nx/webpack/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "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/@nx/webpack/node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.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": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@nx/webpack/node_modules/globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "dev": true, + "dependencies": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "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/@nx/webpack/node_modules/less": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "dev": true, + "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/@nx/webpack/node_modules/less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dev": true, + "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/@nx/webpack/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@nx/webpack/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nx/webpack/node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@nx/webpack/node_modules/mini-css-extract-plugin": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.7.tgz", + "integrity": "sha512-euWmddf0sk9Nv1O0gfeeUAvAkoSlWncNLF77C0TP2+WoPvy8mAHKOzMajcCz2dzvyt3CNgxb1obIEVFIRxaipg==", + "dev": true, + "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/@nx/webpack/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nx/webpack/node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/@nx/webpack/node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.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", + "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/@nx/webpack/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/webpack/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@nx/workspace": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.3.2.tgz", + "integrity": "sha512-Dj2AbG9X8Uo6k3XhcuNOblDgR/U8u5+x41hMNKHSG9Pi3CyAJ24didtn1SMf78GElzPOV94KJZmioGHw3rKyCg==", + "dev": true, + "dependencies": { + "@nx/devkit": "20.3.2", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "20.3.2", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true + }, + "node_modules/@phenomnomnominal/tsquery": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz", + "integrity": "sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==", + "dev": true, + "dependencies": { + "esquery": "^1.4.0" + }, + "peerDependencies": { + "typescript": "^3 || ^4 || ^5" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "dev": true + }, + "node_modules/@puppeteer/browsers": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.3.0.tgz", + "integrity": "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==", + "dependencies": { + "debug": "^4.3.5", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "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/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.2.1.tgz", + "integrity": "sha512-6PLqTfNtgkxZPYtEcvchNQtxMY+DDcgWoikymtMgP+hGEOrdHwQmhSVIoSJr8Gp9do9RVwtlMLj0mIEVS2qdig==", + "dev": true, + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.2.1", + "@rspack/binding-darwin-x64": "1.2.1", + "@rspack/binding-linux-arm64-gnu": "1.2.1", + "@rspack/binding-linux-arm64-musl": "1.2.1", + "@rspack/binding-linux-x64-gnu": "1.2.1", + "@rspack/binding-linux-x64-musl": "1.2.1", + "@rspack/binding-win32-arm64-msvc": "1.2.1", + "@rspack/binding-win32-ia32-msvc": "1.2.1", + "@rspack/binding-win32-x64-msvc": "1.2.1" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.2.1.tgz", + "integrity": "sha512-g6mN0WKj7umb3luY0TwEoMn3833kXjwpBW5FMec7XDMk85qJlbgO0gqnSnFpb9rhe9oIZPy3/Ki6l0qZgUKUGA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.2.1.tgz", + "integrity": "sha512-3SqUF0C2UCBYLyLxe5dNMPdgjhWPg7a2tfaCDSX+gHHew1Kdte8u4fTsOulo32tFtn7fDJoz3wUkNpi1ckQBrA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.1.tgz", + "integrity": "sha512-ssiFFC6VEDjHdS7fcs+5PvpiZ03553Zb9ScfPrMnIiBA1RpAFsuVUyur1Nn1KGvUoQDY6TuS13ELTHBTVRkgyA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.1.tgz", + "integrity": "sha512-6SIgzEL1T0xy27awIrt0vuwS+oYZPt6s6MzlR9h2arZ2TcOkyLvXivlaBXZoOhwQQOyEbR/+UIrUFTZtsJlTjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.1.tgz", + "integrity": "sha512-NZClRGYkIAQDaPHg6dCQBI/oXSZHy+jBoD0xESF+venC8QA26ilRw/JUoalpwBTSPMoQQgUxET70OG5NYXMGKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.1.tgz", + "integrity": "sha512-nWmjEXdaNi6CJ+OwPJA0ld2vh/p3Qbqt/wPXjOXP8KsLR1FZxC32itsg4mnDmdkTBap6HZq326ShZxnYOk9BFA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.1.tgz", + "integrity": "sha512-EdfZFXbJkVpAf4BCE1tINSD4KI1AG/IEyvtJrYzVh7VsfGqqi+5f+/mnv+rThgcEjrCPkhuOoAjq3GYxyTK4kg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.2.1.tgz", + "integrity": "sha512-TvuwF9oRLcfbMHZ72zyqgkq8mes/pp9ROlBbSFG69Nr9EjA8yxghJ7rL5LwJvmt1k7MTVHlwhouSsgItQ/f0Yw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.1.tgz", + "integrity": "sha512-BBndKxUO7iJ7Q1PXtcfrWTupbaTO2bNFRK/r2JgVUEwFGPg7RPTr/Az+SoenTcvoDVn2gtF4+VPYIqKTX+Kabw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.2.1.tgz", + "integrity": "sha512-C2Tb854ykisje6UEAQTmJLRdhZzupuGgkgC4pohaHTlvqmFsq425mPKy9KOYAm7WJwufhUJgshgPJjlaTrRe0Q==", + "dev": true, + "dependencies": { + "@module-federation/runtime-tools": "0.8.4", + "@rspack/binding": "1.2.1", + "@rspack/lite-tapable": "1.0.1", + "caniuse-lite": "^1.0.30001616" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@rspack/tracing": "^1.x", + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@rspack/tracing": { + "optional": true + }, + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/core/node_modules/@module-federation/error-codes": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.8.4.tgz", + "integrity": "sha512-55LYmrDdKb4jt+qr8qE8U3al62ZANp3FhfVaNPOaAmdTh0jHdD8M3yf5HKFlr5xVkVO4eV/F/J2NCfpbh+pEXQ==", + "dev": true + }, + "node_modules/@rspack/core/node_modules/@module-federation/runtime": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.8.4.tgz", + "integrity": "sha512-yZeZ7z2Rx4gv/0E97oLTF3V6N25vglmwXGgoeju/W2YjsFvWzVtCDI7zRRb0mJhU6+jmSM8jP1DeQGbea/AiZQ==", + "dev": true, + "dependencies": { + "@module-federation/error-codes": "0.8.4", + "@module-federation/sdk": "0.8.4" + } + }, + "node_modules/@rspack/core/node_modules/@module-federation/runtime-tools": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.8.4.tgz", + "integrity": "sha512-fjVOsItJ1u5YY6E9FnS56UDwZgqEQUrWFnouRiPtK123LUuqUI9FH4redZoKWlE1PB0ir1Z3tnqy8eFYzPO38Q==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.8.4", + "@module-federation/webpack-bundler-runtime": "0.8.4" + } + }, + "node_modules/@rspack/core/node_modules/@module-federation/sdk": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.8.4.tgz", + "integrity": "sha512-waABomIjg/5m1rPDBWYG4KUhS5r7OUUY7S+avpaVIY/tkPWB3ibRDKy2dNLLAMaLKq0u+B1qIdEp4NIWkqhqpg==", + "dev": true, + "dependencies": { + "isomorphic-rslog": "0.0.6" + } + }, + "node_modules/@rspack/core/node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.8.4.tgz", + "integrity": "sha512-HggROJhvHPUX7uqBD/XlajGygMNM1DG0+4OAkk8MBQe4a18QzrRNzZt6XQbRTSG4OaEoyRWhQHvYD3Yps405tQ==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.8.4", + "@module-federation/sdk": "0.8.4" + } + }, + "node_modules/@rspack/core/node_modules/isomorphic-rslog": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/isomorphic-rslog/-/isomorphic-rslog-0.0.6.tgz", + "integrity": "sha512-HM0q6XqQ93psDlqvuViNs/Ea3hAyGDkIdVAHlrEocjjAwGrs1fZ+EdQjS9eUPacnYB7Y8SoDdSY3H8p3ce205A==", + "dev": true, + "engines": { + "node": ">=14.17.6" + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@rushstack/node-core-library": { + "version": "3.66.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.66.1.tgz", + "integrity": "sha512-ker69cVKAoar7MMtDFZC4CzcDxjwqIhFzqEnYI5NRN/8M3om6saWCVx/A7vL2t/jFCJsnzQplRDqA7c78pytng==", + "dev": true, + "dependencies": { + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "z-schema": "~5.0.2" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@rushstack/rig-package": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.3.tgz", + "integrity": "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==", + "dev": true, + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.14.5.tgz", + "integrity": "sha512-TEOpNwwmsZVrkp0omnuTUTGZRJKTr6n6m4OITiNjkqzLAkcazVpwR1SOtBg6uzpkIBLgrcNHETqI8rbw3uiUfw==", + "dev": true, + "dependencies": { + "@rushstack/node-core-library": "5.10.2", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/terminal/node_modules/@rushstack/node-core-library": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.10.2.tgz", + "integrity": "sha512-xOF/2gVJZTfjTxbo4BDj9RtQq/HFnrrKdtem4JkyRLnwsRz2UDTg8gA1/et10fBx5RxmZD9bYVGST69W8ME5OQ==", + "dev": true, + "dependencies": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/terminal/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@rushstack/terminal/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@rushstack/terminal/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@rushstack/terminal/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/terminal/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/terminal/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@rushstack/terminal/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@rushstack/terminal/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@rushstack/ts-command-line": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.3.tgz", + "integrity": "sha512-HazKL8fv4HMQMzrKJCrOrhyBPPdzk7iajUXgsASwjQ8ROo1cmgyqxt/k9+SdmrNLGE1zATgRqMUH3s/6smbRMA==", + "dev": true, + "dependencies": { + "@rushstack/terminal": "0.14.5", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/@schematics/angular": { + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.7.tgz", + "integrity": "sha512-1WtTqKFPuEaV99VIP+y/gf/XW3TVJh/NbJbbEF4qYpp7qQiJ4ntF4klVZmsJcQzFucZSzlg91QVMPQKev5WZGA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "19.0.7", + "@angular-devkit/schematics": "19.0.7", + "jsonc-parser": "3.3.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.7.tgz", + "integrity": "sha512-VyuORSitT6LIaGUEF0KEnv2TwNaeWl6L3/4L4stok0BJ23B4joVca2DYVcrLC1hSzz8V4dwVgSlbNIgjgGdVpg==", + "dev": true, + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@shikijs/core": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.29.1.tgz", + "integrity": "sha512-Mo1gGGkuOYjDu5H8YwzmOuly9vNr8KDVkqj9xiKhhhFS8jisAtDSEWB9hzqRHLVQgFdA310e8XRJcW4tYhRB2A==", + "dev": true, + "dependencies": { + "@shikijs/engine-javascript": "1.29.1", + "@shikijs/engine-oniguruma": "1.29.1", + "@shikijs/types": "1.29.1", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.29.1.tgz", + "integrity": "sha512-Hpi8k9x77rCQ7F/7zxIOUruNkNidMyBnP5qAGbLFqg4kRrg1HZhkB8btib5EXbQWTtLb5gBHOdBwshk20njD7Q==", + "dev": true, + "dependencies": { + "@shikijs/types": "1.29.1", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "^2.2.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.1.tgz", + "integrity": "sha512-gSt2WhLNgEeLstcweQOSp+C+MhOpTsgdNXRqr3zP6M+BUBZ8Md9OU2BYwUYsALBxHza7hwaIWtFHjQ/aOOychw==", + "dev": true, + "dependencies": { + "@shikijs/types": "1.29.1", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@shikijs/langs": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.29.1.tgz", + "integrity": "sha512-iERn4HlyuT044/FgrvLOaZgKVKf3PozjKjyV/RZ5GnlyYEAZFcgwHGkYboeBv2IybQG1KVS/e7VGgiAU4JY2Gw==", + "dev": true, + "dependencies": { + "@shikijs/types": "1.29.1" + } + }, + "node_modules/@shikijs/themes": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.29.1.tgz", + "integrity": "sha512-lb11zf72Vc9uxkl+aec2oW1HVTHJ2LtgZgumb4Rr6By3y/96VmlU44bkxEb8WBWH3RUtbqAJEN0jljD9cF7H7g==", + "dev": true, + "dependencies": { + "@shikijs/types": "1.29.1" + } + }, + "node_modules/@shikijs/types": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.1.tgz", + "integrity": "sha512-aBqAuhYRp5vSir3Pc9+QPu9WESBOjUo03ao0IHLC4TyTioSsp/SkbAZSrIH4ghYYC1T1KTEpRSBa83bas4RnPA==", + "dev": true, + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz", + "integrity": "sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==", + "dev": true + }, + "node_modules/@sigstore/bundle": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", + "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", + "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", + "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", + "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^3.0.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^14.0.1", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", + "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", + "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^3.0.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@swc-node/core": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@swc-node/core/-/core-1.13.3.tgz", + "integrity": "sha512-OGsvXIid2Go21kiNqeTIn79jcaX4l0G93X2rAnas4LFoDyA9wAwVK7xZdm+QsKoMn5Mus2yFLCc4OtX2dD/PWA==", + "dev": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@swc/core": ">= 1.4.13", + "@swc/types": ">= 0.1" + } + }, + "node_modules/@swc-node/register": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@swc-node/register/-/register-1.9.2.tgz", + "integrity": "sha512-BBjg0QNuEEmJSoU/++JOXhrjWdu3PTyYeJWsvchsI0Aqtj8ICkz/DqlwtXbmZVZ5vuDPpTfFlwDBZe81zgShMA==", + "dev": true, + "dependencies": { + "@swc-node/core": "^1.13.1", + "@swc-node/sourcemap-support": "^0.5.0", + "colorette": "^2.0.20", + "debug": "^4.3.4", + "pirates": "^4.0.6", + "tslib": "^2.6.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@swc/core": ">= 1.4.13", + "typescript": ">= 4.3" + } + }, + "node_modules/@swc-node/sourcemap-support": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc-node/sourcemap-support/-/sourcemap-support-0.5.1.tgz", + "integrity": "sha512-JxIvIo/Hrpv0JCHSyRpetAdQ6lB27oFYhv0PKCNf1g2gUXOjpeR1exrXccRxLMuAV5WAmGFBwRnNOJqN38+qtg==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.21", + "tslib": "^2.6.3" + } + }, + "node_modules/@swc/core": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.7.tgz", + "integrity": "sha512-U4qJRBefIJNJDRCCiVtkfa/hpiZ7w0R6kASea+/KLp+vkus3zcLSB8Ub8SvKgTIxjWpwsKcZlPf5nrv4ls46SQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.2", + "@swc/types": "0.1.7" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.5.7", + "@swc/core-darwin-x64": "1.5.7", + "@swc/core-linux-arm-gnueabihf": "1.5.7", + "@swc/core-linux-arm64-gnu": "1.5.7", + "@swc/core-linux-arm64-musl": "1.5.7", + "@swc/core-linux-x64-gnu": "1.5.7", + "@swc/core-linux-x64-musl": "1.5.7", + "@swc/core-win32-arm64-msvc": "1.5.7", + "@swc/core-win32-ia32-msvc": "1.5.7", + "@swc/core-win32-x64-msvc": "1.5.7" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.7.tgz", + "integrity": "sha512-bZLVHPTpH3h6yhwVl395k0Mtx8v6CGhq5r4KQdAoPbADU974Mauz1b6ViHAJ74O0IVE5vyy7tD3OpkQxL/vMDQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.7.tgz", + "integrity": "sha512-RpUyu2GsviwTc2qVajPL0l8nf2vKj5wzO3WkLSHAHEJbiUZk83NJrZd1RVbEknIMO7+Uyjh54hEh8R26jSByaw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.7.tgz", + "integrity": "sha512-cTZWTnCXLABOuvWiv6nQQM0hP6ZWEkzdgDvztgHI/+u/MvtzJBN5lBQ2lue/9sSFYLMqzqff5EHKlFtrJCA9dQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.7.tgz", + "integrity": "sha512-hoeTJFBiE/IJP30Be7djWF8Q5KVgkbDtjySmvYLg9P94bHg9TJPSQoC72tXx/oXOgXvElDe/GMybru0UxhKx4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.7.tgz", + "integrity": "sha512-+NDhK+IFTiVK1/o7EXdCeF2hEzCiaRSrb9zD7X2Z7inwWlxAntcSuzZW7Y6BRqGQH89KA91qYgwbnjgTQ22PiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.7.tgz", + "integrity": "sha512-25GXpJmeFxKB+7pbY7YQLhWWjkYlR+kHz5I3j9WRl3Lp4v4UD67OGXwPe+DIcHqcouA1fhLhsgHJWtsaNOMBNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.7.tgz", + "integrity": "sha512-0VN9Y5EAPBESmSPPsCJzplZHV26akC0sIgd3Hc/7S/1GkSMoeuVL+V9vt+F/cCuzr4VidzSkqftdP3qEIsXSpg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.7.tgz", + "integrity": "sha512-RtoNnstBwy5VloNCvmvYNApkTmuCe4sNcoYWpmY7C1+bPR+6SOo8im1G6/FpNem8AR5fcZCmXHWQ+EUmRWJyuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.7.tgz", + "integrity": "sha512-Xm0TfvcmmspvQg1s4+USL3x8D+YPAfX2JHygvxAnCJ0EHun8cm2zvfNBcsTlnwYb0ybFWXXY129aq1wgFC9TpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.7.tgz", + "integrity": "sha512-tp43WfJLCsKLQKBmjmY/0vv1slVywR5Q4qKjF5OIY8QijaEW7/8VwPyUyVoJZEnDgv9jKtUTG5PzqtIYPZGnyg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core/node_modules/@swc/types": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.7.tgz", + "integrity": "sha512-scHWahbHF0eyj3JsxG9CFJgFdFNaVQCNAimBlT6PzS3n/HptxqREjsm4OH6AN3lYcffZYSPxXW8ua2BEHp0lJQ==", + "dev": true, + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "node_modules/@swc/helpers": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.12.tgz", + "integrity": "sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@swc/types": { + "version": "0.1.23", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.23.tgz", + "integrity": "sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==", + "dev": true, + "peer": true, + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.19.0.tgz", + "integrity": "sha512-Unz/WHmd4pGax91rdIKWi51wnVUW11QttMEPpBiBgIewnc9UQIX7UDLxr5vRlqeByXCwhkF6VabSsI0raWcyAQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.12", + "minimatch": "^7.4.3", + "mkdirp": "^2.1.6", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@ts-morph/common/node_modules/mkdirp": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", + "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "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": "5.0.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.5.tgz", + "integrity": "sha512-GLZPrd9ckqEBFMcVM/qRFAP0Hg3qiVEojgEFsx/N/zKXsBzbGF6z5FBDpZ0+Xhp1xr+qRZYjfGr1cWHB9oFHSA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/feather-icons": { + "version": "4.29.4", + "resolved": "https://registry.npmjs.org/@types/feather-icons/-/feather-icons-4.29.4.tgz", + "integrity": "sha512-cvwI455PWx/gJ33XDTIZOdauRy+XCxZggkOT/tAQYZLdySPFATD4RnDC9mxOnCIEaK9kwPm3zZigkAsMkhXb5w==", + "dev": true + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz", + "integrity": "sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==", + "devOptional": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true + }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz", + "integrity": "sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.21.0", + "@typescript-eslint/utils": "8.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", + "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", + "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", + "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.21.0", + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/typescript-estree": "8.21.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", + "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/ts-api-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", + "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", + "dev": true, + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", + "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "dev": true + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", + "dev": true, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz", + "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.4", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.4", + "istanbul-reports": "^3.1.6", + "magic-string": "^0.30.5", + "magicast": "^0.3.3", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "test-exclude": "^6.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.6.0" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vitest/expect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", + "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", + "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", + "dev": true, + "dependencies": { + "@vitest/utils": "1.6.0", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", + "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", + "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", + "dev": true, + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/ui": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.6.0.tgz", + "integrity": "sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==", + "dev": true, + "dependencies": { + "@vitest/utils": "1.6.0", + "fast-glob": "^3.3.2", + "fflate": "^0.8.1", + "flatted": "^3.2.9", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.6.0" + } + }, + "node_modules/@vitest/utils": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz", + "integrity": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==", + "dev": true, + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", + "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true + }, + "node_modules/abbrev": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", + "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "deprecated": "package has been renamed to acorn-import-attributes", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "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.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "dev": true, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "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.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "dev": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-const-enum": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-const-enum/-/babel-plugin-const-enum-1.2.0.tgz", + "integrity": "sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-typescript": "^7.3.3", + "@babel/traverse": "^7.16.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "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-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "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/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-macros/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-typescript-metadata": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.2.tgz", + "integrity": "sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "optional": true + }, + "node_modules/bare-fs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.0.1.tgz", + "integrity": "sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^3.0.0", + "bare-stream": "^2.0.0" + }, + "engines": { + "bare": ">=1.7.0" + } + }, + "node_modules/bare-os": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.4.0.tgz", + "integrity": "sha512-9Ous7UlnKbe3fMi7Y+qh0DwAup6A1JkYgPnjvMDNOlmnxNRQvQ/7Nst+OnUQKzk0iAT0m9BisbDVp9gCv8+ETA==", + "optional": true, + "engines": { + "bare": ">=1.6.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.4.tgz", + "integrity": "sha512-G6i3A74FjNq4nVrrSTUz5h3vgXzBJnjmWAVlBWaZETkgu+LgKd7AiyOml3EDJY1AHlIbBHKDXE+TUT53Ff8OaA==", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/beasties": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz", + "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==", + "dev": true, + "dependencies": { + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^9.1.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "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.13.0", + "raw-body": "2.5.2", + "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/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "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.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "dev": true, + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "dev": true, + "dependencies": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "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/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001695", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", + "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", + "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" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": 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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chromium-bidi": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.3.tgz", + "integrity": "sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==", + "dependencies": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/chromium-bidi/node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "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/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/code-block-writer": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz", + "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==", + "dev": true + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/columnify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", + "dev": true, + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", + "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "dependencies": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-commits-parser/node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/cookies": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", + "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", + "dev": true, + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", + "dev": true, + "dependencies": { + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.1", + "globby": "^14.0.0", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz", + "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.24.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "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": "5.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.1.0.tgz", + "integrity": "sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA==", + "dev": true, + "dependencies": { + "jiti": "^1.21.6" + }, + "engines": { + "node": ">=v16" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=8.2", + "typescript": ">=4" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cron-parser": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", + "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", + "dev": true, + "dependencies": { + "luxon": "^3.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "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/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "dev": true, + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", + "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", + "dev": true, + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/data-urls": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", + "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "dev": true, + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1312386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", + "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==" + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "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/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "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/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.86", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.86.tgz", + "integrity": "sha512-/D7GAAaCRBQFBBcop6SfAAGH37djtpWkOuYhyAajw0l5vsfeSsUQYxaFPwr1c/mC/flARCDdKFo5gpFqNI+18w==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", + "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.24.2.tgz", + "integrity": "sha512-03/7Z1gD+ohDnScFztvI4XddTAbKVmMEzCvvkBpQdWKEXJ+73dTyeNrmdxP1Q0zpDMFjzUJwtK4rLjqwiHbzkw==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@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": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-deprecation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-deprecation/-/eslint-plugin-deprecation-2.0.0.tgz", + "integrity": "sha512-OAm9Ohzbj11/ZFyICyR5N6LbOIvQMp7ZU2zI7Ej0jIc8kiGUERXPNMfw2QqqHD1ZHtjMub3yPZILovYEYucgoQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^6.0.0", + "tslib": "^2.3.1", + "tsutils": "^3.21.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "typescript": "^4.2.4 || ^5.0.0" + } + }, + "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-deprecation/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-deprecation/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "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/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "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/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "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", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, + "node_modules/fastq": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/feather-icons": { + "version": "4.29.2", + "resolved": "https://registry.npmjs.org/feather-icons/-/feather-icons-4.29.2.tgz", + "integrity": "sha512-0TaCFTnBTVCz6U+baY2UJNKne5ifGh7sMG4ZC2LoBWCZdIyPa+y6UiR4lEYGws1JOFWdee8KAsAIvu0VcXqiqA==", + "dependencies": { + "classnames": "^2.2.5", + "core-js": "^3.1.3" + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "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", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-file-up": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-2.0.1.tgz", + "integrity": "sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ==", + "dev": true, + "dependencies": { + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-2.0.0.tgz", + "integrity": "sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ==", + "dev": true, + "dependencies": { + "find-file-up": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "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.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", + "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "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" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "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/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "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/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "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", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "dev": true, + "dependencies": { + "js-yaml": "^3.13.1" + } + }, + "node_modules/front-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/front-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/front-matter/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/get-uri": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", + "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "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-raw-commits/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "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/git-raw-commits/node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/git-raw-commits/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-raw-commits/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "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/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "15.14.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", + "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "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.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/happy-dom": { + "version": "13.10.1", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-13.10.1.tgz", + "integrity": "sha512-9GZLEFvQL5EgfJX2zcBgu1nsPUn98JF/EiJnSfQbdxI6YEQGqpd09lXXxOmYonRBIEFz9JlGCOiPflDzgS1p8w==", + "dev": true, + "dependencies": { + "entities": "^4.5.0", + "webidl-conversions": "^7.0.0", + "whatwg-mimetype": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz", + "integrity": "sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", + "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "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/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "dev": true, + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-assert/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "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.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", + "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz", + "integrity": "sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "dev": true, + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dev": true, + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", + "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "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", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "dependencies": { + "text-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-rslog": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/isomorphic-rslog/-/isomorphic-rslog-0.0.7.tgz", + "integrity": "sha512-n6/XnKnZ5eLEj6VllG4XmamXG7/F69nls8dcynHyhcTpsPUYgcgx4ifEaCo4lQJ2uzwfmIT+F0KBGwBcMKmt5g==", + "dev": true, + "engines": { + "node": ">=14.17.6" + } + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "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/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/jest-circus/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "optional": true, + "peer": true, + "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/jest-circus/node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/jest-circus/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": 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-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "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-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "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-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "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-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "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/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "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/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "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.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, + "node_modules/jsdom": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", + "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", + "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==", + "dev": true, + "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.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dev": true, + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/koa": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", + "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", + "dev": true, + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.9.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", + "dev": true + }, + "node_modules/koa-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "koa-compose": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/koa/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/koa/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true + }, + "node_modules/launch-editor": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/less": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.1.tgz", + "integrity": "sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg==", + "dev": true, + "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": "12.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", + "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", + "dev": true, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/listr2": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", + "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", + "dev": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lmdb": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.2.tgz", + "integrity": "sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "msgpackr": "^1.11.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.5.3", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.2.2", + "@lmdb/lmdb-darwin-x64": "3.2.2", + "@lmdb/lmdb-linux-arm": "3.2.2", + "@lmdb/lmdb-linux-arm64": "3.2.2", + "@lmdb/lmdb-linux-x64": "3.2.2", + "@lmdb/lmdb-win32-x64": "3.2.2" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/local-pkg": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", + "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", + "dev": true, + "dependencies": { + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.clonedeepwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", + "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "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/long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "node_modules/luxon": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", + "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/magic-string": { + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "dev": true, + "dependencies": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/make-fetch-happen/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", + "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "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", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.0.tgz", + "integrity": "sha512-2v6aXUXwLP1Epd/gc32HAMIWoczx+fZwEPRHm/VwtrJzRGwR1qGZXEYV3Zp8ZjjbwaZhMrM6uHV4KVkk+XCc2w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minizlib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/minizlib/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/minizlib/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minizlib/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minizlib/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mlly": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "dev": true, + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", + "ufo": "^1.5.4" + } + }, + "node_modules/mlly/node_modules/pathe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", + "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "dev": true + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/msgpackr": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz", + "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==", + "dev": true, + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "optional": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "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/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz", + "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "tar": "^7.4.3", + "which": "^5.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/node-gyp/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/node-gyp/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true + }, + "node_modules/node-schedule": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz", + "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==", + "dev": true, + "dependencies": { + "cron-parser": "^4.2.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "dev": true, + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "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-package-data/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", + "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-install-checks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz", + "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", + "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-package-arg": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz", + "integrity": "sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==", + "dev": true, + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-packlist": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-9.0.0.tgz", + "integrity": "sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==", + "dev": true, + "dependencies": { + "ignore-walk": "^7.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", + "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", + "dev": true, + "dependencies": { + "npm-install-checks": "^7.1.0", + "npm-normalize-package-bin": "^4.0.0", + "npm-package-arg": "^12.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", + "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", + "dev": true, + "dependencies": { + "@npmcli/redact": "^3.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^14.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^12.0.0", + "proc-log": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", + "dev": true + }, + "node_modules/nx": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/nx/-/nx-20.3.2.tgz", + "integrity": "sha512-VWUHX0uCn8ACFbpBTpgucDzwe4q/a/UU3AYOhzKCvTzb3kQiyvoxLjORSze93ZNEqgor0PMkCQgcoMBUjxJfzQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.7.4", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "resolve.exports": "2.0.3", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yaml": "^2.6.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "20.3.2", + "@nx/nx-darwin-x64": "20.3.2", + "@nx/nx-freebsd-x64": "20.3.2", + "@nx/nx-linux-arm-gnueabihf": "20.3.2", + "@nx/nx-linux-arm64-gnu": "20.3.2", + "@nx/nx-linux-arm64-musl": "20.3.2", + "@nx/nx-linux-x64-gnu": "20.3.2", + "@nx/nx-linux-x64-musl": "20.3.2", + "@nx/nx-win32-arm64-msvc": "20.3.2", + "@nx/nx-win32-x64-msvc": "20.3.2" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/nx/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/nx/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/nx/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nx/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "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/nx/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/nx/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-to-es": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz", + "integrity": "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==", + "dev": true, + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^5.1.1", + "regex-recursion": "^5.1.1" + } + }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", + "dev": true + }, + "node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "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/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/ordered-binary": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", + "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==", + "dev": true, + "optional": true + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz", + "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "node_modules/pacote": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-20.0.0.tgz", + "integrity": "sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==", + "dev": true, + "dependencies": { + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^9.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^3.0.0", + "ssri": "^12.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "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/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/parse-json/node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "dev": true, + "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-html-rewriting-stream/node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dev": true, + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser/node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/piscina": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", + "dev": true, + "optionalDependencies": { + "@napi-rs/nice": "^1.0.1" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/pkg-types/node_modules/pathe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", + "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "dev": true + }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "dev": true, + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "dev": true, + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": 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", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "22.15.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.15.0.tgz", + "integrity": "sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q==", + "hasInstallScript": true, + "dependencies": { + "@puppeteer/browsers": "2.3.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1312386", + "puppeteer-core": "22.15.0" + }, + "bin": { + "puppeteer": "lib/esm/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "22.15.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.15.0.tgz", + "integrity": "sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==", + "dependencies": { + "@puppeteer/browsers": "2.3.0", + "chromium-bidi": "0.6.3", + "debug": "^4.3.6", + "devtools-protocol": "0.0.1312386", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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" + } + ] + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rambda": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.4.2.tgz", + "integrity": "sha512-++euMfxnl7OgaEKwXh9QqThOjMeta2HH001N1v4mYQzBjJBnmXBh2BCK6dZAbICFVXOFUVD3xFG0R3ZPU0mxXw==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "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/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dev": true, + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dev": true, + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "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": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "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/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", + "dev": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz", + "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==", + "dev": true, + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", + "dev": true + }, + "node_modules/regex-recursion": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz", + "integrity": "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==", + "dev": true, + "dependencies": { + "regex": "^5.1.1", + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz", + "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==", + "dev": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-loader": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.4.tgz", + "integrity": "sha512-LavLbgbBGUt3wCiYzhuLLu65+fWXaXLmq7YxivLhEqmiupCFZ5sKUAipK3do6V80YSU0jvSxNhEdT13IXNr3rg==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dev": true, + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ses": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/ses/-/ses-1.13.1.tgz", + "integrity": "sha512-S3bHoi+rAdeWIF1+kDHzhSnAjEUV3iVDjiBybTuZtjsjtKeJmkrWfD0S+h4Dj14bg4qTGYhjw14iaV3RwIhRGA==", + "dependencies": { + "@endo/env-options": "^1.1.10", + "@endo/immutable-arraybuffer": "^1.1.1" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shiki": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.29.1.tgz", + "integrity": "sha512-TghWKV9pJTd/N+IgAIVJtr0qZkB7FfFCUrrEJc0aRmZupo3D1OCVRknQWVRVA7AX/M0Ld7QfoAruPzr3CnUJuw==", + "dev": true, + "dependencies": { + "@shikijs/core": "1.29.1", + "@shikijs/engine-javascript": "1.29.1", + "@shikijs/engine-oniguruma": "1.29.1", + "@shikijs/langs": "1.29.1", + "@shikijs/themes": "1.29.1", + "@shikijs/types": "1.29.1", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", + "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^3.0.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^3.0.0", + "@sigstore/tuf": "^3.0.0", + "@sigstore/verify": "^2.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/sorted-array-functions": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", + "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", + "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "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/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + }, + "node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/streamx": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.1.tgz", + "integrity": "sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==", + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", + "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", + "dev": true, + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/stylus": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.64.0.tgz", + "integrity": "sha512-ZIdT8eUv8tegmqy1tTIdJv9We2DumkNZFdCF5mz/Kpq3OcTaxSuCAYZge6HKK2CmNC02G1eJig2RV7XTw5hQrA==", + "dev": true, + "dependencies": { + "@adobe/css-tools": "~4.3.3", + "debug": "^4.3.2", + "glob": "^10.4.5", + "sax": "~1.4.1", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://opencollective.com/stylus" + } + }, + "node_modules/stylus-loader": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.1.3.tgz", + "integrity": "sha512-TY0SKwiY7D2kMd3UxaWKSf3xHF0FFN/FAfsSqfrhxRT/koXTwffq2cgEWDkLQz7VojMu7qEEHt5TlMjkPx9UDw==", + "dev": true, + "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/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/stylus/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/stylus/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "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/swc-loader": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.1.15.tgz", + "integrity": "sha512-cn1WPIeQJvXM4bbo3OwdEIapsQ4uUGOfyFj0h2+2+brT0k76DCGnZXDE2KmcqTd2JSQ+b61z2NPMib7eEwMYYw==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0" + }, + "peerDependencies": { + "@swc/core": "^1.2.52", + "webpack": ">=2" + } + }, + "node_modules/swc-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "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": "3.0.8", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", + "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-fs/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/terser": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "dev": true, + "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-webpack-plugin": { + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "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/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "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/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dev": true, + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-loader": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", + "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-morph": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-18.0.0.tgz", + "integrity": "sha512-Kg5u0mk19PIIe4islUI/HWRvm9bC1lHejK4S0oh1zaZ77TMZAEmQC0sHQYiu2RgCQFZKXz1fMVi/7nOOeirznA==", + "dev": true, + "dependencies": { + "@ts-morph/common": "~0.19.0", + "code-block-writer": "^12.0.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "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/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "dev": true, + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "dev": true, + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/tuf-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz", + "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==", + "dev": true, + "dependencies": { + "@tufjs/models": "3.0.1", + "debug": "^4.3.6", + "make-fetch-happen": "^14.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "node_modules/typedoc": { + "version": "0.26.11", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.11.tgz", + "integrity": "sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==", + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.16.2", + "yaml": "^2.5.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x" + } + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true + }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "dev": true + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "devOptional": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "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.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dev": true, + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "dev": true, + "dependencies": { + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "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": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", + "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", + "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", + "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-plugin-checker": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.6.4.tgz", + "integrity": "sha512-2zKHH5oxr+ye43nReRbC2fny1nyARwhxdm0uNYp/ERy4YvU9iZpNOsueoi/luXw5gnpqRSvjcEPxXbS153O2wA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "ansi-escapes": "^4.3.0", + "chalk": "^4.1.1", + "chokidar": "^3.5.1", + "commander": "^8.0.0", + "fast-glob": "^3.2.7", + "fs-extra": "^11.1.0", + "npm-run-path": "^4.0.1", + "semver": "^7.5.0", + "strip-ansi": "^6.0.0", + "tiny-invariant": "^1.1.0", + "vscode-languageclient": "^7.0.0", + "vscode-languageserver": "^7.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-uri": "^3.0.2" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "eslint": ">=7", + "meow": "^9.0.0", + "optionator": "^0.9.1", + "stylelint": ">=13", + "typescript": "*", + "vite": ">=2.0.0", + "vls": "*", + "vti": "*", + "vue-tsc": ">=1.3.9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vls": { + "optional": true + }, + "vti": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "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" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vite-plugin-checker/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/vite-plugin-checker/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/vite-plugin-checker/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite-plugin-checker/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/vite-plugin-dts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-2.3.0.tgz", + "integrity": "sha512-WbJgGtsStgQhdm3EosYmIdTGbag5YQpZ3HXWUAPCDyoXI5qN6EY0V7NXq0lAmnv9hVQsvh0htbYcg0Or5Db9JQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.21.4", + "@microsoft/api-extractor": "^7.34.4", + "@rollup/pluginutils": "^5.0.2", + "@rushstack/node-core-library": "^3.55.2", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "fs-extra": "^10.1.0", + "kolorist": "^1.7.0", + "magic-string": "^0.29.0", + "ts-morph": "18.0.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": ">=2.9.0" + } + }, + "node_modules/vite-plugin-dts/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-dts/node_modules/magic-string": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", + "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-static-copy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-3.1.0.tgz", + "integrity": "sha512-ONFBaYoN1qIiCxMCfeHI96lqLza7ujx/QClIXp4kEULUbyH2qLgYoaL8JHhk3FWjSB4TpzoaN3iMCyCFldyXzw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.3", + "fs-extra": "^11.3.0", + "p-map": "^7.0.3", + "picocolors": "^1.1.1", + "tinyglobby": "^0.2.14" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "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" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", + "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", + "dev": true, + "dependencies": { + "@vitest/expect": "1.6.0", + "@vitest/runner": "1.6.0", + "@vitest/snapshot": "1.6.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.3", + "vite": "^5.0.0", + "vite-node": "1.6.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.6.0", + "@vitest/ui": "1.6.0", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "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/vitest/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/vitest/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "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/vitest/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "dev": true, + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" + }, + "engines": { + "vscode": "^1.52.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", + "dev": true, + "dependencies": { + "vscode-languageserver-protocol": "3.16.0" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "dev": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", + "dev": true + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "optional": true + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack": { + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "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.11", + "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.10", + "watchpack": "^2.4.1", + "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": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/memfs": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz", + "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==", + "dev": true, + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.0.tgz", + "integrity": "sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.21.2", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.7", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "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" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "dev": true, + "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/webpack-dev-server/node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-server/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "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/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", + "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "dev": true, + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "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/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "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-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/ylru": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", + "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" + } + }, + "node_modules/z-schema/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/zod": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", + "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zone.js": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz", + "integrity": "sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==" + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/plugins/package.json b/plugins/package.json new file mode 100644 index 0000000000..4399a9ab68 --- /dev/null +++ b/plugins/package.json @@ -0,0 +1,115 @@ +{ + "name": "penpot-plugins", + "version": "0.6.0", + "type": "module", + "license": "MIT", + "scripts": { + "start": "npm run start:app:runtime", + "start:app:runtime": "concurrently --kill-others --names build,server \"npx nx run plugins-runtime:build --watch --mode development\" \"npx nx run plugins-runtime:preview\"", + "start:app:styles-example": "npx nx run example-styles:serve --host 0.0.0.0 --port 4201", + "start:plugin:all": "concurrently --kill-others \"npm:start:plugin:*(!all)\"", + "start:plugin:poc-state": "npx nx run poc-state-plugin:init", + "start:plugin:contrast": "npx nx run contrast-plugin:init", + "start:plugin:icons": "npx nx run icons-plugin:init", + "start:plugin:loremipsum": "npx nx run lorem-ipsum-plugin:init", + "start:plugin:palette": "npx nx run create-palette-plugin:build --watch & npx nx run create-palette-plugin:preview", + "start:plugin:table": "npx nx run table-plugin:init", + "start:plugin:renamelayers": "npx nx run rename-layers-plugin:init", + "start:plugin:colors-to-tokens": "npx nx run colors-to-tokens-plugin:init", + "build": "npx nx build plugins-runtime --emptyOutDir=true", + "build:plugins": "npx nx run-many -t build --parallel -p tag:type:plugin --exclude=poc-state-plugin", + "build:styles-example": "npx nx run example-styles:build", + "lint": "nx run-many --all --target=lint --parallel", + "format": "npx nx format:write --libs-and-apps", + "format:check": "npx nx format:check --libs-and-apps", + "lint:affected": "npx nx affected --target=lint", + "test": "nx run-many -t test --parallel -p plugins-runtime lorem-ipsum-plugin colors-to-tokens-plugin", + "test:e2e": "npx nx test e2e", + "registry": "nx local-registry", + "prepare": "husky", + "create:api-docs": "npx typedoc --tsconfig libs/plugins-runtime/tsconfig.lib.json --customCss ./tools/typedoc.css", + "release": "npx tsx ./tools/scripts/publish.ts" + }, + "private": true, + "devDependencies": { + "@angular-devkit/build-angular": "19.1.4", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.0.7", + "@angular-eslint/eslint-plugin": "19.0.2", + "@angular-eslint/eslint-plugin-template": "19.0.2", + "@angular-eslint/template-parser": "19.0.2", + "@angular/cli": "~19.0.0", + "@angular/compiler-cli": "19.1.3", + "@angular/language-service": "19.1.3", + "@commitlint/cli": "^18.6.0", + "@commitlint/config-conventional": "^18.6.0", + "@eslint/eslintrc": "^2.1.1", + "@nx/angular": "20.3.2", + "@nx/esbuild": "20.3.2", + "@nx/eslint": "20.3.2", + "@nx/eslint-plugin": "20.3.2", + "@nx/js": "20.3.2", + "@nx/node": "20.3.2", + "@nx/vite": "20.3.2", + "@nx/web": "20.3.2", + "@schematics/angular": "19.0.7", + "@swc-node/register": "1.9.2", + "@swc/core": "1.5.7", + "@swc/helpers": "0.5.12", + "@types/feather-icons": "^4.29.4", + "@types/node": "20.11.16", + "@types/uuid": "^9.0.8", + "@typescript-eslint/eslint-plugin": "7.18.0", + "@typescript-eslint/parser": "7.18.0", + "@typescript-eslint/utils": "^7.16.0", + "@vitest/coverage-v8": "1.6.0", + "@vitest/ui": "1.6.0", + "concurrently": "^8.2.2", + "esbuild": "^0.19.2", + "eslint": "8.57.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-deprecation": "^2.0.0", + "fs-extra": "^11.2.0", + "globals": "^15.1.0", + "happy-dom": "^13.6.2", + "husky": "^9.0.10", + "jsdom": "~22.1.0", + "jsonc-eslint-parser": "^2.1.0", + "nx": "20.3.2", + "prettier": "^3.4.2", + "swc-loader": "0.1.15", + "tsx": "^4.16.2", + "typedoc": "^0.26.5", + "typescript": "5.6.3", + "vite": "^5.0.0", + "vite-plugin-checker": "^0.6.4", + "vite-plugin-dts": "~2.3.0", + "vite-plugin-static-copy": "^3.1.0", + "vitest": "1.6.0" + }, + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@angular/animations": "19.1.3", + "@angular/common": "19.1.3", + "@angular/compiler": "19.1.3", + "@angular/core": "19.1.3", + "@angular/forms": "19.1.3", + "@angular/platform-browser": "19.1.3", + "@angular/platform-browser-dynamic": "19.1.3", + "@angular/router": "19.1.3", + "axios": "^1.6.0", + "feather-icons": "^4.29.2", + "puppeteer": "^22.11.0", + "rxjs": "~7.8.0", + "ses": "^1.13.1", + "tslib": "^2.3.0", + "uuid": "^9.0.1", + "zod": "^3.22.4", + "zone.js": "0.15.0" + }, + "nx": { + "includedScripts": [] + } +} diff --git a/plugins/project.json b/plugins/project.json new file mode 100644 index 0000000000..4839ea4841 --- /dev/null +++ b/plugins/project.json @@ -0,0 +1,5 @@ +{ + "name": "penpot-plugins", + "$schema": "node_modules/nx/schemas/project-schema.json", + "targets": {} +} diff --git a/plugins/tools/eslint.config.js b/plugins/tools/eslint.config.js new file mode 100644 index 0000000000..f2b4e6e5b4 --- /dev/null +++ b/plugins/tools/eslint.config.js @@ -0,0 +1,21 @@ +import baseConfig from '../../eslint.config.js'; +import jsoncParser from 'jsonc-eslint-parser'; +import globals from 'globals'; + +export default [ + ...baseConfig, + { + files: ['**/*.ts'], + rules: {}, + languageOptions: { + parserOptions: { + project: './tsconfig.*?.json', + tsconfigRootDir: import.meta.dirname, + }, + globals: { + ...globals.node, + PluginConfig: 'readonly', + }, + }, + }, +]; diff --git a/plugins/tools/plugins/plugin-tasks.ts b/plugins/tools/plugins/plugin-tasks.ts new file mode 100644 index 0000000000..d5e2a3e311 --- /dev/null +++ b/plugins/tools/plugins/plugin-tasks.ts @@ -0,0 +1,56 @@ +import { CreateNodesV2, readJsonFile, logger } from '@nx/devkit'; +import { createNodesFromFiles } from '@nx/devkit'; +import { dirname } from 'path'; + +export const createNodesV2: CreateNodesV2 = [ + '**/project.json', + async (configFiles, options, context) => { + return await createNodesFromFiles( + (configFile) => { + const projectConfiguration = readJsonFile(configFile); + + if ( + !projectConfiguration.tags || + !projectConfiguration?.tags.includes('type:plugin') || + !projectConfiguration?.targets.build + ) { + return {}; + } + + const projectRoot = dirname(configFile); + + return { + projects: { + [projectRoot]: { + root: projectRoot, + targets: { + init: { + executor: 'nx:run-commands', + options: { + command: `nx run-many --parallel --targets=buildPlugin,serve --projects=${projectConfiguration.name} --watch`, + }, + }, + buildPlugin: { + executor: '@nx/esbuild:esbuild', + outputs: ['{options.outputPath}'], + options: { + minify: true, + outputPath: `${projectConfiguration.sourceRoot}/assets/`, + main: `${projectConfiguration.sourceRoot}/plugin.ts`, + tsConfig: `${projectRoot}/tsconfig.plugin.json`, + generatePackageJson: false, + format: ['esm'], + deleteOutputPath: false, + }, + }, + }, + }, + }, + }; + }, + configFiles, + options, + context, + ); + }, +]; diff --git a/plugins/tools/scripts/build-css.mjs b/plugins/tools/scripts/build-css.mjs new file mode 100644 index 0000000000..36434e482b --- /dev/null +++ b/plugins/tools/scripts/build-css.mjs @@ -0,0 +1,26 @@ +import esbuild from 'esbuild'; +import { copy } from 'fs-extra'; + +const source = 'libs/plugins-styles'; +const dist = 'dist/plugins-styles'; + +const handleErr = (err) => { + console.error(err); + process.exit(1); +}; + +esbuild + .build({ + entryPoints: [`${source}/src/lib/styles.css`], + bundle: true, + outfile: `${dist}/styles.css`, + minify: true, + loader: { + '.svg': 'dataurl', + }, + }) + .catch(handleErr); + +copy(`${source}/package.json`, `${dist}/package.json`).catch(handleErr); +copy(`${source}/README.md`, `${dist}/README.md`).catch(handleErr); +copy(`LICENSE`, `${dist}/LICENSE`).catch(handleErr); diff --git a/plugins/tools/scripts/build-types.mjs b/plugins/tools/scripts/build-types.mjs new file mode 100644 index 0000000000..999852cca1 --- /dev/null +++ b/plugins/tools/scripts/build-types.mjs @@ -0,0 +1,14 @@ +import { copy } from 'fs-extra'; + +const source = 'libs/plugin-types'; +const dist = 'dist/plugin-types'; + +const handleErr = (err) => { + console.error(err); + process.exit(1); +}; + +copy(`${source}/package.json`, `${dist}/package.json`).catch(handleErr); +copy(`${source}/README.md`, `${dist}/README.md`).catch(handleErr); +copy(`${source}/index.d.ts`, `${dist}/index.d.ts`).catch(handleErr); +copy(`LICENSE`, `${dist}/LICENSE`).catch(handleErr); diff --git a/plugins/tools/scripts/publish.ts b/plugins/tools/scripts/publish.ts new file mode 100644 index 0000000000..7ea5970617 --- /dev/null +++ b/plugins/tools/scripts/publish.ts @@ -0,0 +1,92 @@ +import { execSync } from 'child_process'; +import { releaseChangelog, releasePublish, releaseVersion } from 'nx/release'; +import yargs from 'yargs'; +import { hideBin } from 'yargs/helpers'; + +const determineArgs = async () => { + return await yargs(hideBin(process.argv)) + .version(false) + .option('dryRun', { + alias: 'd', + description: + 'Whether or not to perform a dry-run of the release process, defaults to true', + type: 'boolean', + default: true, + }) + .option('verbose', { + description: + 'Whether or not to enable verbose logging, defaults to false', + type: 'boolean', + default: false, + }) + .option('version', { + description: + 'Explicit version specifier to use, if overriding conventional commits', + type: 'string', + default: undefined, + }) + .option('skip-publish', { + description: 'Skip publishing the package to the registry', + type: 'boolean', + default: false, + }) + .option('preid', { + description: 'The prerelease identifier to use', + type: 'string', + default: undefined, + }) + .option('latest', { + description: 'Publish the package with the latest tag', + type: 'boolean', + default: true, + }) + .option('first-release', { + description: 'Whether or not this is the first release', + type: 'boolean', + default: false, + }) + .parseAsync(); +}; + +(async () => { + const args = await determineArgs(); + + const result = await releaseVersion({ + dryRun: args.dryRun, + specifier: args.version, + gitCommit: false, + gitTag: false, + stageChanges: true, + verbose: args.verbose, + preid: args.preid, + }); + + execSync( + 'npx nx run-many -t build -p plugins-runtime plugins-styles plugin-types --parallel', + { + cwd: process.cwd(), + stdio: 'inherit', + }, + ); + + await releaseChangelog({ + dryRun: args.dryRun, + versionData: result.projectsVersionData, + version: result.workspaceVersion, + gitCommitMessage: `chore(release): publish ${result.workspaceVersion} [skip ci]`, + gitCommit: true, + gitTag: true, + verbose: args.verbose, + firstRelease: args.firstRelease, + }); + + if (!args.skipPublish) { + await releasePublish({ + dryRun: args.dryRun, + verbose: args.verbose, + tag: args.latest ? 'latest' : 'next', + }); + } + + process.exit(0); +})(); diff --git a/plugins/tools/tsconfig.json b/plugins/tools/tsconfig.json new file mode 100644 index 0000000000..ffbacc3f27 --- /dev/null +++ b/plugins/tools/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "module": "ESNext", + "lib": ["ESNext"], + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "types": ["node"] + }, + "files": [], + "include": ["**/*.ts"] +} diff --git a/plugins/tools/typedoc.css b/plugins/tools/typedoc.css new file mode 100644 index 0000000000..f631219e67 --- /dev/null +++ b/plugins/tools/typedoc.css @@ -0,0 +1,53 @@ +@import url('https://fonts.googleapis.com/css?family=Work+Sans:wght@400+500&display=swap'); + +:root { + /* Light */ + --light-color-background: #ffffff; + --light-color-background-secondary: #e8eaee; + --light-color-warning-text: #000000; + --light-color-background-warning: #fff4ed; + --light-color-icon-background: var(--light-color-background); + --light-color-accent: #e1d2f5; + --light-color-active-menu-item: var(--light-color-accent); + --light-color-text: var(--light-color-warning-text); + --light-color-text-aside: #495e74; + --light-color-link: #1345aa; + + /* highlight.css */ + --light-code-background: #f3f4f6; + + /* Dark */ + --dark-color-background: #18181a; + --dark-color-background-secondary: #000000; + --dark-color-background-warning: #fff4ed; + --dark-color-warning-text: #ffffff; + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-accent: #426158; + --dark-color-active-menu-item: #2e3434; + --dark-color-text: var(--dark-color-warning-text); + --dark-color-text-aside: #8f9da3; + --dark-color-link: #7efff5; + + /* highlight.css */ + --dark-code-background: #212426; +} + +@media (prefers-color-scheme: light) { + :root { + --code-background: var(--light-code-background); + } +} + +@media (prefers-color-scheme: dark) { + :root { + --code-background: var(--dark-code-background); + } +} + +html, +body, +p { + font-family: 'Work Sans', sans-serif; + font-optical-sizing: auto; + font-style: normal; +} diff --git a/plugins/tsconfig.base.json b/plugins/tsconfig.base.json new file mode 100644 index 0000000000..cdc4da80fe --- /dev/null +++ b/plugins/tsconfig.base.json @@ -0,0 +1,24 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "rootDir": ".", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "es2015", + "module": "esnext", + "lib": ["es2022", "dom"], + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "baseUrl": ".", + "paths": { + "@penpot/plugin-types": ["libs/plugin-types/index.d.ts"], + "plugins-runtime": ["libs/plugins-runtime/src/index.ts"], + "plugins-styles/*": ["libs/plugins-styles/src/*"] + } + }, + "exclude": ["node_modules", "tmp"] +} diff --git a/plugins/typedoc.json b/plugins/typedoc.json new file mode 100644 index 0000000000..6ec50b2df5 --- /dev/null +++ b/plugins/typedoc.json @@ -0,0 +1,7 @@ +{ + "name": "Penpot plugins API", + "out": "dist/apps/api-doc", + "entryPoints": ["libs/plugin-types/index.d.ts"], + "sort": "source-order", + "theme": "default" +} diff --git a/plugins/vitest.workspace.ts b/plugins/vitest.workspace.ts new file mode 100644 index 0000000000..3c983a2489 --- /dev/null +++ b/plugins/vitest.workspace.ts @@ -0,0 +1 @@ +export default ['**/*/vite.config.ts', '**/*/vitest.config.ts'];